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

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

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

http://stackoverflow.com/questions/25079145/how-to-resolve-error-libx264-not-found

另外,也还有一个人整合的工程也非常方便:https://github.com/halfninja/android-ffmpeg-x264
只是编译过程中问题比较多,如果运气好可能一次就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.<version> (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.

http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/

ffmpeg_build.txt
x264_build.txt


补充一下,最近又发现一个不错的资源:https://github.com/dennishucd/FFmpeg4Android
不仅编译出ffmpeg的各个so,还提供了一个工程,可以编译成JNI demo使用。
另外,有人编译好了libffmpeg.so,很多地方可以下载,比如http://download.csdn.net/detail/qandroidj/4137324
如果不想编译的话,可以直接下载来学习。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。