日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

移植ffplay媒体播放器和sdl2到Android平台

發(fā)布時間:2023/12/14 Android 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 移植ffplay媒体播放器和sdl2到Android平台 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

前述博文《基于FFmpeg和Android的音視頻同步播放實現(xiàn)》中,我們按照自己的方法實現(xiàn)了一個簡單的媒體播放器,并做了音視頻同步。但是這個程序在播放更多碼流時,遇到了一些問題,包括視頻解碼問題,同步時視頻卡頓等。我們在博文《在ubuntu16.04下測試ffplay程序》中也測試過ffplay這個強大的播放器,而我們也知道SDL基于Android平臺也有支持,所以我們可以將ffplay和sdl移植到Android平臺上來。

主要工作

  • 編譯FFmpeg的Android平臺動態(tài)庫,以實現(xiàn)視頻解碼;
  • 編譯SDL2的Android平臺動態(tài)庫,以支持對視頻顯示和音頻播放的芯片支持;
  • 移植ffplay程序到Android平臺,以實現(xiàn)一個基本的媒體播放器;
    FFmpeg和ffplay都在native層實現(xiàn)或編譯,SDL2一部分在native層編譯,另一部分平臺依賴需要在java層實現(xiàn),當然,SDL2均提供了參考代碼。
  • 源代碼版本

    FFmpeg基于當前最新的4.0.1版本;
    SDL2基于當前最新的SDL2-2.0.8版本;
    ffplay也是基于FFmpeg4.0.1附帶的源碼;

    編譯libffmpeg.so

    FFmpeg庫的編譯基于android-ndk-r14b在Ubuntu下編譯,注意采用standalone_toolchain的編譯鏈,可以參考https://blog.csdn.net/ericbar/article/details/80229592 , ndk采用r14b而沒有采用最新的版本,因為從r15b版本開始,FFmpeg代碼中引用stderr等標準輸入輸出函數(shù)會找不到。
    config.sh和make.sh需要做些修改,分別參考如下,

    #!/bin/bash FFMPEG_SRC_PATH=$(cd `dirname $0`; pwd)SYSROOT=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r14/android-19/arm/sysroot LIBPATH=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r14/android-19/arm/sysroot/usr/lib TOOLCHAIN=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r14/android-19/armexport PATH=$TOOLCHAIN/bin:$PATH export CROSS_PREFIX=arm-linux-androideabi- export CC="${CROSS_PREFIX}gcc " export CXX=${CROSS_PREFIX}g++ export LD=${CROSS_PREFIX}ld export AR=${CROSS_PREFIX}ar export STRIP=${CROSS_PREFIX}stripLDFLAGS="-lm -lz -Wl,-soname=libffmpeg.so,-z,noexecstack"PREFIX=ffout ADDI_CFLAGS="-marm"echo " " echo "please wait..." echo " "#cd $FFMPEG_SRC_PATH rm ./$PREFIX -rf make cleanecho " " echo "preparing to configure..." echo " "./configure \--prefix=$PREFIX \--enable-shared \--disable-static \--disable-doc \--disable-ffmpeg \--disable-ffprobe \--disable-doc \--disable-symver \--disable-programs \--disable-w32threads \--disable-os2threads \--disable-sdl2 \--tempprefix=$FFMPEG_SRC_PATH \--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \--target-os=linux \--arch=arm \--enable-cross-compile \--sysroot=$SYSROOT \--extra-cflags="-Os -fpic $ADDI_CFLAGS" \--extra-ldflags="$ADDI_LDFLAGS" \$ADDITIONAL_CONFIGURE_FLAG# --sysinclude=$SYSROOT \

    下面make.sh里,需要把avdevice下的.o庫鏈接添加進來,

    #!/bin/bash FFMPEG_SRC_PATH=$(cd `dirname $0`; pwd)SYSROOT=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r14/android-19/arm/sysroot LIBPATH=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r14/android-19/arm/sysroot/usr/lib TOOLCHAIN=/home/ffmpeg/work/toolchain/android/linux-x86_64/ndk-r14/android-19/armexport TMPDIR=$FFMPEG_SRC_PATH export PATH=$TOOLCHAIN/bin:$PATH export CROSS_PREFIX=arm-linux-androideabi- export CC="$CCACHE ${CROSS_PREFIX}gcc " export CXX=${CROSS_PREFIX}g++ export LD=${CROSS_PREFIX}ld export AR=${CROSS_PREFIX}ar export STRIP=${CROSS_PREFIX}stripLDFLAGS="-lm -lz -Wl,-soname=libffmpeg.so,-z,noexecstack"CPU=arm PREFIX=ffout ADDI_CFLAGS="-marm"#make -j${NUMBER_OF_CORES} && make install || exit 1 make -j4 && make install || exit 1rm libavcodec/reverse.o libavcodec/log2_tab.o libavformat/log2_tab.o libavformat/golomb_tab.o \libswresample/log2_tab.o libavfilter/log2_tab.o libswscale/log2_tab.o libavdevice/reverse.o$CC -o $PREFIX/libffmpeg.so -shared $LDFLAGS $EXTRA_LDFLAGS --sysroot=$SYSROOT -L $LIBPATH \libavutil/*.o libavutil/arm/*.o libavcodec/*.o libavcodec/arm/*.o \libavformat/*.o libavfilter/*.o libswresample/*.o libswresample/arm/*.o \libswscale/*.o libswscale/arm/*.o compat/*.o libavdevice/*.ocp $PREFIX/libffmpeg.so $PREFIX/libffmpeg-debug.so ${STRIP} --strip-unneeded $PREFIX/libffmpeg.so

    編譯SDL2庫

    我們下載SDL2-2.0.8源碼后,解壓縮,直接進入SDL2-2.0.8目錄,首先需要設置NDK的環(huán)境變量,這里注意NDK不要采用類似FFmpeg編譯的standalone_toolchain方式,采用從Google官網(wǎng)下載的原始版本解壓縮即可,版本的話,使用android-ndk-r16b即可,參考下述命令即可啟動編譯,

    export ANDROID_NDK_HOME=/home/ffmpeg/work/android-ndk-r16b export PATH=$ANDROID_NDK_HOME:$PATH ndk-build -B NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk

    最后在SDL2-2.0.8\libs\armeabi-v7a下會生成libSDL2.so庫。

    移植ffplay

    ffplay程序基于eclipse來編譯,其中eclipse的ndk版本采用android-ndk-r13b;主要是一些頭文件依賴和編譯警告,需要做一些適當?shù)恼{(diào)整和修正。

    SDL2的java層適配

    SDL2的源碼里提供了相關(guān)參考,我們直接搬過來就行,代碼路徑位于,
    SDL2-2.0.8\android-project\app\src\main\java\org\libsdl\app
    當然,我們需要做一點修改,主要有如下幾點:
    1. SDLActivity.java中,主程序(main函數(shù))所在的so庫名是libfflay.so而不是libmain.so,這個是我在創(chuàng)建工程時選的so名字,所以要修改過來,大家可以根據(jù)自己實際名字修改。
    2. SDLActivity.java中,加載的so庫,由main修改成ffmpeg和ffplay;
    3. SDLActivity.java中,native層啟動的主程序名由SDL_main改成start,注意我們這里把ffplay源碼里的main函數(shù)改成了start函數(shù);

    GitHub源碼

    代碼修改部分比較瑣碎,這里不一一講述,媒體播放url在ffplay.c的input_filename全局變量初始化時直接賦值。

    請參考完整的源碼路徑:
    https://github.com/ericbars/ffplay

    總結(jié)

    以上是生活随笔為你收集整理的移植ffplay媒体播放器和sdl2到Android平台的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。