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上的流程一致。
编译过程中, 如果有问题,大致是这两个:#!/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的路径。
这两个脚本放在各自目录下,运行就可以了。比如保存成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.
ffmpeg_build.txt
x264_build.txt
补充一下,最近又发现一个不错的资源:
不仅编译出ffmpeg的各个so,还提供了一个工程,可以编译成JNI demo使用。
另外,有人编译好了libffmpeg.so,很多地方可以下载,比如
如果不想编译的话,可以直接下载来学习。