目录
- 参考
- 格式介绍
- 具体文件分析
1. 参考
2. 格式介绍
IVF是一个非常简单的视频容器。用于封装VP8/VP9/AV1的数据。
文件的格式如下所示:
IVF header | Frame header | Frame payload | Frame header | Frame payload |...
- 格式由IVF header和多个帧数据组成。
- 帧由header和payload组成。
IVF header 由32字节组成,下面多字节的数据是采用小端编码(little-endian)。
字节 | 描述 |
---|---|
0-3 | 固定的'DKIF'字符串 |
4-5 | version,应该为0 |
6-7 | header的字节长度 |
8-11 | 编码器的FourCC (e.g., 'VP80') |
12-13 | width in pixels |
14-15 | height in pixels |
16-19 | framerate,单位为(1/timescale) |
20-23 | timescale |
24-27 | 帧的个数 |
28-31 | unused |
Frame header 由12字节组成。
字节 | 描述 |
---|---|
0-3 | Frame playload的字节长度 |
4-11 | 64-bit表示的pts时间戳 |
解析的代码可以参考FFmpeg/libavformat/ivfdec.c
3. 具体文件分析
以下为ivf开头的一部分的hex查看形式。
00000000: 444b 4946 0000 2000 4156 3031 0005 d002 DKIF.. .AV01..?.
00000010: c05d 0000 e903 0000 0000 0000 0000 0000 ?]..?...........
00000020: 585a 0000 0000 0000 0000 0000 1200 0a0b XZ..............
00000030: 0000 00fa a67f d9e4 10ac 121a 1710 0227 ...??.??.?.....'
00000040: c8c8 8124 0820 1800 0821 249a 6acb 3efd ?..$. ...!$?j?>?
- 444b 4946 -> DKIF
- 0000 -> version = 0
- 2000 -> header的字节长度 = 0x0020 = 32。(注意是小端(little-endian)编码,低地址存储低有效字节。
- 4156 3031 -> AV01
- 0005 -> width = 0x0500 = 1280
- d002 -> height = 0x02d0 = 720
- c05d 0000 -> framerate = 0 / 0x5dc0 = 0 / 24000,单位为timescale
- e903 0000 -> timescale = 0x03e9 = 1001,所以实际的帧率为24000/1001≈ 23.976
- 0000 0000 -> 帧的个数 = 0,没有存储有效的数据。
- 0000 0000 -> unused
第一个Frame header
- 585a 0000 -> Frame playload的字节长度 = 0x5a58 = 23128
- 0000 0000 -> pts时间戳 = 0
网友评论