(转)FFMPEG解码H264拼帧简解
http://blog.csdn.net/ikevin/article/details/7649095
H264的I帧通常 0x00 0x00 0x00 0x01 0x67 开始,到下一个帧头开始之前是完整一帧.可放入FFMPEG的AVPacket中处理
无论是文件流还是网络流,思路是将接收到的数据放入缓冲区,同时开启一个待拼帧的缓冲区1024*1024大小(我的是高清1920*1080,足够)
一、寻I帧头
//判断H264的I帧数据。返回I帧在本缓冲位置,或-1未找到
int _find_head(unsigned char *buffer, int len)
{
int i;
BOOL isMatch=FALSE;
for (i=0;i<len;i++){
if (buffer[i] == 0 && buffer[i+1] == 0 && buffer[i+2] == 0 && buffer[i+3] == 1 && buffer[i+4]==0x67){
isMatch=TRUE;
break;
}
}
return isMatch?i:-1;
}
二、拼帧
//应在循环代码中完成:while 或 for
header_position = _find_head(data,data_len);
//如果在当前解出的H264中找到头
if(header_position>-1){
//如果头在解出数据的首部0索引处
if(header_position==0){
//如果之前已经有上一完整的FRAME缓存
if(total>0){
//printf("%s\ Frame size:%d\n","Frame has got.",total);//提交FRAME
//写H264
//written = fwrite( frameData, total, 1, p810 );
//或解264为YUV数据
//这是FFMPEG的方法,具体看FFMPEG:len = avcodec_decode_video(c, picture, &got_picture, data,data_len);
memset(frameData,0,FF_INPUT_BUFFER_PADDING_SIZE);//清空上一帧FRAME缓存
total=0;
}
//新读入数据放入缓冲区,data是读入数据缓冲区,frameData是将要拼成一帧的缓冲区
memcpy(frameData,data+header_position,data_len-header_position);
total+=data_len;
}else{
//如果头不在解出数据的首部,表示data含有上一帧和下一帧的数据,要进行截取
memcpy(frameData+total,data,header_position);
total+=header_position;
//printf("%s\n","Frame has got.");//提交上一帧FRAME
//写H264
//written = fwrite( frameData, total, 1, p810 );
//或解264为YUV数据
//这是FFMPEG的方法,具体看FFMPEG:len = avcodec_decode_video(c, picture, &got_picture, data,data_len);
memset(frameData,0,FF_INPUT_BUFFER_PADDING_SIZE);//清空上一帧FRAME缓存
total=0;
//同时将截取的下一帧数据放入frameData
memcpy(frameData,data+header_position,data_len-header_position);
total+=data_len-header_position;
}
}else{//最后一个数据包,因为没有I帧数据,要如何处理看大家自己了。
memcpy(frameData+total,data,data_len);
total+=data_len;
}
以上。
(转)FFMPEG解码H264拼帧简解的更多相关文章
- 使用X264编码yuv格式的视频帧使用ffmpeg解码h264视频帧
前面一篇博客介绍在centos上搭建点击打开链接ffmpeg及x264开发环境.以下就来问个样例: 1.利用x264库将YUV格式视频文件编码为h264格式视频文件 2.利用ffmpeh库将h264格 ...
- FFmpeg解码H264及swscale缩放详解
本文概要: 本文介绍著名开源音视频编解码库ffmpeg如何解码h264码流,比较详细阐述了其h264码流输入过程,解码原理,解码过程.同时,大部分应用环境下,以原始码流视频大小展示并不是最佳方式,因此 ...
- 【图像处理】FFmpeg解码H264及swscale缩放详解
http://blog.csdn.net/gubenpeiyuan/article/details/19548019 主题 FFmpeg 本文概要: 本文介绍著名开源音视频编解码库ffmpeg如何 ...
- 在iOS平台使用ffmpeg解码h264视频流(转)
在iOS平台使用ffmpeg解码h264视频流,有需要的朋友可以参考下. 对于视频文件和rtsp之类的主流视频传输协议,ffmpeg提供avformat_open_input接口,直接将文件路径或UR ...
- 在iOS平台使用ffmpeg解码h264视频流
来源:http://www.aichengxu.com/view/37145 在iOS平台使用ffmpeg解码h264视频流,有需要的朋友可以参考下. 对于视频文件和rtsp之类的主流视频传输协议,f ...
- FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- 控件activeX开发之项目ffmpeg解码h264——总结
1. 编译好ffmpeg的lib库和dll库 2. 播放器作为一个dilog类player,然后在ctrol中的oncreate重写方法中用全局属性cplayer *player里new cplaye ...
- 利用ffmpeg解码h264流的代码
这里也直接给出代码: h264dec.h: #pragma once #include "tdll.h" #include "avcodec.h" #inclu ...
随机推荐
- MySQL 5.6.26几种安装包的差别
http://downloads.mysql.com/archives/community/ 一.MySQL Installer 5.6.26 mysql-installer-community-5. ...
- Jmeter启动报注册表警告
启动Jmeter后,控制台出现如下的警告: 主要出现的原因是: java.util.prefs.WindowsPreferences需要保存信息到HKEY_LOCAL_MACHINE\Software ...
- LoadRunner lr_eval_string() 函数使用及LR中变量、参数的简单使用
lr_eval_string() 函数的主要作用:返回脚本中的一个参数当前的值, 返回值类型:char 一般多用在调试脚本时输出参数的值.具体用法如下:lr_output_message(" ...
- javax.mail Java Extension(扩展)
http://baike.baidu.com/view/616724.htm JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便 ...
- SSH框架整合时,如果某一个action提交请求时数据校验失败,后续请求全部失败
© 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述 SSH框架搭建好进行验证时发现,执行某个请求时,若参数校验失败,修改参数符合要求后再次请求依然失败.该请求一直报错如下: No resu ...
- 使用OSChina代码托管管理项目(四)
本篇主要介绍使用Eclipse的Egit插件克隆远程project到本地的操作步骤 一.在Git资源库管理视图中新建一个远程资源库位置 点击红框中button进行加入 二.输入远程资源库相关信息.选择 ...
- OpenCV 3.1
http://www.tuicool.com/articles/FRfMni2 http://docs.opencv.org/3.1.0/d7/d9f/tutorial_linux_install.h ...
- UIWebView的全屏截图
项目开发中,我们可能会遇到如下的应用场景:将一篇文章,进行截屏(需要全屏截取,包括滚动部分)后,分享到新浪微博.邮箱等等.前段时间,我在应用开发中实现了该功能,代码也是从网上找到的,自己整理了一下.主 ...
- 使用Application Loader上传APP流程解读[APP公布]
本文仅仅是提供一个公布流程的总体思路.假设没有公布经验.建议阅读苹果官方公布文档或者Google搜索具体教程. 1.申请开发人员账号:99美金的(须要信用卡支付),详细流程网上有非常多样例.自行搜索. ...
- 【ubantu】Ubuntu的一些常用命令
创建文件: touch a.txt 创建文件夹: mkdir NewFolder 删除文件: rm a.txt 删除文件夹: rmdir NewFolder 删除带有文件的文件夹: rm -rf Ne ...