您的位置:首页 > 移动开发 > Android开发

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

2015-03-30 13:42 197 查看
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&id=4579915&uid=15063109

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

如果不想编译的话,可以直接下载来学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: