移植ffplay媒体播放器和sdl2到Android平台
前言
前述博文《基于FFmpeg和Android的音視頻同步播放實現》中,我們按照自己的方法實現了一個簡單的媒體播放器,并做了音視頻同步。但是這個程序在播放更多碼流時,遇到了一些問題,包括視頻解碼問題,同步時視頻卡頓等。我們在博文《在ubuntu16.04下測試ffplay程序》中也測試過ffplay這個強大的播放器,而我們也知道SDL基于Android平臺也有支持,所以我們可以將ffplay和sdl移植到Android平臺上來。
主要工作
FFmpeg和ffplay都在native層實現或編譯,SDL2一部分在native層編譯,另一部分平臺依賴需要在java層實現,當然,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等標準輸入輸出函數會找不到。
config.sh和make.sh需要做些修改,分別參考如下,
下面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的環境變量,這里注意NDK不要采用類似FFmpeg編譯的standalone_toolchain方式,采用從Google官網下載的原始版本解壓縮即可,版本的話,使用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;主要是一些頭文件依賴和編譯警告,需要做一些適當的調整和修正。
SDL2的java層適配
SDL2的源碼里提供了相關參考,我們直接搬過來就行,代碼路徑位于,
SDL2-2.0.8\android-project\app\src\main\java\org\libsdl\app
當然,我們需要做一點修改,主要有如下幾點:
1. SDLActivity.java中,主程序(main函數)所在的so庫名是libfflay.so而不是libmain.so,這個是我在創建工程時選的so名字,所以要修改過來,大家可以根據自己實際名字修改。
2. SDLActivity.java中,加載的so庫,由main修改成ffmpeg和ffplay;
3. SDLActivity.java中,native層啟動的主程序名由SDL_main改成start,注意我們這里把ffplay源碼里的main函數改成了start函數;
GitHub源碼
代碼修改部分比較瑣碎,這里不一一講述,媒體播放url在ffplay.c的input_filename全局變量初始化時直接賦值。
請參考完整的源碼路徑:
https://github.com/ericbars/ffplay
總結
以上是生活随笔為你收集整理的移植ffplay媒体播放器和sdl2到Android平台的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git——将github仓库克隆到本地
- 下一篇: c语言 截止频率6低通滤波器,用Veri