这些天一直在做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(ui64SCR);
ePSHeader.setProgram_mux_rate(160001);

本文介绍了将H.264 Elementary Stream (ES) 转换为 Program Stream (PS) 流的过程,主要包括SPS、PPS、IDR帧与其他I、P、B帧的PES包组合方式,以及封包顺序和时间戳的处理。重点讨论了PS头、PSM头、PES头的构建,并提供了部分关键代码示例。
最低0.47元/天 解锁文章
1386

被折叠的 条评论
为什么被折叠?



