使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(八)

第八部分---FFmpeg移植到Android

最近这几天一直在搞FFmpeg的Android移植,我的目标是在Linux上对FFmpeg进行交叉编译最终得到可以push到Android目录下执行的ffmpeg可执行文件。

为了达到这个目的,完成对FFmpeg的移植,我可以说是查遍了几乎所有网络文章,试遍了网上的各种方法,但最终还是出现各种各样的错误,真是蛋蛋碎了一地阿!

刚刚开始试验的时候,在编译的时候小心脏还加速跳呢害怕失败出错,到后来试的多了,失败的多了直接没感觉了,想着反正没打算通过,很淡定了。说实话这活还是很让人纠结着急上火的。为什么人家可以顺利编译通过我就不行了呢。

好了,步入正题~~~~~~~~~~~~~~~

1、在此特意非常感谢网友Livingstone,感谢他的耐心帮助和指导。

没有Livingstone提供配置文件的话,我不可能在今天完成编译移植。

2、通过查阅网上的各种教程,我发现大家移植的最终目标大多数是要得到.so文件,然后将其放到Android工程中去,然后通过JNI调用FFmpeg的各种方法,在Android应用层上面调用FFmpeg的各种方法完成各种任务,比如视频格式转换等。

但是我目前的目标还没有定到通过JNI来调用FFmpeg的方法来完成相应的功能,我只是要得到能够在Android目录下用命令行可以执行的ffmpeg可执行文件就可以了,JNI包装的事情之后再讲。

根据这个目标我查看了一篇博文

FFmpeg在Android上的移植优化步骤

这篇文章达到的效果和我想要的基本是一样的,所以我就一步步按照他的方法来做,出现了一个个的错误,可能是我的环境问题还是什么的最终我没有按照他的方法成功。

由于他实现的效果和我想要的一样,我就一遍一遍的修改配置文件一遍一遍的试验用了好长的时间还是失败。有同样需求的可以参考这篇文章,感觉写的不错,没准你按照他的方法通过了呢。

3、昨天下午我在讨论群FFMPEG+Live555=H.264里问了下这个问题,好心的网友Livingstone曾经做过相似的工作,发给我一个他曾经用过的配置文件,经过我修改过NDK路径后如下build_bin_ffmpeg_1.sh:

NDK=/home/wangrui/java/android-ndk-r9d
PLATFORM=$NDK/platforms/android-9/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -marm -mcpu=cortex-a8"
PREFIX=./android/$CPU
./configure --target-os=linux     --prefix=$PREFIX     --enable-cross-compile     --arch=arm     --enable-nonfree     --enable-asm     --cpu=cortex-a8     --cc=$PREBUILT/bin/arm-linux-androideabi-gcc     --cross-prefix=$PREBUILT/bin/arm-linux-androideabi-     --nm=$PREBUILT/bin/arm-linux-androideabi-nm     --sysroot=$PLATFORM     --extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 $OPTIMIZE_CFLAGS "
    --disable-shared     --enable-static     --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -nostdlib -lc -lm -lz -ldl -llog -lavcodec -lavformat -lswscale -lavutil -lswresample"     --disable-ffmpeg     --disable-ffplay     --disable-ffprobe     --disable-ffserver     --enable-swscale     --disable-swresample     --enable-avformat     --enable-avcodec     --disable-optimizations     --disable-debug     --disable-doc     --disable-stripping     --enable-pthreads     --disable-yasm     --enable-zlib     --enable-pic     --enable-small

make clean
make  -j4 install

$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o

$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -soname libffmpeg.so -shared -nostdlib  -z noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.8/libgcc.a

他当时移植的FFmpeg版本是2.5.3,我也用的这个版本,但结果又让我失望了:

libavcodec/opusdec.c:376: error: undefined reference to 'swr_is_initialized'
libavcodec/opusdec.c:222: error: undefined reference to 'swr_is_initialized'
libavcodec/opusdec.c:163: error: undefined reference to 'swr_init'
libavcodec/opusdec.c:169: error: undefined reference to 'swr_convert'
libavcodec/opusdec.c:236: error: undefined reference to 'swr_convert'
libavcodec/opusdec.c:117: error: undefined reference to 'swr_convert'
libavcodec/opusdec.c:408: error: undefined reference to 'swr_close'
libavcodec/opusdec.c:563: error: undefined reference to 'swr_close'
libavcodec/opusdec.c:585: error: undefined reference to 'swr_free'
libavcodec/opusdec.c:638: error: undefined reference to 'swr_alloc'

Livingstone他自己也遇到过这个问题,最终也没有解决,我想可能是FFmpeg版本的问题。

