zoukankan      html  css  js  c++  java
  • (转) 从ffmpeg中提取出YUV数据

    有时需要从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
  • 相关阅读:
    10.28
    10.29
    11.05周四
    数据库增删改查
    11.03Tuesday
    11.10
    连接数据库
    10.30
    11.04周三
    10.27
  • 原文地址:https://www.cnblogs.com/lihaiping/p/4032533.html
Copyright © 2011-2022 走看看