h.264 ES流转PS流

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这些天一直在做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);

 

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值