他介绍说FFmpeg的2.0版本的前后的编译移植方法可能不同,我想这也许就是试验网上的一些教程不成功的原因吧。NDK版本、FFmpeg版本都有可能影响到结果,所以要灵活点。

4、最后使用了一个开源项目的FFmpeg-android源码+上面的配置文件进行编译,居然没有出错误,真是激动的不行了。

开源项目地址是:

FFmpeg for Android

我记得之前查资料的时候看过这个项目也下载过,但是看了半天就是不知道该怎么用,后来就搁置了。没想到这次居然用到了。

(1)下载FFmpeg for Android项目的源码,地址http://sourceforge.net/projects/ffmpeg4android/files/20140318/我选择的是ffmpeg-2.1.4.android这个版本。

(2)将上面的build_bin_ffmpeg_1.sh文件内容copy到ffmpeg-2.1.4.android目录下。

(3)修改build_bin_ffmpeg_1.sh文件的权限

chmod 755 build_bin_ffmpeg_1.sh

(4)执行配置文件

./build_bin_ffmpeg_1.sh

(5)不出错的话,等待几分钟后会出现下面的画面:

打开ffmpeg-2.1.4.android目录,会发现多了个android目录,里面有个armv7-a文件夹里面有bin、include、lib、share和libffmpeg.so文件。

我们需要的是bin目录下的ffmpeg可执行文件,用file命令可以查看它的属性:

[email protected]:~/345/ffmpeg-2.1.4.android/android/armv7-a/bin$ file ffmpeg
ffmpeg: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), stripped

可以看出其是ARM下的可执行文件,大小9.1M。

(6)将bin目录下的可执行文件push到Android的/data/misc/目录下

[email protected]:~$ adb push /home/wangrui/345/ffmpeg-2.1.4.android/android/armv7-a/bin/ffmpeg  /data/misc/ffmpeg

可以看到在/data/misc目录下有ffmpeg文件,说明push成功

[email protected]:/ # cd data/misc/
[email protected]:/data/misc # ll
drwxrwxr-x root     root              2015-03-04 18:52 -r
drwxrwxr-x root     root              2015-03-04 18:52 -rf
drwxrwx--- system   system            2000-01-01 08:02 bluetooth
drwxrwx--- bluetooth bluetooth          2000-01-01 08:00 bluetoothd
drwxrwx--- dhcp     dhcp              2015-03-10 17:12 dhcp
<span style="color:#FF0000;">-rwxrwxrwx root     root      9145536 2015-03-10 10:48 ffmpeg</span>
drwx------ nobody   root              2015-03-05 18:04 hls
drwxrwxr-x root     root              2015-03-04 18:52 html
drwxrwx--x system   system            2000-01-01 08:00 keychain
drwx------ keystore keystore          2000-01-01 08:00 keystore
drwxrwxr-x root     root              2015-03-04 18:52 logs
drwxrwxrwx root     root              2015-03-04 19:15 nginx
drwxrwxr-x root     root              2015-03-05 18:04 nginx-rtmp
drwx------ system   system            2000-01-01 08:00 systemkeys
drwxrwx--- system   vpn               2000-01-01 08:00 vpn
drwxrwxrwx wifi     wifi              2000-03-13 16:55 wifi

(7)执行ffmpeg文件

./ffmpeg

显示如下:

[email protected]:/data/misc # ./ffmpeg
ffmpeg version 2.1.4 Copyright (c) 2000-2014 the FFmpeg developers
  built on Mar 10 2015 10:48:10 with gcc 4.8 (GCC)
  configuration: --target-os=linux --prefix=./android/armv7-a --enable-cross-compile --arch=arm --enable-nonfree --enable-asm --cpu=cortex-a8 --cc=/home/wangrui/java/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc --cross-prefix=/home/wangrui/java/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi- --nm=/home/wangrui/java/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-nm --sysroot=/home/wangrui/java/android-ndk-r9d/platforms/android-9/arch-arm/ --extra-cflags=' -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -mfloat-abi=softfp -marm -mcpu=cortex-a8 '
  libavutil      52. 48.101 / 52. 48.101
  libavcodec     55. 39.101 / 55. 39.101
  libavformat    55. 19.104 / 55. 19.104
  libavdevice    55.  5.100 / 55.  5.100
  libavfilter     3. 90.100 /  3. 90.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

5、最后我将我编译出来的可执行文件上传了,有需要的话可以下载试试看。

http://download.csdn.net/detail/xdwyyan/8488351

6、总结

FFmpeg的移植工作可以说费了我非常大的精力,经历了一遍一遍的失败,一遍一遍的尝试,好在最终成功。

网上的一些教程可能是根据自己的环境配置进行的,对于其他人并不一定行的通,包括我这个方法别人也可能会编译出错,但是这没什么。多试验几次,多尝试下相信最终还是会成功的。

