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. 关于websocket和ajax无刷新

    HTTP无状态: Ajax只能实现用户和服务器单方面响应(单工机制). 如果设置为长轮询(ajax设置多少秒进行一次请求,时间间隙可能会有延迟,且浪费资源) 如果设置为长连接(客户端请求一次,服务器保 ...

  2. STL学习笔记(string)

    动机 C++标准程序库中的string class使我们可以将string当做一个一般型别.我们可以像对待基本型别那样地复制.赋值和比较string, 再也不必但系内存是否足够.占用的内存实际长度等问 ...

  3. 字典转模型的过程中,空值和id特殊字符的处理

    在IOS 中id是特殊字符,可是非常多时候从网络中下载的数据是以id保存的 假设在定义属性的时候 @property(nonatomic, copy) NSString *id; 就不会出现错误 当键 ...

  4. Java除法结果带小数、进一法的实现 Java问题通用解决代码

    http://blog.csdn.net/windone0109/article/details/5355379进一法: 即省略的位上只要大于零都要进一位 :  四舍五入法: 即省略的位上小于五都要舍 ...

  5. ar命令提取.o的时候报错:is a fat file (use libtool(1) or lipo(1) and ar(1) on it)

    在解压.a文件的时候,报错:s a fat file (use libtool(1) or lipo(1) and ar(1) on it),原因是该.a文件包含了多个cpu架构,比如armv7,ar ...

  6. 类中的internal成员可能是一种坏味道

    前言 最近除了搞ASP.NET MVC之外,我也在思考一些编程实践方面的问题.昨天在回家路上,我忽然对一个问题产生了较为清晰的认识.或者说,原先只是有一丝细微的感觉,而现在将它和一些其他的方面进行了联 ...

  7. nightwatch-js ----并发运行

    从v0.5开始nightwatch支持并发测试.通过在命令行中指定多个环境来工作,用逗号分隔.例如: $ nightwatch -e default,chrome 这样可以在多个相同或是不同的浏览器上 ...

  8. php代码中使用换行及(\n或\r\n和br)的应用

    浏览器识别不了\n或\r\n,这两个换行符是文本换行符,文本文件有效;假设须要将结果输出到浏览器或打印到显示器,代码中使用br;假设仅仅是在源码中换行.则使用\n或\r\n,感兴趣的朋友能够了解下,也 ...

  9. 【已解决】iView-admin Editor 组件 绑定默认值问题

    iView-admin Editor 组件 绑定默认值问题 发现 editor 组件,设置v-model 后, 修改 v-model 数据, editor组件没有自动渲染,需要手动设置渲染  this ...

  10. Verilog利用$fdisplay命令往文件中写入数据

    最近在做的事情是,用FPGA生成一些满足特定分布的序列.因此为了验证我生成的序列是否拥有预期的性质,我需要将生成的数据提取出来并且放到MATLAB中做数据分析. 但是网上的程序很乱,表示看不懂==其实 ...