x264惹得祸

最近研究读取安卓手机摄像头数据并利用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.bz2
mv x264-snapshot-20160910-2245-stable x264
3.配置脚本 build_x264.sh
#!/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 ..

x264惹得祸
文章图片
注意我们的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的Makefile
clean: 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文件
部分代码如下
x264惹得祸
文章图片
echo 'default: lib-static' >> config.mak就是将default: lib-static这句话输出重定向到config.mak这个配置文件!
最终会生成最关键的配置文件config.mak

x264惹得祸
文章图片

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))

x264惹得祸
文章图片
include下面是ffmpeg的h264编译的依赖文件,lib下面就是静态库了

x264惹得祸
文章图片
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惹得祸
文章图片
【x264惹得祸】这样我们就可以用ffmpeg的H264编码了
/*3- 查找可用编码器*/ pCodec = avcodec_find_encoder(AV_CODEC_ID_H264);

    推荐阅读