基于ffmpeg的Android播放器开源代码

  • 博客分类:
  • android多媒体
http://www.cnblogs.com/mcodec/articles/1780598.html


基于ffmpeg的Android播放器开源代码
Posted on 2011-07-23 11:40 mcodec 阅读(1964) 评论(68)  编辑 收藏
 
本开源Android播放器基于ffmpeg开发,音视频在jni层直接输出,不使用java层的bmp和audiotrack输出,支持arm汇编加速,超级精简。

 

本开源代码播放器使用的音视频解码代码来源于ffmpeg-0.6.3(http://www.ffmpeg.org),
jni衔接代码和java层代码来源于havlenapetr(https://github.com/havlenapetr/FFMpeg)。

移植ffmpeg到android的常规关键点网上有很多的帖子可以参考,也可以用文件夹比较工具比较一下,看看添加修改删除了那些文件。

本开源代码的编译环境
1: Android SDK 2.2版,
2: NDK r4版,注意要导出NDK宏,

3: IDE开发环境是 eclips 3.5 版

4: libffplay.so是在Android 2.2版源码目录树中编译出来的,使用Ubuntu10.04和VMware7.1.1版,目前源码不公开
5: libffmpeg.so编译步骤,cd /cygwin/c/ffplay, ./config_r4.sh, $NDK/ndk-build
6: PC主机开发环境是windows xp。

 

特别注意,此demo只能在 Android SDK 2.2版上使用,其他版本有修改源码,重新编译才行。

 

此开源代码解决了几个特别关键点,达到实用水平。几个关键点如下:
1:arm汇编代码编译支持,主要是在几个.mk文件中添加LOCAL_ARM_MODE := arm语句,
     在config_r4.sh文件中添加--arch=armv5te和--enable-asm 等开关。
2:在ffmpeg config_r4.sh配置文件中关闭了一些不用的选项后,连接时总是报一些莫名其妙的连接错误,
    本开源代码给出终极解决方案(在/jni/jni/Android.mk文件中添加 LOCAL_LDLIBS += C:/ffplay/bin/ndk/local/armeabi/libavcodec.a等语句)。
3:修改havlenapetr中的视频显示错误bug,经测试havlenapetr原始代码在模拟器设置为320x480时显示正确,在更大的分辨率下显示错误,
    本开源代码已修改好此bug,现在无论什么分辨率都可以正确显示。

 

此开源代码其他注意事项:

1:jni衔接代码相比havlenapetr精简了几个数量级,更方便网友们研习。
2:此开源代码不包括play,pause,stop,seek和视音频同步等功能实现代码,这部分代码不开源。

3:Android jni层直接输出音频示例,Android jni层直接输出视频示例,基于ffmpeg的Android播放器开源代码,三个工程使用相同的库,相同的方法和技巧,可相互参考。
 

 

在moto defy me525上测试通过。

 

 欢迎下载研习: http://files.cnblogs.com/mcodec/ffplay1.7z

  apk包下载:   http://files.cnblogs.com/mcodec/ffplay1.apk.7z
分类: Android
标签: ffmpeg NDK android






===========




H264解码器源码(Android 1.6 版)
Posted on 2010-07-19 13:04 mcodec 阅读(12293) 评论(166)  编辑 收藏

H264解码器源码,移植ffmpeg中的H264解码部分到Android,深度删减优化,在模拟器(320x480)中验证通过。

程序的采用jni架构。界面部分,文件读取,视频显示都是用java做的,底层的视频解码用C来做满足速度的要求。

在这个版本中,从H264码流中分割出Nal是在java层做的,这样在java层直接调用解码时就知道是否有显示视频,缺点的就是耦合度/封装性差一点。

如果采用在底层做Nal分割的方法,可以封装得好看一些,但是每次送的数据有限制,如果送的数据太多,底层可能会一次解码出好几帧视频,但是通知到界面层只能显示一帧,造成丢帧的现象。 如果每次送的数据较少,就会有很多次底层调用没有进行实质解码,很小气的做法,比如有一压缩数据帧需要600字节,如果一次送100个字节给解码器,那么要送6次才会进行实质解码,因为每个数据帧有大有小,所以只能取极小值才不会导致丢帧。

不过所有的编码解码都是各种因素平衡折中的结果,具体用什么方法具体分析。

 

 

如果程序崩溃退出,优先考虑:

1)是否是baseline
2)byte [] NalBuf = new byte[40980]; 缓冲区是否溢出。

如果有B帧,那肯定不是baseline。
 

 

为便于支持不同分辨率的码流,修改了代码。现在只需要修改H264Android.java文件中第51,74,75行就可测试新分辨率。

有些大分辨率的码流可能会异常,优先修改H264Android.java文件中第161行把Nal缓冲区改大。

 

两版本都是用 android-ndk-1.6_r1-windows.zip 和 cygwin 1.7.5-1, gcc4 4.3.4-3 (用 cygcheck -c查看) 编译。

注意 /jni/H264Android.cpp文件添加了extern "C" 关键声明。

 

解码源码下载地址:http://files.cnblogs.com/mcodec/H264Android.7z 

C++版本下载地址:http://files.cnblogs.com/mcodec/H264Android_CPP.7z

 

测试码流(240x320)下载地址:http://files.cnblogs.com/mcodec/butterfly.h264.rar

测试码流(352x288)下载地址:http://files.cnblogs.com/mcodec/352x288.264.7z
分类: H264 Decoder
标签: H264 decoder android code 源码

你可能感兴趣的:(基于ffmpeg的Android播放器开源代码)