码迷,mamicode.com
首页 > 其他好文 > 详细

(转) 从ffmpeg中提取出YUV数据

时间:2014-10-18 09:43:41      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   os   ar   使用   for   strong   sp   

有时需要从ffmpeg中提取出YUV数据用作预览,另存什么的。
ffmpeg是先解码成YUV, 再以这个YUV作为输入进行编码,
所以YUV数据有两种:
  解码后的YUV数据, 以及
  编码重建的YUV数据。
下面分别讲两个YUV数据从哪儿?以及如何取?

1. 解码后的YUV数据
在ffmpeg/libavcodec/utils_codec.c的
avcodec_decode_video2() 函数中:

avcodec_decode_video2(...)
{
  ... 
  ret = avctx->codec->decode(avctx, picture, got_picture_ptr,avpkt);
  /* 插入如下代码代码 */
  // picture.data 就包含了解码后的YUV数据
  {
    int i, j;
    int shift;
    char *yuv = NULL;
    FILE *fp = fopen("dec_output.yuv", "ab+");  // 一定要用‘b‘打开,不然会数据错位
    
    for (i = 0; i < 3; i++)
    {
      shift = i>0 ? 1 : 0;
      yuv = picture.data[i];
      for (j = 0; j < picture.height>>shift; j++)
      {
        fwrite(yuv, sizeof(char), picture.width>>shift, fp); // 每次写一行YUV帧数据
        yuv += picture.linesize[i]; // ffmpeg将解码数据进行了扩边,需要以扩边为步长,找下行数据。  
      }
    }
    
    fflush(fp);
    fclose(fp);
  }
  /* 插入代码结束 */  
  picture->pkt_dts= avpkt->dts;
  ...
}


2. x264编码重建后的YUV数据
现在视频编码格式通常是H.264,
x264已有重建YUV写成文件的接口,所以可以直接使用。
对应的参数为:

ffmpeg -i INPUT ... -vcodec libx264 -x264opts dump-yuv=recon.yuv -f flv -y OUTPUT 

输出文件在:
x264/encoder/encoder.c的
x264_encoder_frame_end()函数中:
x264_encoder_frame_end()
{
  ...
  if( h->param.psz_dump_yuv )
     x264_frame_dump( h );    //YUV数据参照这个函数就能获得
  ... 
}
 
转自:http://blog.chinaunix.net/uid-26000296-id-3570272.html

(转) 从ffmpeg中提取出YUV数据

标签:style   blog   http   os   ar   使用   for   strong   sp   

原文地址:http://www.cnblogs.com/lihaiping/p/4032533.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!