使用 H264 数据编码 fmp4 文件时如何填充 avcC 框?
How to populate avcC box when encoding fmp4 file with H264 data?
我的 h264 帧只有 I/P 帧。
我填写的avcC框如下,但是无法用VLC播放器播放(时间戳运行但是没有图像)
AVC解码器配置记录:
起始偏移量 511 (0X000001FF)
盒子尺寸 39 (0X00000027)
盒子类型 avcC (0X61766343)
详细信息:
配置版本 1 (0X00000001)
AVC 配置文件指示 Main = 77 (0X0000004D)
AVC 配置文件兼容性 0 (0X00000000)
AVC电平指示42(0X0000002A)
NAL 单元长度大小 3 (0X00000003)
Num 序列参数集 1 (0X00000001)
序列参数集(0) 0x67 0x4d 0x00 0x2a 0x96 0x35 0xc0 0xf0 0x04 0x4f 0xcb 0x37 0x01 0x01 0x01 0x02
num个图片参数集1(0X00000001)
图片参数集(0) 0x68 0xee 0x3c 0x80
H264 IDR 帧(SPS PPS SEI):
无符号字符 IDR_NALU[] = { 0x00,0x00,0x00,0x01, 0x67,0x4D,0x00,0x2A, 0x96,0x35,0xC0,0xF0, 0x04,0x4F,0xCB,0x37, 0x01, 0x01,0x01,0x02,0x00,0x00,0x00,0x01,0x68,0xEE,0x3C,0x80,0x00,0x00,0x00,0x01,0x06,0xE5,0x01,0x2E,0x80/I帧数据省略/ };
我觉得我的avcC框填错了,但我不知道怎么填才正确。哪位高手可以帮帮我
下面是一些关于如何编写avcC框内容的伪代码:
// Version
Write(0x1);
// Profile
Write(sps[0].data[1]);
// Compatibility
Write(sps[0].data[2]);
// level
Write(sps[0].data[3]);
// Reserved (6 bits), NAL Unit length size - 1 (2 bits)
Write(0xFC | 3);
// Reserved (3 bits), num of SPS (5 bits)
Write(0xE0 | 1);
// 2 bytes for length of SPS
WriteWord(sps[0].size);
// Data of SPS
for (size_t i = 0; i < sps[0].size(); ++i)
{
Write(sps[0].data[i]);
}
// Number of PPS
Write(&b, pps.size());
for (size_t i = 0; i < pps.size(); ++i)
{
// 2 bytes for length of PPS
WriteWord(pps[i].size);
for (size_t j = 0; j < pps[i].size; ++j)
{
// Data of PPS
Write (pps[i].data[j]);
}
}
我的 h264 帧只有 I/P 帧。
我填写的avcC框如下,但是无法用VLC播放器播放(时间戳运行但是没有图像)
AVC解码器配置记录:
起始偏移量 511 (0X000001FF)
盒子尺寸 39 (0X00000027)
盒子类型 avcC (0X61766343)
详细信息:
配置版本 1 (0X00000001)
AVC 配置文件指示 Main = 77 (0X0000004D)
AVC 配置文件兼容性 0 (0X00000000)
AVC电平指示42(0X0000002A)
NAL 单元长度大小 3 (0X00000003)
Num 序列参数集 1 (0X00000001)
序列参数集(0) 0x67 0x4d 0x00 0x2a 0x96 0x35 0xc0 0xf0 0x04 0x4f 0xcb 0x37 0x01 0x01 0x01 0x02
num个图片参数集1(0X00000001)
图片参数集(0) 0x68 0xee 0x3c 0x80
H264 IDR 帧(SPS PPS SEI):
无符号字符 IDR_NALU[] = { 0x00,0x00,0x00,0x01, 0x67,0x4D,0x00,0x2A, 0x96,0x35,0xC0,0xF0, 0x04,0x4F,0xCB,0x37, 0x01, 0x01,0x01,0x02,0x00,0x00,0x00,0x01,0x68,0xEE,0x3C,0x80,0x00,0x00,0x00,0x01,0x06,0xE5,0x01,0x2E,0x80/I帧数据省略/ };
我觉得我的avcC框填错了,但我不知道怎么填才正确。哪位高手可以帮帮我
下面是一些关于如何编写avcC框内容的伪代码:
// Version
Write(0x1);
// Profile
Write(sps[0].data[1]);
// Compatibility
Write(sps[0].data[2]);
// level
Write(sps[0].data[3]);
// Reserved (6 bits), NAL Unit length size - 1 (2 bits)
Write(0xFC | 3);
// Reserved (3 bits), num of SPS (5 bits)
Write(0xE0 | 1);
// 2 bytes for length of SPS
WriteWord(sps[0].size);
// Data of SPS
for (size_t i = 0; i < sps[0].size(); ++i)
{
Write(sps[0].data[i]);
}
// Number of PPS
Write(&b, pps.size());
for (size_t i = 0; i < pps.size(); ++i)
{
// 2 bytes for length of PPS
WriteWord(pps[i].size);
for (size_t j = 0; j < pps[i].size; ++j)
{
// Data of PPS
Write (pps[i].data[j]);
}
}