目录
- 前言
- 正文
前言
有没有遇到过下载的视频原始数据文件是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
说真的,这个命令搞了好久才搞出来,网上实在找不到好用的命令,走了好多冤枉路。
作者简介: