音视频聊天开发: 7 Android下ffmpeg+x264编译

1750阅读 0评论2014-10-29 conceptcon
分类:C/C++

Android下视频的采集和播放直接调用sdk就行了,只是编解码麻烦一些,这里采用NDK编译ffmpeg然后通过JNI接口调用。

 Android开发是麻烦了一点,不过手机倒是卖的很多,好在底层还要用的是Linux,  可以使用c/c++开源项目,比如 ffmpeg, vlc等拿上来用。否则直接就是WP7下场。
再说android编译ffmpeg,随便一搜有很多文章,不过转载者不知道自己测过没有, 没有哪个是一次编译通过的。这次比较了多个文章,选了一个最简单的:



另外,也还有一个人整合的工程也非常方便:
只是编译过程中问题比较多,如果运气好可能一次就OK了,可以采用这个。如果编译不过,他的configure配置的很不错,可以参考用在前面的例子上。



具体编译过程:
1 准备环境,windows下安装cygwin,  本文的环境是虚拟机CentOS 6.5 64位。
2 下载NDK, 文中是android-ndk-r9-linux-x86_64.tar.bz2。
3 为了方便,直接解压到了/root/android-ndk-r9下。安全的做法是以其他用户身份登录,放在/home/用户 目录下面。
4 下载ffmpeg和x264,也可以tar包也可以git。
5 编译x264, 脚本如下:
#!/bin/bash
 NDK=/root/android-ndk-r9
 SYSROOT=$NDK/platforms/android-9/arch-arm/
 TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64
 function build_one
 {
 ./configure \
 --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
 --sysroot="$SYSROOT" \
 --host=arm-linux \
 --enable-pic \
 --enable-shared \
 --disable-cli
 make clean
 make
 make install
 }
 build_one


6  编译ffmpeg,脚本如下:
#!/bin/bash
NDK=/root/android-ndk-r9
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-nonfree \
--enable-gpl \
--enable-libx264 \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--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/usr/local/include"
ADDI_LDFLAGS="-L/usr/local/lib"
build_one

内容和stackoverflow上的例子几乎一样,只是最后两行加上了libx264的路径。
为了看具体过程,把make,make install注释掉了。
这两个脚本放在各自目录下,运行就可以了。比如保存成build.sh,chmod一下再执行。

这样,就生成了ffmpeg sdk的各个.so或.a (根据自己的实际情况,修改configure 里的--enable static等参数)。

虽然是linux下编译生成的,但直接用在windows下的ndk编译环境也可以。


本文只讲了如果编译ffmpeg,顺利的话,一个小时就能完成。下一步开始在android上做视频采集,编码,解码,回放的测试了,和在PC上的流程一致。

编译过程中, 如果有问题,大致是这两个:

1 gnu/stubs-32.h: No such file or directory
在CentOS下执行:yum -y install glibc-devel.i686 glibc-devel

2 static declaration of 'lrint' follows non-static declaration
可参考: http://blog.csdn.net/tttyd/article/details/8825181

附件是两个文章,cu上不能发.sh的文件,把.txt改一下名就行了,其实不改也可以,只是看着别扭。

补充:
这里还有个完整的教程,和本文说的方法一样,只不过修正了一下生成so的版本号的方式:
This cause ffmpeg shared libraries to be compiled to libavcodec.so. (e.g. libavcodec.so.55), which is not compatible with Android build system. Therefore we’ll need to replace the above lines with the following lines.



ffmpeg_build.txt
x264_build.txt


补充一下,最近又发现一个不错的资源:
不仅编译出ffmpeg的各个so,还提供了一个工程,可以编译成JNI demo使用。
另外,有人编译好了libffmpeg.so,很多地方可以下载,比如
如果不想编译的话,可以直接下载来学习。
上一篇:Source Insight完美转换UTF-8 到 GB2312
下一篇:没有了