这些天一直在做h.264 ES流转PS流的方法。现在把我的一点小经验总结下。
1、将SPS,PPS和IDR帧组合成一个PES包,其他I、P、B帧分别为一个PES包。
2、每个IDR帧的封包顺序从外到里分为为PS头,PSM头,PES头。其他I、P、B帧从外到里为PS头,PES头。
3、可以将PES包里的PES_packet_length填写为0x00,但封装后的PS流,一般VLC和ffmjpeg可以播放,但storm不可以。如果要填充PES_packet_length的话,需要进行分包,因为PES_packet_length是两个字节,最大支持0xFFFF个字节,当数据包长度大于这个的时候需要分包。分包时不用管NALU的完整性。
4、时间戳和SRC的对应方法:时间戳(ms) = SRC/90
其中包头打包的部分代码如下:
int make_ps_packet_header(unsigned char *_pHeader,unsigned int _iHeaderLen,unsigned int _iResolutionFlag,unsigned int _iFrameIndex)
{
if (NULL == _pHeader || _iHeaderLen < sizeof(PS_HEADER_tag))
{
return -1;
}
PS_HEADER_tag ePSHeader;
float fInterval = 33.3333333333;
UINT64 ui64SCR = fInterval * _iFrameIndex * 90;
ePSHeader.setSystem_clock_reference_base(ui64S