(转) 从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

时间: 2024-10-05 09:44:53

(转) 从ffmpeg中提取出YUV数据的相关文章

从一段文字中提取出uri信息

package handle.groupby; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer

批量从apk文件中提取出so文件

应用场景 在不解压apk文件夹的情况下批量的从apk文件中提取出所有的so文件.这样你即不用使用apktool 这些工具令产生大量的中间文件,或者将apk的后缀变为.zip,然后在解压,节省了磁盘空间. 功能说明 提取出一系列的apk文件然后提取出它们中的所有so文件,按照apk的名字以及它们之前所在的文件夹进行存储.如下图所示: 代码实现 #!/usr/bin/env python # coding=utf-8 import zipfile import os path = "/home/ch

如何从代码中提取出SQL用于调试?

这个SQL稍微有点复杂,未截图部分大概还有200多行,之前的同事没有写在一行,想要直接贴在SQL编译器里直接运行有点困难. 1,’将包含代码的SQL复制到文本记事本里. 2,将SQL括号左边的内容替换成空的. 3,将SQL右边的括号替换成空的 4,将SQL复制到https://tool.lu/sql/    进行SQL美化 5,将所有的参数进行设置,同样在记事本中替换成可以测试的参数. 之后就可以复制到编译器里执行和分析了. 原文地址:https://www.cnblogs.com/CryOnM

ffmpeg最简单的解码保存YUV数据 &lt;转&gt;

video的raw data一般都是YUV420p的格式,简单的记录下这个格式的细节,如有不对希望大家能指出.   YUV图像通常有两种格式,一种是packet 还有一种是planar    从字面上就能理解packet的意思就是所有的yuv数据都是一股脑的放在一起,当然 内部的数据还是按照格式要求的,只是从外部来讲是一整个包包含了所有的yuv数据.最长见的YUV格式就是planar格式了.这个格式是讲yuv三个分量分别放在三个数组里.   如下图是个420p的格式图: YUV420格式是指,每

批量提取出apk文件中的classes.dex文件

应用场景 如果需要批量分析apk以及每个apk文件中的classes.dex 文件.怎么提取出它们?将apk改后缀名变为.zip文件,之后在解压,提取出每个apk文件中的classes.dex文件,这是一个可行的方案.但是中间解压大量的apk文件会占据我们的大量磁盘存储空间,怎么在不解压文件的情况下提取出dex文件?在这里使用python自带的zipfile类,可以轻松的解决这个问题. 代码实现: #!/usr/bin/env python # coding=utf-8 ''' @author

【记录】T-SQL 分组排序中取出最新数据

原文:[记录]T-SQL 分组排序中取出最新数据 示例 Product 表结构: 示例 Product 表数据: 想要的效果是,以 GroupName 字段分组,取出分组中通过 Sort 降序最新的数据,通过示例数据,可以推算出结果数据的 ID 应该为:7.5.3. 示例 SQL 代码: select * from Product p where ID=(select top 1 ID from Product where p.GroupName=GroupName order by Sort

数据库之取出表中最新时间的数据

以下内容仅做备忘 假设有以下表格[FM_ALARM] RES_ID : 资源的唯一标识 OCCUR_TIME : 发生时间(毫秒时间戳) SEVERITY : 告警级别 数据会实时变更,我要取出所有数据的最新一条记录,则可以使用以下SQL select res_id, severity from fm_alarm t where not exists (select 1 from fm_alarm where t.res_id = res_id and t.occur_time < occur_

[MATLAB&amp;SIMULINK] 如何提取并处理Simscape Power System 中powergui的谐波分析数据

花了一两个小时研究了一番powergui的fft.在powergui中,FFT Analysis Tool如图所示 那么如果我想提取出Simulink模型中的数据并且做fft处理,得到自己想要的分析图像,应该怎么办呢? 方法一: 其实MATLAB在这个过程中调用了power_fftscope()这个函数.它的函数原型可以在matlab的帮助文档中找到.函数调用的格式如下. 在command窗口里输入如下命令即可设定与调用由FFT Analysis Tool产生的波形数据 >> FFTDATA

零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构(转)

在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构:  (1) AVFormatContext  AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数.FFmpeg代码中对这个数据结构的注释是:format I/O context 此结构包含了一个视频流的格式内容.其中存有了AVInputFormat(or AVOutputFormat同一时间AVFormatContext内只能存在其中一个),和AVStream.AVPack