Android平臺下的音視頻教程(1)
我會把我所有Android平臺下音視頻的相關經(jīng)驗都會毫無保留的分享出來 大家可以留言 咱們互相交流一下 畢竟新學習是無止境的嘛
我會從庫的編譯來寫起 除了ffmpeg 我還用過librtmp libyuv libfaac x264這些庫?
第一次就寫一下編譯ffmpeg吧?
用的是Linux虛擬機
首先是只有解碼的版本 編譯出來的庫比較小 只用作播放器
NDK_ROOT=/home/dfh/android-ndk-r14b
CPU=arm-linux-androideabi
TOOLCHAIN=$NDK_ROOT/toolchains/$CPU-4.9/prebuilt/linux-x86_64
FLAGS="-isystem?$NDK_ROOT/sysroot/usr/include/arm-linux-androideabi?-D__ANDROID_API__=21?-g?-DANDROID?-ffunction-sections?-funwind-tables?-fstack-protector-strong?-no-canonical-prefixes?-march=armv7-a?-mfloat-abi=softfp?-mfpu=vfpv3-d16?-mthumb?-Wa,--noexecstack?-Wformat?-Werror=format-security??-O0?-fPIC"
INCLUDES="?-isystem?$NDK_ROOT/sources/android/support/include"
PREFIX=./android/armeabi-v7a
./configure \
--prefix=$PREFIX \
--enable-small \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--disable-shared \
--enable-static \
--sysroot=$NDKROOT/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS $INCLUDES" \
--extra-cflags="-isysroot $NDKROOT/sysroot" \
--arch=arm \
--target-os=android?
make clean
make install
這個是生成的.a靜態(tài)庫 我本人比較喜歡用靜態(tài)庫?
也可以加上支持neon的配置
修改一下:
CFLAG="-I$PLATFORM/usr/include?-fPIC?-DANDROID?-mfpu=neon?-mfloat-abi=softfp?"
添加以下config
? ? --enable-asm?\
????--enable-neon?\
????--enable-jni?\
????--enable-mediacodec?\
????--enable-decoder=h264_mediacodec?\?
????--enable-hwaccel=h264_mediacmeodec
順便添加一下ffmpeg調(diào)用Android的mediacmeodec解碼
這個是注釋:
#--prefix : 安裝目錄
#--enable-small : 優(yōu)化大小
#--disable-programs : 不編譯ffmpeg程序(命令行工具),我們是需要獲得靜態(tài)(動態(tài))庫。
#--disable-avdevice : 關閉avdevice模塊,此模塊在android中無用
#--disable-encoders : 關閉所有編碼器 (播放不需要編碼)
#--disable-muxers :? 關閉所有復用器(封裝器),不需要生成mp4這樣的文件,所以關閉
#--disable-filters :關閉視頻濾鏡
#--enable-cross-compile : 開啟交叉編譯(ffmpeg比較**跨平臺**,并不是所有庫都有這么happy的選項 )
#--cross-prefix: 看右邊的值應該就知道是干嘛的,gcc的前綴 xxx/xxx/xxx-gcc 則給xxx/xxx/xxx-
#disable-shared enable-static 不寫也可以,默認就是這樣的。
#--sysroot:?編譯時指定了邏輯目錄
#--extra-cflags: 會傳給gcc的參數(shù)
#--arch --target-os : 不給不行
下面這個是我目前用的比較全的版本帶x264的
#!/bin/bash
NDK_ROOT=/home/dfh/android-ndk-r14b
CPU=arm-linux-androideabi
TOOLCHAIN=$NDK_ROOT/toolchains/$CPU-4.9/prebuilt/linux-x86_64
#從as的?externalNativeBuild/xxx/build.ninja
FLAGS="-isystem?$NDK_ROOT/sysroot/usr/include/arm-linux-androideabi?-D__ANDROID_API__=21?-g?-DANDROID?-ffunction-sections?-funwind-tables?-fstack-protector-strong?-no-canonical-prefixes?-march=armv7-a?-mfloat-abi=softfp?-mfpu=vfpv3-d16?-mthumb?-Wa,--noexecstack?-Wformat?-Werror=format-security??-O0?-fPIC"
INCLUDES="?-isystem?$NDK_ROOT/sources/android/support/include"
PREFIX=./android/armeabi-v7a
x264=/home/x264/armeabi-v7a
./configure?\
--prefix=$PREFIX?\
--enable-small?\
--disable-programs?\
--enable-cross-compile?\
--cross-prefix=$TOOLCHAIN/bin/$CPU-?\
--disable-shared?\
--enable-static?\
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm?\
--extra-cflags="$FLAGS?$INCLUDES"?\
--extra-cflags="-isysroot?$NDK_ROOT/sysroot/"?\
--arch=arm?\
--target-os=android \
--disable-doc?\
--disable-ffmpeg?\
--disable-ffplay?\
--disable-ffprobe?\
--disable-postproc?\
--disable-avdevice?\
--disable-symver?\
--disable-stripping?\
--disable-programs?\
--enable-encoder=aac?\
--enable-libx264?\
--enable-gpl?\
--extra-cflags=?"$FLAGS-I$x264/include"?\
--extra-ldflags??"-L$x264\lib"?\
#?清理一下?
make?clean
#執(zhí)行makefile
make?install
對了我用的ffmpeg版本是4.0.2的
x264的庫是編譯好的靜態(tài)庫 ffmpeg是支持外部庫的