如何在H264字节流中分离I帧(IDR片)和P帧(非IDR片)?

时间:2018-03-21 04:32:04

标签: h.264 openh264

我通过从IP摄像机解包视频片段来创建H264字节流。

我使用以下语法:

var dynamicConfig = ["Test1","Test22","Test3","Test14"];
var staticConfig = [{label: 'Test 1',value: 'Test1'},
				 {label: 'Test 2',value: 'Test2'},
				 {label: 'Test 3',value: 'Test3'}
				];
var setObj = new Set();
for(var i = 0; i < staticConfig.length; i++){
	var obj = staticConfig[i];
	setObj.add(obj.value);
}

function configObj(dynamicConfig, setObj) {
var templateArray = [];
   for (var j = 0; j < dynamicConfig.length; j++) {
	  if (setObj.has(dynamicConfig[j])) {
		templateArray.push(dynamicConfig[j]);
	  }
   }
 
 console.log(templateArray);
 return templateArray;
}    
configObj(dynamicConfig, setObj);

解码此字节流后,我得到了半模糊的图像。我假设这是因为缺少P切片

如何在I帧之后附加P帧以获得正确的视频帧? 应该如下:

0x000001[SPS] 0x000001[PPS] 0x000001[I slice]

提前致谢!

1 个答案:

答案 0 :(得分:0)

你在做什么看起来是正确的。 .h264文件包含原始H.264 NAL单元,由起始码前缀等于0x000001分隔。这是ISO / IEC 14496-10,附录B中定义的字节流格式。标准说“字节流中字节流NAL单元的顺序应遵循字节流NAL单元中包含的NAL单元的解码顺序” 。所以你可以附加你的P帧,因为你应该从你的相机按解码顺序接收它们。

可能你的问题有不同的原因。你如何处理仿真预防字节? “NAL单元中可能存在的字节等于0x03。仿真阻止字节的存在确保NAL单元中没有连续字节对齐字节的序列包含起始码前缀。”

因此.h264文件必须包含仿真阻止字节。但是你的视频片段是否包含它们?