(转)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;
    }

 

  以上。

转载于:https://www.cnblogs.com/tangxiacun/p/4547927.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值