如何將ffmpeg移植到Android平臺

編譯帶h264編碼器的ffmepg庫在Android4.6平臺上運行,主要步驟如下:

1、下載ffmpeg源碼(我使用的2.7版本)

2、下載h264編碼器

3、編譯h264編碼器靜態庫(build_h264.sh)

export NDK=/home/juhaowangluo/ndk/android-ndk-r10d
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt
export PLATFORM=$NDK/platforms/android-19/arch-arm
export PREFIX=/home/juhaowangluo/LiuCongkuan/ffmpeg/Android_ndk/android-x264
./configure --prefix=$PREFIX --cross-prefix=/home/juhaowangluo/ndk/android-ndk-r10d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi- --sysroot=/home/juhaowangluo/ndk/android-ndk-r10d/platforms/android-19/arch-arm --enable-static --enable-pic --disable-asm --disable-cli --host=arm-linux

編譯成功後會在ffmpeg/Android_ndk/android-x264/lib目錄中出現一個libx264.a文件

4、編譯ffmpeg庫(build_ffmepg.sh)

     這一步問題最多,大家遇到了慢慢解決,我只把我遇到問題列一下。

     網上編譯腳本很多,但都很複雜,這個相對來說簡單點(我對make file腳本不熟)。

#!/bin/sh
NDK="/home/juhaowangluo/ndk/android-ndk-r10d"
PREBUILT="/home/juhaowangluo/ndk/android-ndk-r10d/toolchains/arm-linux-androideabi-4.6/prebuilt"
PLATFORM="/home/juhaowangluo/ndk/android-ndk-r10d/platforms/android-19/arch-arm"
PREFIX="/home/juhaowangluo/LiuCongkuan/ffmpeg/Android_ndk/android-x264"
build_one(){
./configure --target-os=linux --prefix=/home/juhaowangluo/LiuCongkuan/ffmpeg/Android_ndk/android-x264 \
--enable-cross-compile \
--enable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--cc=/home/juhaowangluo/ndk/android-ndk-r10d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc \
--cross-prefix=/home/juhaowangluo/ndk/android-ndk-r10d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi- \
--disable-stripping \
--nm=/home/juhaowangluo/ndk/android-ndk-r10d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-nm \
--sysroot=/home/juhaowangluo/ndk/android-ndk-r10d/platforms/android-19/arch-arm \
--enable-nonfree \
--enable-version3 \
--disable-everything \
--enable-gpl \
--disable-doc \
--enable-avresample \
--enable-demuxers \
--enable-muxers \
--disable-ffplay \
--disable-ffserver \
--disable-ffmpeg \
--disable-ffprobe \
--disable-devices \
--disable-avdevice \
--enable-encoders \
--enable-decoders \
--enable-libx264 \
--enable-encoder=libx264 \
--enable-decoder=h264 \
--enable-protocols \
--enable-hwaccels \
--enable-zlib \
--enable-decoder=flv \
--enable-encoder=flv \
--enable-decoder=rawvideo \
--enable-decoder=h263 \
--enable-parser=h263 \
--enable-demuxer=h263 \
--extra-cflags="-I/home/juhaowangluo/LiuCongkuan/ffmpeg/Android_ndk/android-x264/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" \
--extra-ldflags="-L/home/juhaowangluo/LiuCongkuan/ffmpeg/Android_ndk/android-x264/lib"
make -j4 install


/home/juhaowangluo/ndk/android-ndk-r10d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o

/home/juhaowangluo/ndk/android-ndk-r10d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld -rpath-link=${PLATFORM}/usr/lib -L${PLATFORM}/usr/lib -L${PREFIX}/lib  -soname libffmpeg.so -shared -nostdlib  -z noexecstack -Bsymbolic --whole-archive --no-undefined -o ${PREFIX}/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libavresample/libavresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a libswresample/libswresample.a -lc -lm -lz -ldl -llog -lx264 --dynamic-linker=/system/bin/linker ${PREBUILT}/linux-x86_64/lib/gcc/arm-linux-androideabi/4.6/libgcc.a
}

build_one

編譯成功後會在Android_ndk\android-x264下面生成一個libffmpeg.so文件,到此帶h264編碼的ffmepg庫編譯完成。


這次編譯過程遇到問題,這裏也列一下,整改過程中h264編譯很順暢,一次通過。主要說下ffmepg編碼的問題:

1、鏈接h264庫

--enable-libx264 \
--enable-encoder=libx264 \
--enable-decoder=h264 \


設置h264庫和h文件的路徑:

--extra-cflags="-I/home/juhaowangluo/LiuCongkuan/ffmpeg/Android_ndk/android-x264/include“

--extra-ldflags="-L/home/juhaowangluo/LiuCongkuan/ffmpeg/Android_ndk/android-x264/lib"

2、錯誤1: 報h263鏈接錯誤

解決方法,如下

--enable-decoder=rawvideo \
--enable-decoder=h263 \
--enable-parser=h263 \
--enable-demuxer=h263 \

3、錯誤2: h263編譯鏈接錯誤通過上面的方法解決後,又出現”opusdec.c  error: undefined reference to 'swr_is_initialized'“的類似鏈接錯誤

解決方法,如下

加入libswresample.a鏈接庫


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章