FFmpeg默认是只支持H.264的解码,但是不支持H.264的编码,下面我将带领大家一起编译一个可供我们使用的H.264的编码库。想了解FFmpeg库编译的步骤可看我的上一篇博客【音视频开发一:编译Android端使用的FFmpeg库】。
一:编译x264库。
1、下载地址 https://mp.csdn.net/postedit
2、下载完后解压如下。
3、替换configure文件中的配置
找到:
替换前(所有的):
echo "SONAME=libx264.so.$API" >> config.mak
替换后(所有的):
echo "SONAME=libx264-$API.so" >> config.mak
这一步操作也是为了生成Android平台可识别的so文件。
4、在configure的同级目录下新建build_x264.sh文件,内容为:
#
NDK=/Users/****/Documents/Android/NDK/android-ndk-r12b
SYSROOT=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-static \
--disable-asm \
--enable-pic \
--enable-strip \
--host=arm-linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$SYSROOT \
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
build_one
注:请自觉将NDK路径改为自己的路径,同时验证下SYSROOT、TOOLCHAIN的配置是否存在。
5、进入build_x264.sh的目录下,运行 ./build_x264.sh 命令,编译x264库。
如果没有权限请先运行:sudo chmod +x build_x264.sh 命令,允许权限。
运行完后,目录下会新增一个android文件夹,
include文件下:头文件
libs:.a 的为静态库;.so 的为动态库。
--enable-shared \ 编译出动态库
--enable-static \ 编译出静态库
二:将编译好的x264库集成到FFmpeg中
假如你阅读了我的第一篇博客 音视频开发一:编译Android端使用的FFmpeg库 ,聪明的你肯定能发现在编译FFmpeg时,出现了如下的提示:libx264 not found
这是因为我们没有集成x264库。下面我们将 x264 集成到我们的FFmpeg中。
1、因为FFmpeg需要使用静态链接方式链接其他额外的外部库,所以需要.a格式的文件。
打开我们编译FFmpeg的build_android.sh文件,将内容改为:
#!/bin/sh
NDK=/Users/***/Documents/Android/NDK/android-ndk-r12b # 修改成自己本地的ndk路径。
SYSROOT=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-pthreads \
--enable-gpl \
--enable-version3 \
--enable-nonfree \
--disable-static \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--enable-avdevice \
--enable-avfilter \
--enable-libx264 \
--enable-small \
--enable-asm \
--enable-neon \
--cross-prefix=$CROSS_PREFIX \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--enable-runtime-cpudetect \
--sysroot=$SYSROOT \
--disable-parsers \
--enable-parser=aac \
--enable-parser=h264 \
--enable-parser=mjpeg \
--enable-parser=png \
--enable-parser=bmp \
--enable-parser=mpegvideo \
--enable-parser=mpegaudio \
--disable-encoders \
--enable-encoder=h263 \
--enable-encoder=libx264 \
--enable-encoder=mpeg4 \
--enable-encoder=aac \
--enable-encoder=png \
--enable-encoder=gif \
--enable-encoder=bmp \
--disable-decoders \
--enable-decoder=h263 \
--enable-decoder=h264 \
--enable-decoder=mpeg4 \
--enable-decoder=mjpeg \
--enable-decoder=gif \
--enable-decoder=mp3 \
--enable-decoder=aac \
--enable-decoder=png \
--enable-decoder=bmp \
--enable-decoder=yuv4 \
--disable-network \
--enable-protocols \
--enable-protocol=concat \
--enable-protocol=hls \
--enable-protocol=file \
--disable-demuxers \
--enable-demuxer=h263 \
--enable-demuxer=h264 \
--enable-demuxer=flv \
--enable-demuxer=gif \
--enable-demuxer=aac \
--enable-demuxer=ogg \
--enable-demuxer=dts \
--enable-demuxer=mp3 \
--enable-demuxer=mov \
--enable-demuxer=m4v \
--enable-demuxer=concat \
--enable-demuxer=mpegts \
--enable-demuxer=mjpeg \
--enable-demuxer=mpegvideo \
--enable-demuxer=rawvideo \
--enable-demuxer=yuv4mpegpipe \
--disable-muxers \
--enable-muxer=h264 \
--enable-muxer=flv \
--enable-muxer=gif \
--enable-muxer=mp3 \
--enable-muxer=dts \
--enable-muxer=mp4 \
--enable-muxer=mov \
--enable-muxer=mpegts \
--disable-filters \
--enable-filter=aresample \
--enable-filter=asetpts \
--enable-filter=setpts \
--enable-filter=ass \
--enable-filter=scale \
--enable-filter=concat \
--enable-filter=atempo \
--enable-filter=movie \
--enable-filter=overlay \
--enable-filter=rotate \
--enable-filter=transpose \
--enable-filter=hflip \
--extra-cflags="-I/Users/***/Documents/Documents/Projects/FFmpeg/x264/android/arm/include" \
--extra-ldflags="-L/Users/***/Documents/Documents/Projects/FFmpeg/x264/android/arm/lib" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
注:
1、请自觉将NDK路径改为自己的路径,同时验证下SYSROOT、TOOLCHAIN的配置是否存在。
2、extra-cflags和extra-ldflags换成自己刚才编译的x264文件。他们两个的前缀有一个“-I”和“-L”。
-D:用于在编译时定义宏
-I:编译阶段生效的参数,用于指定头文件的搜索路径
-L:链接阶段生效的参数,用于指定链接库的搜索路径,
-l用于指定链接库的名称,一般两者一起使用的话,就可以指定动态链接库
2、改完build_android.sh文件后,我们执行 ./build_android.sh 命令。