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. hdu - 4974 - A simple water problem(贪心 + 反证)

    题意:N个队(N <= 100000),每一个队有个总分ai(ai <= 1000000),每场比赛比赛两方最多各可获得1分,问最少经过了多少场比赛. 题目链接:http://acm.hd ...

  2. dr-helper项目设计介绍(一个包括移动端和Web端的点餐管理系统)

    一.源代码路径 https://github.com/weiganyi/dr-helper 二.界面 通过浏览器訪问Web服务,能够看到界面例如以下: ADT-Bundle编译project生成dr- ...

  3. MongoDB在Win10下的安装

    原文地址:http://blog.csdn.net/polo_longsan/article/details/52430539 1.下载MongoDB在windows下的安装文件 首先去官网https ...

  4. http://www.bootcss.com/p/font-awesome/design.html

    http://www.bootcss.com/p/font-awesome/design.html <li class="active"> <div class= ...

  5. 高效抽取loading,再多的载入页面也不怕

    当今的app基本上有两个操作,一个是载入数据 ,一个就是把数据显示到页面上.但假设页面特别的多.就每一个页面都要载入数据,就要写 loading 页面.我之前就是用dialog写,抽取出来一个类.哪里 ...

  6. Android Developer:合并清单文件

    使用Android Studio而且基于Gradle构建.每一个App能在多个位置包括清单文件,比如在src/main文件夹下productFlavor.库.Android ARchive(AAR) ...

  7. Atitit. Atiposter 发帖机版本历史 编年史

    Atitit. Atiposter 发帖机版本历史 编年史 V1  初步实现sina csdn cnblogs V2  实现qzone sohu 的发帖功能  顺便重构接口实现分离 V3多文件循环发帖 ...

  8. linux 进程线程

    linux下进程的最大线程数.进程最大数.进程打开的文件数   ===========最大线程数============== linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_TH ...

  9. IE下object元素遮挡div表单

    目前遇到这样的一个问题: 我用ActiveX插件做了一个C#的播放器,要将这个插件放到web浏览器中,然后可以通过前台页面来控制视频的播放,暂停还有回放,这个时候发现object的onclick事件无 ...

  10. ImportError: No module named '_sqlite3'

    问题: Python 3.5.1 报错如下 Traceback (most recent call last): File "manage.py", line 16, in < ...