H264解码器源码(Android 1.6 版)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,670评论 25 709
  • 硬件编码相关知识(H264,H265) 阅读人群:研究硬件编码器应用于iOS开发中,从0研究关于硬件编解码,码流中...
    小东邪啊阅读 14,403评论 0 18
  • 视频压缩编码的目标1)保证压缩比例2)保证恢复的质量3)易实现,低成本,可靠性 压缩的出发点(可行性)1)时间相关...
    rogerwu1228阅读 9,635评论 0 11
  • 晚上回学校的时候差点出现意外,幸运的是,公交车司机很棒。 临近学校的路口,一辆小轿车忽然转弯,公交车司机猛的一刹车...
    Yigo阅读 3,008评论 0 2
  • 今天是2016年12月22日,很高兴由我来为大家主持早会。 早会流程依旧,但在说口号的时候,我不小心颠倒了顺...
    蒙主阅读 52,426评论 0 3