时间: 2024-08-01 21:04:04

使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(八)的相关文章

使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(十)

第十部分 -- 开发板测试 前几天已经分别将nginx和ffmpeg移植到了开发板上面,但是还是没有进行任何的测试并不知道移植后的效果如何. 今天分别做了两个测试,证明移植的结果是可用的. 1.测试ffmpeg 对于nginx的测试在移植完成后就已经进行过了,当然就是简单的能够显示nginx欢迎界面而已,但是对我来讲,nginx能用就行,并没有对他进行深一步的测试. 但是对于ffmpeg不测试下总感觉不放心,虽然移植时运行显示可以,但是还不知道它能不能工作,所以首先用它进行了视频格式转换的测试.

使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(五)

第五部分 前段时间,在Ubuntu上面搭建起来了能支持HLS的流媒体服务器,最终目标是在arm的开发板上搭建这样的流媒体服务器.现在工作只是做了一小部分,正在进行移植,记录下来,方便以后继续干. 1.首先是要移植nginx到arm的开发板上面. 这个其实有人已经做过了,可以使用别人的工程. https://bitbucket.org/ntakimura/android-nginx/src/c80cb9c41a725ecf57f73a196735100aeef5b6e4/?at=android 这

使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(六)

第六部分 前几天一直被移植到ARM开发板上的nginx启动的问题困扰,在ARM开发板上启动时不是出现 nginx: [emerg] getgrnam("nogroup") failed (2: No such file or directory) 就是出现 /system/bin/sh: ./nginx: cannot execute - Permission denied 使用命令 adb shell chmod 755 /sdcard/mynginx/sbin/nginx 修改权限

使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(二)

第二部分 1.昨天已经把网络摄像机的rtsp视频流成功利用FFmpeg和Nginx转换成rtmp流推送到了nginx视频服务器上面,并且通过vlc可以观看到直播视频. 今天继续昨天的工作,将rtsp的视频流推送到Nginx上面,客户端根据hls协议使用http在网页进行观看(推送的仍然是rtmp视频流),关于hls,先给一小段简单介绍: HTTP Live Streaming(HLS)是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,相对于常见的流媒

使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(一)

第一部分 主要步骤及命令记录: 1.下载nginx,地址http://nginx.org/en/download.html,选择最新版本下载.解压.当前最新版为:nginx-1.7.9. 2.为了增加对rtmp的支持,下载nginx-rtmp-module,地址:https://github.com/arut/nginx-rtmp-module#example-nginxconf,这个是个开源项目.解压后,为了和我在网上看到的教程同步,我改了文件夹名字,将其改成了nginx-rtmp-modul

使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(三)

第三部分 这几天实验室搬家,闹腾的,刚刚进入状态. 接着调试,客户端浏览器根据hls协议使用http在网页进行观看直播视频,期间遇到一些小问题,记录下. 1.昨天测试的时候,遇到一个情况,就是在无论在PC机还是移动端浏览器观看视频的时候,总是出现画面丢失现象,烦人得很. 控制台也显示丢包现象严重得很. 可以看出,丢包现象到了很严重的地步.看着都糟心. 此时使用的命令是: ffmpeg -i rtsp://admin:[email protected] -vcodec copy -acodec c

使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(九)

第九部分---项目ffmpeg命令解析 前面已经看到了ffmpeg在ARM开发板上执行给出的提示信息: usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... 参照前面在PC机linux操作系统上完成同样的任务执行的命令 ffmpeg -i rtsp://admin:[email protected]  -vcodec copy -acodec copy -s 640x480 -

使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(四)

第四部分 自从换了路由器之后,丢包少了,画面稳了,心情也好了. 今天上午ubuntu搜狗输入法突然不好使了,不能输入汉字了,真别扭阿.赶紧百度怎么办,搜到一条命令,删除IBus,具体什么命令我就不说了,坑阿!删除了以后整个系统设置都快全消失了.有人说这是ubuntu的BUG,谁知道呢,最后重装desk-top才行了. sudo apt-get instal ubuntu-desktop 所以阿,卸载啥软件一定要慎重. 步入正题-- 在命令没有变的前提下,测试了更多的Android手机浏览器,测试

Linux---nginx+ffmpeg搭建流媒体服务器

原帖地址:https://blog.csdn.net/loyachen/article/details/50907828 这里实现了简单nginx+ffmpeg 推本地mp4视频文件的功能,以后将会继续更新 环境 系统环境:CentOS release 6.7 (Final) 需求 利用nginx和ffmpeg搭建流媒体服务器 步骤 安装ffmpeg 安装过程可以参考:centos编译安装ffmpeg:http://blog.csdn.net/loyachen/article/details/5