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拼帧简解的更多相关文章

  1. 使用X264编码yuv格式的视频帧使用ffmpeg解码h264视频帧

    前面一篇博客介绍在centos上搭建点击打开链接ffmpeg及x264开发环境.以下就来问个样例: 1.利用x264库将YUV格式视频文件编码为h264格式视频文件 2.利用ffmpeh库将h264格 ...

  2. FFmpeg解码H264及swscale缩放详解

    本文概要: 本文介绍著名开源音视频编解码库ffmpeg如何解码h264码流,比较详细阐述了其h264码流输入过程,解码原理,解码过程.同时,大部分应用环境下,以原始码流视频大小展示并不是最佳方式,因此 ...

  3. 【图像处理】FFmpeg解码H264及swscale缩放详解

      http://blog.csdn.net/gubenpeiyuan/article/details/19548019 主题 FFmpeg 本文概要: 本文介绍著名开源音视频编解码库ffmpeg如何 ...

  4. 在iOS平台使用ffmpeg解码h264视频流(转)

    在iOS平台使用ffmpeg解码h264视频流,有需要的朋友可以参考下. 对于视频文件和rtsp之类的主流视频传输协议,ffmpeg提供avformat_open_input接口,直接将文件路径或UR ...

  5. 在iOS平台使用ffmpeg解码h264视频流

    来源:http://www.aichengxu.com/view/37145 在iOS平台使用ffmpeg解码h264视频流,有需要的朋友可以参考下. 对于视频文件和rtsp之类的主流视频传输协议,f ...

  6. FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  7. FFmpeg开发笔记(四):ffmpeg解码的基本流程详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  8. 控件activeX开发之项目ffmpeg解码h264——总结

    1. 编译好ffmpeg的lib库和dll库 2. 播放器作为一个dilog类player,然后在ctrol中的oncreate重写方法中用全局属性cplayer *player里new cplaye ...

  9. 利用ffmpeg解码h264流的代码

    这里也直接给出代码: h264dec.h: #pragma once #include "tdll.h" #include "avcodec.h" #inclu ...

随机推荐

  1. SQL SERVER 使用订阅发布同步数据库(转)

    一.数据库复制涉及  1.发布服务器:  数据的来源服务器,维护源数据,决定哪些数据将被分发,检测哪些数据发生了修改,并将这些信息提交给分发服务器.  2.分发服务器: 分发服务器负责把从发布服务器拿 ...

  2. JVM源码分析之FinalReference完全解读

    Java对象引用体系除了强引用之外,出于对性能.可扩展性等方面考虑还特地实现了4种其他引用:SoftReference.WeakReference.PhantomReference.FinalRefe ...

  3. 用SwiftGen管理UIImage等的String-based接口

    代码地址如下:http://www.demodashi.com/demo/12149.html 问题现状 平时我们使用UIImage,UIFont,UIColor会遇到很多String-based的接 ...

  4. 那些奇妙的&quot;大师&quot;是怎样炼成的(科学、迷信、心理)

    近期王林大师从神坛上掉下来直接掉进了监狱,有关他的非常多神话也相同被撕下了. 事实上这类奇妙的大师在地球上非常多,美国的非常多"邪教"头目,国内的邪教头目都属于这一类.国内比較轰动 ...

  5. smali文件内容具体介绍

    大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(Google Play下载的完整版版 ...

  6. PHP面试题及答案解析(3)—MySQL数据库

    1.mysql_num_rows()和mysql_affected_rows()的区别. mysql_num_rows()和mysql_affected_rows(),这两个函数都作用于 mysql_ ...

  7. PATHINFO模式是thinkphp特有的吗?

    pathinfo当然不是某个框架特有的,pathinfo严格上讲是HTTP服务器提供的一个预定义变量,在许多的框架中有一个重要的组件叫做路由器,这个组件可以通过使用pathinfo来实现. 考虑以下代 ...

  8. 170621 - Android ADB forward端口映射和reverse反向代理 使用笔记

    个人理解 forward:端口映射 将本地PC指定Port端口,映射到设备手机指定Port端口上.以便解决 PC -> Phone 的访问问题PC 作为Client客户端 可以任意访问 Phon ...

  9. 在SDL中显示GBK点阵汉字

    大家注意到没有,RA2的中文版本使用的是GBK点阵字库,这样做有一个好处:不管玩家是用的简体还是繁体都能识别显示的文字. GBK的意思大概是“国家标准汉字扩展字符集”吧,记不清了.但它的确是个好东东, ...

  10. js中有特殊字符的编码格式

    在get和post方法中,如果传入的参数值有特殊字符,如:“&”,在get中的url需要拼接,可以使用encodeURICompontent来编码来转化 回调就是在上面传递实际参数,传递给aj ...