H264解码器源码(Android 1.6 版和QT都可以调用)
H264解码器源码,移植ffmpeg中的H264解码部分到Android,深度删减优化,在模拟器(320x480)中验证通过。
程序的采用jni架构。界面部分,文件读取,视频显示都是用java做的,底层的视频解码用C来做满足速度的要求。
在这个版本中,从H264码流中分割出Nal是在java层做的,这样在java层直接调用解码时就知道是否有显示视频,缺点的就是耦合度/封装性差一点。
如果采用在底层做Nal分割的方法,可以封装得好看一些,但是每次送的数据有限制,如果送的数据太多,底层可能会一次解码出好几帧视频,但是通知到界面层只能显示一帧,造成丢帧的现象。 如果每次送的数据较少,就会有很多次底层调用没有进行实质解码,很小气的做法,比如有一压缩数据帧需要600字节,如果一次送100个字节给解码器,那么要送6次才会进行实质解码,因为每个数据帧有大有小,所以只能取极小值才不会导致丢帧。
不过所有的编码解码都是各种因素平衡折中的结果,具体用什么方法具体分析。
如果程序崩溃退出,优先考虑:
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
#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
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都可以调用)相关推荐
- H264解码器源码(vc6版)H264Decoder_vc6.rar
H264解码器源码,移植ffmpeg中的H264解码部分到windows,深度删减优化,在VC6中验证通过. 如果程序崩溃退出,优先考虑: 1)是否是baseline 2)unsigned char* ...
- 飞行熊猫游戏源码android版
这款游戏是前一段时间完成的一个项目,飞行熊猫游戏源码android版,飞行熊猫基于cocos2d游戏引擎开发,包括了谷歌admob广告支持,没有任何版权问题,大家可以自由修改和上传应用商店. 1.本游 ...
- Android源码下载(官方版)
2019独角兽企业重金招聘Python工程师标准>>> 下载Android源码 Android的源代码位于由谷歌托管的Git仓库. 安装Repo Repo是一款使android源码下 ...
- [Android精品源码] Android 仿美团网,探索ListView的A-Z字母排序功能实现选择城市
Material Design中文版Code4APPPHP100UI4APP 开启辅助访问设为首页收藏本站快捷导航切换到宽版切换风格 石刚 | |我的 |签到打卡 |设置 |消息 |提醒(2) |退出 ...
- 几款最主流的音乐播放器应用源码-android源码
影音播放 优雅音乐播放器应用源码 这是一款不错的音乐播放器应用源码案例,优雅音乐播放器应用源码,该应用的界面有点类似小米音乐播放器,应用的整天布局还没有那 人气:3328运行环境:/android/i ...
- android intent 源码,Android 基础之 IntentService 源码
Android 基础之 IntentService 源码 Android,IntentService,源码 IntentService 位于 android.app 包下面,是 Service 的一个 ...
- [Android源码]Android源码之高仿飞鸽传书WIFI热点搜索与创建(一)
(本文详情来源:android源码 http://www.eoeandroid.com/thread-296427-1-1.html 转载请注明出处!) [Android源码分享]飞鸽传书的An ...
- android 快传 源码_最新安卓仿茄子快传APP源码包括服务端源码Android开发快传类项目源码全套...
适使用范围: 安卓APP茄子快传源码 Android项目源码相似茄子快传的快传项目包括服务端 运行环境: Android app 源码详细: 本项目是一个基于安卓的相似茄子快传的项目源码,包括安卓 ...
- android 滑动接听源码,android仿摩拜单车APP、炫酷RecyclerView、卡片滑动、仿饿了么点餐、自定义索引等源码...
Android精选源码 Android优质博客 前言permissions4m 最初的设计是仅仅做成一个编译器注解框架,在1.0.0版本时,它纯粹地实现了原生 Android 请求流程,关于它的设计思 ...
最新文章
- 全员远程办公,半年入 1 亿美元:GitHub 的最大竞争对手上市了!
- “网络爸爸”的密码破解
- javax.management.InstanceNotFoundException: com.alibaba.druid:type=DruidStatService ERROR com.aliba
- Qt Creator加States
- Castle.MircoKernel Class Diagram - Part I
- Mysql主从延时解决办法
- Leetcode--72.编辑距离(java)
- 利用电脑上自带指纹识别嵌入程序中_Win 10 隐藏功能:不用任何软件就可实现手机投屏到电脑...
- 03-git上传大项目的时很慢
- 学习LoadRunner之C语言函数
- jquery上传 php,jQuery AJAX文件上传PHP
- 函数参数中的中括号代表什么
- C/C++[ w1785]字符串连接
- 手机操作系统学习总结
- 计算机如何输入极限符号,如何录入文本与符号 输入极限公式:Word符号与公式录入宝典第八篇...
- 阿里云企业邮箱用smtp发送邮件失败解决
- 图像处理的alpha通道(RGBA图像)
- 加油站(贪心)【LeetCode】
- Linux服务器wget:unable to resolve host address解决方法
- 电影《寒战2》中的管理知识
热门文章
- python计算思维训练文件操作与异常处理_054 Python程序设计思维
- Java注解配置rest服务_Spring Boot 注解—常用注解
- 画图设置刻度_总结了16个常用的matlibplot画图技巧(附源码)
- mtk处理器和骁龙对比_高通正在开发全新AR/VR处理器骁龙XR2;骁龙865对比骁龙855 Plus/苹果A13:爆料称性能增加20%...
- 【转】自然语言系列学习之表示学习与知识获取(八)利用远程监督多实例的关系抽取
- 从零开始搭建spring-cloud(5) ----config
- 使用聚合的方式实现静态代理
- Pandas直接读取arff格式的文件,这种需求还是头一次碰到!
- 爬虫 | urllib入门+糗事百科实战
- 杠上了,Linus 再次怒喷 Intel 直言“去死”