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

以上转自:http://www.cnblogs.com/mcodec/articles/1780598.html
我的下载地址:http://download.csdn.net/detail/xyyangkun/4188806
把common.h改下就可以用gcc编译了!
下面是common.h改后的文件的修改的部分:
#ifndef COMMON_H
#define COMMON_H#define WINCE
#define HAVE_AV_CONFIG_H
#define EMULATE_INTTYPES#define inline __inline#define ALT_BITSTREAM_READER#define LIBMPEG2_BITSTREAM_READER_HACK //add BERO#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>///*
typedef signed char  int8_t;
typedef signed short int16_t;
typedef signed int   int32_t;
typedef unsigned char  uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int   uint32_t;typedef signed long long   int64_t;
typedef unsigned long long uint64_t;// */

下面是makefile文件:

main: cabac.o common.o dsputil.o golomb.o  h264.o h264utils.o mpegvideo.o main.ogcc $^ -o $@
main.o: main.c
cabac.o:  common.h cabac.h
common.o: avcodec.h common.h
dsputil.o:  common.h avcodec.h dsputil.h
golomb.o: common.h
h264.o:  common.h avcodec.h h264.h dsputil.h mpegvideo.h h264data.h \golomb.h cabac.h
h264utils.o:  avcodec.h common.h dsputil.h mpegvideo.h h264.h \h264data.h golomb.h cabac.hmpegvideo.o:  avcodec.h common.h dsputil.h mpegvideo.hclean:-rm main *.o
在QT中使用时,修改while中语句就可以把yuv格式转成QT中QImage类,用于显示了。
        while(!feof(inpf))
        {
                nalLen = getNextNal(inpf, Buf);
                consumed_bytes= decode_frame(c, picture, &got_picture, Buf, nalLen);
                printf("ddd6\n");
#if 1
                unsigned char a1[1000000];//保存RGB16
                memset(a1, 0, sizeof(a1));
                char *pppp=(char *)(picture->data);
                DisplayYUV_16((unsigned int *)a1, picture->data[0], picture->data[1], picture->data[2] //把AVFrame格式的图片转成RGB16 格式
                            ,c->width, c->height,picture->linesize[0],picture->linesize[2], iWidth);        
                image= QImage(a1, iWidth, iHeight, QImage::Format_RGB16);   //把RGB16格式图片复制到QImage中!
                widget->update(); //调用刷新   //博客前面"qt界面刷新屏幕"有讲
                printf("update1 0k\n");
                usleep(100000);
               //continue;
 #endif
                #if 0
                        //*
                        for(i=0; i<c->height; i++)
                        fwrite(picture->data[0] + i * picture->linesize[0], 1, c->width, outf);
                        for(i=0; i<c->height/2; i++)
                        fwrite(picture->data[1] + i * picture->linesize[1], 1, c->width/2, outf);
                        for(i=0; i<c->height/2; i++)
                        fwrite(picture->data[2] + i * picture->linesize[2], 1, c->width/2, outf);
                        //return 0;
                        // */
                        #endif
                        /*
                        if(iBytesPixel==2)
                        {
                                unsigned int *rgb = (unsigned int*)(iDDraw->BeginDraw());
                                DisplayYUV_16(rgb, picture->data[0], picture->data[1], picture->data[2], c->width, c->height, picture->linesize[0], picture->linesize[1], iWidth);
                                iDDraw->EndDraw();
                        }
                        else if(iBytesPixel==3)
                        {
                                unsigned char *rgb = (unsigned char*)(iDDraw->BeginDraw());
                                DisplayYUV_24(rgb, picture->data[0], picture->data[1], picture->data[2], c->width, c->height, picture->linesize[0], picture->linesize[1], iWidth);
                                iDDraw->EndDraw();
                        }
                        else if(iBytesPixel==4)
                        {
                                unsigned int *rgb = (unsigned int*)(iDDraw->BeginDraw());
                                DisplayYUV_32(rgb, picture->data[0], picture->data[1], picture->data[2], c->width, c->height, picture->linesize[0], picture->linesize[1], iWidth);
                                iDDraw->EndDraw();
                        }
                        // */
                //}
        }

