PES包的PTS详解

PES包的PTS详解

之前做ts转flv用的是osmf框架,那个东东略复杂,和自己的代码结合后想调整某个地方有些困难,所以还是打算自己来解ts并进行封装。

其中的pts的获取上网查了下,结构图差点没看懂是怎么回事,后来终于搞懂了,浪费了很多时间,这里记录一下吧。


首先是这个图,我被这个图坑了,看了半天没看明白。


上面这个图其实不是很清楚,看了几次还是不知道怎么弄pts,后来在标准上看到了另外一个图,这个就清晰很多了。


其中有箭头指向的表示当前边的flags为1时,将会有后边深色的字段部分。

packet start code prefix:为0x000001;

stream id:

每个字段就不详解了,直接找我要的PTS吧。

先找到original or copy后边得"7 flags",得出是否有pts/dts的标志,标志为高两位,所以 标志= ("7 flags" & 0xc0 )  >>  6;

标志第一位是PTS标识,第二位是DTS标识。

标志:00,表示无PTS无DTS;

             01,错误,不能只有DTS没有PTS;

             10,有PTS;

     11,有PTS和DTS.


接下来,跳过8字节的PES header  data length;

虽然由第二个图可以知道PTS有33位,但是它不是直接的33位数据,而是占了5个字节,PTS分别在这5字节中取。


见过上边这个图的就应该比较清楚了,PTS的33位的各部分是如上图那样分布的,如果从左至右的绿色部分分别为PTS1,PTS2,PTS3的话,那么:

PTS  = (PTS1 & 0x0e) << 29 + (PTS2 & 0xfffe) << 14 + (PTS3 & 0xfffe ) >> 1;

DTS(如果有)紧接着后边读取5个字节的数据,也是这样求出来的。


本文部分图片转自http://www.yunlipiao.com/208.html


  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在FFmpeg中,PTSDTS是用于描述音视频帧时间戳的两个参数,PTS表示音视频帧的显示时间戳,DTS表示音视频帧的解码时间戳。通常情况下,PTSDTS的计算是由编码器和解码器自动完成的,但在某些情况下,需要手动计算PTSDTS。 在手动计算PTSDTS时,需要了解以下几个概念: 1. `AVRational`:FFmpeg中用于表示分数的结构体,常用于描述时间基等参数。 2. `AVCodecContext.time_base`:编解码器的时间基,用于描述PTSDTS的时间单位。 3. `AVFrame.best_effort_timestamp`:音视频帧的时间戳,通常作为解码器计算PTSDTS的参考值。 计算PTSDTS的主要步骤如下: 1. 获取音视频帧的时间戳`frame_timestamp`和时间基`time_base`,并将其转换为以毫秒为单位的时间戳,例如: ``` int64_t frame_timestamp_ms = (frame_timestamp * 1000) / av_q2d(time_base); ``` 2. 计算PTSDTS的值。对于视频帧,PTSDTS的值通常相等,可以直接使用`frame_timestamp_ms`的值。对于音频帧,PTSDTS的值应该根据音频帧的采样率和采样大小进行计算,例如: ``` int64_t pts = av_rescale_q(frame_timestamp_ms, time_base, AV_TIME_BASE_Q); int64_t dts = pts - (audio_sample_size * 1000) / audio_sample_rate; ``` 其中,`audio_sample_size`表示音频采样大小,`audio_sample_rate`表示音频采样率。 3. 将PTSDTS的值设置到AVFrame结构体的pts和pkt_dts字段中,例如: ``` frame->pts = pts; frame->pkt_dts = dts; ``` 需要注意的是,PTSDTS的计算可能受到音视频帧率、编码时长、音频采样率等多个因素的影响,具体计算方法需要根据具体情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值