x264惹得祸

最近研究读取安卓手机摄像头数据并利用ffmpeg实时编码为H.264编码格式的FLV文件~
到下面代码时,就打印找不到编码器~

pCodec = avcodec_find_encoder(AV_CODEC_ID_H264);
if (!pCodec){ 
     LOGE("Can not find encoder!\n");  
     return -1;
}

网上搜了一下,是

--enable-libx264         enable 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 x264  

make clean  

export 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=$PLATFORM

make  

make install


cd ..  

注意我们的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 *.pgc

distclean: 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)/pkgconfig

install-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交叉编译

这样我们就可以用ffmpeg的H264编码了

   /*3- 查找可用编码器*/
   pCodec = avcodec_find_encoder(AV_CODEC_ID_H264);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值