如何将y4m文件转换成yuv文件

2022-11-08 13:07:55 浏览数 (1)

目录

  • 前言
  • 正文

前言

有没有遇到过下载的视频原始数据文件是y4m格式的情况,没有办法播放和查看,是不是很苦恼,本文教你处理方法。

正文

一、y4m是什么文件

在理解y4m格式之前,我们首先需要清楚y4m格式的文件中存储的到底是什么信息。

这里有一个示例文件,有需要的话可以直接点击下载:

http://samples.mplayerhq.hu/yuv4mpeg2/example.y4m.bz2

其实,YUV4MPEG2是一种简单的文件格式,用于保存YCbCr颜色空间未压缩的视频帧,其格式为YCbCr 4:2:0、YCbCr 4:2:2或YCbCr 4:4:4数据。名称中的“YUV”部分源于这样一个事实:颜色空间YCbCr(用于数字媒体中的颜色编码)经常与颜色空间YUV(用于模拟PAL应用程序,包括模拟电视和视频磁带)错误地混淆。由于最初的MPEG-2规范支持多种颜色空间(BT.601、BT.709等),如果没有这种格式的扩展,就无法知道用于从RGB转换为YCbCr的颜色空间。

二、文件参数

文件头:文件头是以明文形式存储的,前10个字节为固定的"YUV4MPEG2 "第十个字节为空格(ASCII 0x20)。紧接着是各个参数,以空格分割(ASCII 0x20)。然后文件头尾部是一个换行(ASCII 0x0A)。

文件头的参数如下:

  • 帧宽:'W'后跟明文整数,如'W720'表示帧宽为720
  • 帧高:'H'后跟明文整数,如'H480'表示帧高为480
  • 帧率:'F'后跟以':'分隔的两个明文整数

'F30:1' = 30fps

'F25:1' = 25 FPS (PAL/SECAM standard)

'F24:1' = 24 FPS (Film)

'F30000:1001' = 29.97 FPS (NTSC standard)

'F24000:1001' = 23.976 FPS (Film transferred to NTSC)

  • 交错方式:'I'后跟一个单字符

'Ip' = Progressive

'It' = Top field first

'Ib' = Bottom field first

'Im' = Mixed modes (detailed in FRAME headers)

  • 参数'A':表示像素宽高比(注意不是图像宽高比)

'A0:0' = unknown

'A1:1' = square pixels

'A4:3' = NTSC-SVCD (480x480 stretched to 4:3 screen)

'A4:5' = NTSC-DVD narrow-screen (720x480 compressed to a 4:3 display)

'A32:27' = NTSC-DVD wide-screen (720x480 stretched to a 16:9 display)

  • 参数'C':颜色空间

'C420jpeg' = 4:2:0 with biaxially-displaced chroma planes

'C420paldv' = 4:2:0 with vertically-displaced chroma planes

'C420' = 4:2:0 with coincident chroma planes

'C422' = 4:2:2

'C444' = 4:4:4

  • 参数'X':被忽略,不处理

每个帧以5个字节的“frame”开头,后跟0个或多个参数,每个参数前面都有0x20,最后是0x0A。然后是每个平面的原始字节。

每一个视频帧的原始数据大小计算公式如下:

帧大小 = width * height * 3 / 2 (4:2:0)

帧大小 = width * height * 2 (4:2:2)

帧大小 = width * height * 3 (4:4:4)

三、文件结构

文件结构图如下:

四、示例文件

我们可以使用UltraEdit工具打开对应的y4m文件,同时查看文件内容和16进制编码信息,文件开头信息如下图所示:

五、如何将y4m转成yuv

现在我们回归主题:如何将y4m文件转换成yuv文件?介绍了那么多,为的就是引出第一种方法。

5.1 方法一

既然我们已经知道y4m文件结构,那么我们完全可以自己写一个工具,按照上文的规范将视频原始信息数据从y4m文件中提取出来,组成一个全新的yuv文件。

但是,这个方法实现起来比较有难度。以后等我有时间了,我会自己搞一个,到时候回来更新本文。

5.2 方法二

考虑到实用性,我现在介绍一个拿来即用的方法,那就是利用ffmpeg来搞。

比如,我们需要yuv420p的yuv文件,具体的ffmpeg命令如下:

ffmpeg -i .yuvtouchdown_pass_1080p.mp4 -f rawvideo -pix_fmt yuv420p .yuvtouchdown_pass_1080p.out.yuv

说真的,这个命令搞了好久才搞出来,网上实在找不到好用的命令,走了好多冤枉路。

作者简介:

0 人点赞