最近研究读取安卓手机摄像头数据并利用ffmpeg实时编码为H.264编码格式的FLV文件~
到下面代码时,就打印找不到编码器~
pCodec = avcodec_find_encoder(AV_CODEC_ID_H264);
if (!pCodec){
LOGE("Can not find encoder!\n");
return -1;
}
网上搜了一下,是
--enable-libx264enable H.264 encoding via x264 [no]
要配置
--enable-libx264
使能这个选项,然后编译ffmpeg.一步步来吧!
1.下载264库 http://download.videolan.org/x264/snapshots
2.解压,重命名x264
tar -jxvf x264-snapshot-20160910-2245-stable.tar.bz23.配置脚本 build_x264.sh
mv x264-snapshot-20160910-2245-stable x264
#!/bin/sh
#
# x264 build script
#
cd x264make cleanexport NDK=/home/wangxiong/Soft/android-ndk-r9d
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt
export PLATFORM=$NDK/platforms/android-8/arch-arm
export PREFIX=/home/wangxiong/Documents/Github/x264Lib./configure --prefix=$PREFIX \
--enable-static \
--enable-pic \
--disable-asm \
--disable-cli \
--host=arm-linux \
--cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- \
--sysroot=$PLATFORMmakemake installcd ..
文章图片
注意我们的ffmpeg库最终要跑在基于linux系统的Android平台上,所以要用NDK的交叉编译x264Lib是我们的库安装路径,
--prefix=$PREFIX
参数指定安装路径.我的NDK是linux64位的,所以选择linux-x86_64,而32位系统则是linux-x86.
脚本说明:
1.这个脚本很简单,
#!/bin/sh
声明为shell脚本,由/bin/sh来执行该脚本2.然后脚本向下执行,遇到命令就执行,跟在终端跑命令是一样的,
cd x264
,进入x264库3.
make clean
编译前,先清掉上次编译的结果 ,看看x264的Makefileclean:
rm -f $(OBJS) $(OBJASM) $(OBJCLI) $(OBJSO) $(SONAME) *.a *.lib *.exp *.pdb x264 x264.exe .depend TAGS
rm -f checkasm checkasm.exe $(OBJCHK) $(GENERATED) x264_lookahead.clbin
rm -f example example.exe $(OBJEXAMPLE)
rm -f $(SRC2:%.c=%.gcda) $(SRC2:%.c=%.gcno) *.dyn pgopti.dpi pgopti.dpi.lock *.pgd *.pgcdistclean: clean
rm -f config.mak x264_config.h config.h config.log x264.pc x264.def conftest*
make clean仅仅是清除之前编译的可执行文件及配置文件
make distclean要清除所有生成的文件
哈哈,clean就是rm删除一些东西!
4.接下来,声明一些环境变量如export NDK,然后$符引用变量
$NDK
5.
./configure
接下来配置参数,会生成一些配置文件,可以看一下configure文件部分代码如下
文章图片
echo 'default: lib-static' >> config.mak就是将最终会生成最关键的配置文件default: lib-static
这句话输出重定向到config.mak这个配置文件!
config.mak
文章图片
6.make编译
7.make install安装,最后退出到上一个目录
install-lib-dev:
$(INSTALL) -d $(DESTDIR)$(includedir)
$(INSTALL) -d $(DESTDIR)$(libdir)
$(INSTALL) -d $(DESTDIR)$(libdir)/pkgconfig
$(INSTALL) -m 644 $(SRCPATH)/x264.h $(DESTDIR)$(includedir)
$(INSTALL) -m 644 x264_config.h $(DESTDIR)$(includedir)
$(INSTALL) -m 644 x264.pc $(DESTDIR)$(libdir)/pkgconfiginstall-lib-static: lib-static install-lib-dev
$(INSTALL) -m 644 $(LIBX264) $(DESTDIR)$(libdir)
$(if $(RANLIB), $(RANLIB) $(DESTDIR)$(libdir)/$(LIBX264))
文章图片
include下面是ffmpeg的h264编译的依赖文件,lib下面就是静态库了
文章图片
4. sudo ldconfig 上面的install执行完后,执行
sudo ldconfig
5.配置FFmpeg ,开启h264编码
--enable-libx264 \
--enable-encoder=libx264 \
--enable-decoder=h264 \
--enable-decoder=h264_vdpau \
--enable-parser=h264 \
--extra-cflags="-I/home/wangxiong/Documents/Github/x264Lib/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" \
--extra-ldflags="-L/home/wangxiong/Documents/Github/x264Lib/lib"
--extra-cflags
和--extra-ldflags
很关键,这样编译的时候可以链接x264的lib库!注意ffmpeg也要用NDK交叉编译
文章图片
【x264惹得祸】这样我们就可以用ffmpeg的H264编码了
/*3- 查找可用编码器*/
pCodec = avcodec_find_encoder(AV_CODEC_ID_H264);