• (转) 从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
  • 相关阅读:
    Binder机制1---Binder原理介绍
    ShareSDK for iOS 2.9.0已经公布
    TCP/IP数据包结构具体解释
    苹果ipa软件包破解笔记
    自己定义对象的监听方式
    强大的PropertyGrid
    matlab中plot使用方法
    fopen 參数具体解释
    leetcode:linked_list_cycle_II
    AssemblyInfo.cs文件的作用
  • 原文地址:https://www.cnblogs.com/lihaiping/p/4032533.html
Copyright © 2020-2023  润新知