1.FFmpeg簡(jiǎn)介
??FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計(jì)算機(jī)程序。采用LGPL或GPL許可證。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進(jìn)的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質(zhì)量,libavcodec里很多code都是從頭開發(fā)的。其生成的lib主要功能模塊有:
- libavcodec:codec其實(shí)是coder/decorder的縮寫,也就是編碼解碼器
- libavdevice:對(duì)輸出輸入設(shè)備的支持
- libavformat:對(duì)音頻視頻格式的解析
- libavutil:集項(xiàng)工具
- libpostproc:后期效果處理
- libswscale:視頻場(chǎng)景比例縮放,色彩映射轉(zhuǎn)換
??在目前很多主流的直播軟件中都使用FFmpeg編解碼,ffmpeg中實(shí)現(xiàn)幾十種音視頻壓縮格式、輸入設(shè)備、輸出設(shè)備、封裝格式、解封裝、協(xié)議的支持,生成的庫能夠達(dá)到100多M字節(jié),所以使用時(shí)一定要根據(jù)項(xiàng)目實(shí)際需要,對(duì)ffmpeg進(jìn)行裁剪。以下列出我在項(xiàng)目中的裁剪配置,最終生成的so文件在5.5MB左右。
2.下載源碼
我使用的源碼配置:
FFmpeg:使用B站的ffmpeg3.0 下載地址 https://github.com/Bilibili/FFmpeg
x264:https://github.com/yixia/x264,
下載后將其并列存放即可。
3.配置
安裝下載Android ndk,如果本地沒有,提前下載一份,供編譯使用, 我使用的是android-ndk-r10e
(1)在h264文件夾下新建build-h264.sh腳本文件###
內(nèi)容如下:
#!/bin/bash
ANDROID_NDK=/Volumes/Android/android-ndk-r10e
if [ -z "$ANDROID_NDK" ]; then
echo "You must define ANDROID_NDK before starting."
echo "They must point to your NDK directories.\n"
exit 1
fi
# Detect OS
OS=`uname`
HOST_ARCH=`uname -m`
export CCACHE=; type ccache >/dev/null 2>&1 && export CCACHE=ccache
if [ $OS == 'Linux' ]; then
export HOST_SYSTEM=linux-$HOST_ARCH
elif [ $OS == 'Darwin' ]; then
export HOST_SYSTEM=darwin-$HOST_ARCH
fi
SOURCE=`pwd`
PREFIX=$SOURCE/build/android
SYSROOT=$ANDROID_NDK/platforms/android-14/arch-arm
CROSS_PREFIX=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/$HOST_SYSTEM/bin/arm-linux-androideabi-
EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon -D__ARM_ARCH_7__ -D__ARM_ARCH_7A__"
EXTRA_LDFLAGS="-nostdlib"
./configure --prefix=$PREFIX \
--cross-prefix=$CROSS_PREFIX \
--extra-cflags="$EXTRA_CFLAGS" \
--extra-ldflags="$EXTRA_LDFLAGS" \
--enable-pic \
--enable-static \
--enable-strip \
--disable-cli \
--host=arm-linux \
--sysroot=$SYSROOT
make clean
make STRIP= -j4 install || exit 1
腳本開始位置配置ndk路徑,然后在終端執(zhí)行
./build-h264.sh
正常會(huì)在x264-master/build/android/lib生成libx264.a
(2)在ffmpeg新建build-ffmpeg.sh腳本文件###
內(nèi)容如下:
#!/bin/bash
NDK=/Volumes/Android/android-ndk-r10e
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64
PREFIX=x264-master/build/android
function build_one
{
./configure \
--prefix=$PREFIX \
--disable-gpl \
--disable-nonfree \
--disable-gray \
--disable-swscale-alpha \
--disable-programs \
--disable-ffmpeg \
--disable-debug \
--disable-doc \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-htmlpages \
--disable-manpages \
--disable-podpages \
--disable-txtpages \
--disable-avdevice \
--disable-doc \
--disable-d3d11va \
--disable-dxva2 \
--disable-vaapi \
--disable-vda \
--disable-vdpau \
--disable-videotoolbox \
--disable-symver \
--disable-encoders \
--disable-muxers \
--disable-demuxers \
--disable-parsers \
--disable-bsfs \
--disable-protocols \
--disable-hwaccels \
--disable-indevs \
--disable-outdevs \
--disable-filters \
--disable-decoders \
--enable-version3 \
--enable-shared \
--enable-nonfree \
--enable-gpl \
--enable-avformat \
--enable-avresample \
--enable-avcodec \
--enable-avutil \
--enable-swresample \
--enable-swscale \
--enable-avfilter \
--enable-postproc \
--enable-parser=h264 \
--enable-decoder=h264 \
--enable-protocol=file \
--enable-protocol=rtmp \
--enable-muxer=rawvideo \
--enable-encoder=rawvideo \
--enable-network \
--enable-decoder=aac_latm \
--enable-decoder=aac \
--enable-muxer=mp4 \
--enable-demuxer=hls \
--enable-parser=aac \
--enable-parser=h264 \
--enable-runtime-cpudetect \
--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
#make clean
#make
#make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-I/Users/panyu02/Documents/AndroidBranch/x264-master/build/android/include"
ADDI_LDFLAGS="-L/Users/panyu02/Documents/AndroidBranch/x264-master/build/android/lib"
build_one
腳本開始位置配置NDK路徑, x264路徑,通過enable 和disable增減配置
在終端執(zhí)行
./build-ffmpeg.sh
如果沒有問題,接著執(zhí)行
make clean
make -j4 install
其中 -j4參數(shù)為同時(shí)執(zhí)行線程數(shù),提高編譯速度,沒有問題在FFmpeg-master-3.0/android/arm/lib目錄生成相應(yīng)的.a和.so文件
可以將各個(gè)模塊打包出一個(gè)ffmpeg.so文件,參考命令:
$TOOLCHAIN/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so \ android-lib/lib/libx264.a \ libavcodec/libavcodec.a \ libavfilter/libavfilter.a \ libswresample/libswresample.a \ libavformat/libavformat.a \ libavutil/libavutil.a \ libswscale/libswscale.a \ libpostproc/libpostproc.a \ libavdevice/libavdevice.a \ -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.8/libgcc.a
也可以把每個(gè)模塊打包出單獨(dú)的so,那么需要對(duì)上面的配置文件做兩件事:
(1) 去掉最后一段配置(make install 后面的)
(2) 將configure選項(xiàng)–enable-static –disable-shared 反過來–enable-shared –disable-static
參考鏈接1
參考鏈接2