博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转) 从ffmpeg中提取出YUV数据
阅读量:5930 次
发布时间:2019-06-19

本文共 1157 字,大约阅读时间需要 3 分钟。

有时需要从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

转载地址:http://znktx.baihongyu.com/

你可能感兴趣的文章
Dell XPS 15 9560 Linux mint
查看>>
QQ登录网站接入
查看>>
PHP 方法覆盖override 与 抽象方法的实现之间的关系
查看>>
Git远程操作详解
查看>>
file_get_contents 超时处理
查看>>
源代码解读Spring只读事务与读写事务的性能的差别
查看>>
solr自定义分词
查看>>
Linux:査看文件的详细信息
查看>>
微信小程序
查看>>
ThinkPHP视频学习教程,thinkcmf基础入门-the lesson 1
查看>>
好色鬼 颜色收藏
查看>>
Java报表工具技巧--在Style Report 中如何将报表服务部署到weblogic中
查看>>
memcache
查看>>
SoftReference, WeakReference, PhantomReference
查看>>
HttpUrlConnection上传文件
查看>>
一个可以获取linux 系统硬件相关信息的类
查看>>
django DateTimeField 字段在模板中显示格式问题
查看>>
PHP7 Memcache 扩展
查看>>
NAT 类型
查看>>
IO处理线程
查看>>