H264解码器源码(Android 1.6 版和QT都可以调用)相关推荐

  1. H264解码器源码(vc6版)H264Decoder_vc6.rar

    H264解码器源码,移植ffmpeg中的H264解码部分到windows,深度删减优化,在VC6中验证通过. 如果程序崩溃退出,优先考虑: 1)是否是baseline 2)unsigned char* ...

  2. 飞行熊猫游戏源码android版

    这款游戏是前一段时间完成的一个项目,飞行熊猫游戏源码android版,飞行熊猫基于cocos2d游戏引擎开发,包括了谷歌admob广告支持,没有任何版权问题,大家可以自由修改和上传应用商店. 1.本游 ...

  3. Android源码下载(官方版)

    2019独角兽企业重金招聘Python工程师标准>>> 下载Android源码 Android的源代码位于由谷歌托管的Git仓库. 安装Repo Repo是一款使android源码下 ...

  4. [Android精品源码] Android 仿美团网,探索ListView的A-Z字母排序功能实现选择城市

    Material Design中文版Code4APPPHP100UI4APP 开启辅助访问设为首页收藏本站快捷导航切换到宽版切换风格 石刚 | |我的 |签到打卡 |设置 |消息 |提醒(2) |退出 ...

  5. 几款最主流的音乐播放器应用源码-android源码

    影音播放 优雅音乐播放器应用源码 这是一款不错的音乐播放器应用源码案例,优雅音乐播放器应用源码,该应用的界面有点类似小米音乐播放器,应用的整天布局还没有那 人气:3328运行环境:/android/i ...

  6. android intent 源码,Android 基础之 IntentService 源码

    Android 基础之 IntentService 源码 Android,IntentService,源码 IntentService 位于 android.app 包下面,是 Service 的一个 ...

  7. [Android源码]Android源码之高仿飞鸽传书WIFI热点搜索与创建(一)

    (本文详情来源:android源码 http://www.eoeandroid.com/thread-296427-1-1.html   转载请注明出处!)  [Android源码分享]飞鸽传书的An ...

  8. android 快传 源码_最新安卓仿茄子快传APP源码包括服务端源码Android开发快传类项目源码全套...

    适使用范围:  安卓APP茄子快传源码 Android项目源码相似茄子快传的快传项目包括服务端 运行环境:  Android app 源码详细: 本项目是一个基于安卓的相似茄子快传的项目源码,包括安卓 ...

  9. android 滑动接听源码,android仿摩拜单车APP、炫酷RecyclerView、卡片滑动、仿饿了么点餐、自定义索引等源码...

    Android精选源码 Android优质博客 前言permissions4m 最初的设计是仅仅做成一个编译器注解框架,在1.0.0版本时,它纯粹地实现了原生 Android 请求流程,关于它的设计思 ...

最新文章

  1. 全员远程办公,半年入 1 亿美元:GitHub 的最大竞争对手上市了!
  2. “网络爸爸”的密码破解
  3. javax.management.InstanceNotFoundException: com.alibaba.druid:type=DruidStatService ERROR com.aliba
  4. Qt Creator加States
  5. Castle.MircoKernel Class Diagram - Part I
  6. Mysql主从延时解决办法
  7. Leetcode--72.编辑距离(java)
  8. 利用电脑上自带指纹识别嵌入程序中_Win 10 隐藏功能:不用任何软件就可实现手机投屏到电脑...
  9. 03-git上传大项目的时很慢
  10. 学习LoadRunner之C语言函数
  11. jquery上传 php,jQuery AJAX文件上传PHP
  12. 函数参数中的中括号代表什么
  13. C/C++[ w1785]字符串连接
  14. 手机操作系统学习总结
  15. 计算机如何输入极限符号,如何录入文本与符号 输入极限公式:Word符号与公式录入宝典第八篇...
  16. 阿里云企业邮箱用smtp发送邮件失败解决
  17. 图像处理的alpha通道(RGBA图像)
  18. 加油站(贪心)【LeetCode】
  19. Linux服务器wget:unable to resolve host address解决方法
  20. 电影《寒战2》中的管理知识

热门文章

  1. python计算思维训练文件操作与异常处理_054 Python程序设计思维
  2. Java注解配置rest服务_Spring Boot 注解—常用注解
  3. 画图设置刻度_总结了16个常用的matlibplot画图技巧(附源码)
  4. mtk处理器和骁龙对比_高通正在开发全新AR/VR处理器骁龙XR2;骁龙865对比骁龙855 Plus/苹果A13:爆料称性能增加20%...
  5. 【转】自然语言系列学习之表示学习与知识获取(八)利用远程监督多实例的关系抽取
  6. 从零开始搭建spring-cloud(5) ----config
  7. 使用聚合的方式实现静态代理
  8. Pandas直接读取arff格式的文件,这种需求还是头一次碰到!
  9. 爬虫 | urllib入门+糗事百科实战
  10. 杠上了,Linus 再次怒喷 Intel 直言“去死”