H264的 DTS/PTS

本文详细解释了DTS(解码时间戳)和PTS(显示时间戳)在mpeg文件解码和显示时的作用。DTS与PTS分别决定了解码器何时解码和显示帧,它们与系统参考时间(SCR)的关系影响了视频的播放顺序和时间同步。文章还讨论了下溢现象及其原因。
DTS(解码时间戳)和PTS(显示时间戳)分别是解码器进行解码和显示帧时相对于SCR(系统参考)的时间戳。SCR可以理解为解码器应该开始从磁盘读取数据时的时间。
mpeg文件中的每一个包都有一个SCR时间戳并且这个时间戳就是读取这个数据包时的系统时间。通常情况下,解码器会在它开始读取mpeg流时启动系统时钟(系统时钟的初始值是第一个数据包的SCR值,通常为0但也可以不从0开始)。
DTS时间戳决定了解码器在SCR时间等于DTS时间时进行解码,PTS时间戳也是类似的。通常,DTS/PTS时间戳指示的是晚于音视频包中的SCR的一个时间。例如,如果一个视频数据包的SCR是100ms(意味着此包是播放100ms以后从磁盘中读取的),那么DTS/PTS值就差不多是200/280ms,表明当SCR到200ms时这个视频数据应该被解码并在80ms以后被显示出来(视频数据在一个buffer中一直保存到开始解码)
下溢通常发生在设置的视频数据流相关mux率太高。如果mux率是1000000bits/sec(意味着解码器要以1000000bits/sec的速率读取文件),可是视频速率是2000000bits/sec(意味着需要以2000000bits/sec的速率显示视频数据),从磁盘中读取视频数据时速度不够快以至于1秒钟内不能够读取足够的视频数据
。这种情况下DTS/PTS时间戳就会指示视频在从硬盘中读出来之前进行解码或显示(DTS/PTS时间戳就要比包含它们的数据包中的SCR时间要早了)。
### H.264 编码中的 PTS DTS 解释 在视频编码领域,特别是针对H.264标准,存在两种重要的时间戳概念:显示时间戳(Presentation Time Stamp, PTS解码时间戳(Decoding Time Stamp, DTS)。这两种时间戳用于同步音视频流并确保播放顺序正确。 #### 显示时间戳 (PTS) 显示时间戳表示帧应当被呈现给观众的时间点。这是指当媒体播放器应该将该特定图像展示出来供观看者看到的具体时刻。对于某些类型的帧来说,比如I帧或P帧,在它们完成解码之后可以立即显示;但对于B帧,则可能需要先解码后面的其他帧才能准确显示出当前这一帧的内容[^1]。 #### 解码时间戳 (DTS) 解码时间戳指的是每一帧数据开始进行解码处理的确切时机。由于B帧的存在以及其特殊的预测方式——可以从前后两方向获取参考信息——因此并非所有的帧都是按照自然顺序来解码的。这意味着有时候为了能够正确重构某一幅画面,必须提前解码一些后续的画面作为参考之用。所以实际上传输过程中可能会出现这样的情况:虽然按正常播放次序来看某个B帧位于两个关键帧之间,但在传输时却会放在这些关键帧之前发送以便及时准备好所需的参考信息。 #### PTSDTS 的关系及差异 - **顺序同**:通常情况下,PTS序列会严格遵循递增规律,因为B帧的存在打破了这种线性排列。而DTS则更倾向于保持一种相对稳定的增长趋势,除非遇到复杂的场景切换等情况。 - **应用场景有别**:PTS主要用于控制最终输出到屏幕上的视觉效果何时显现;而DTS侧重于指导编解码过程内部的操作流程安排,即告诉解码端什么时候启动对某一帧的数据解析工作。 ```c++ // 示例代码片段展示了如何读取NAL单元内的PTS/DTS字段 for each NAL unit { if (nal_unit_type == IDR_SLICE || nal_unit_type == NON_IDR_SLICE) { // 提取出rbsp_trailing_bits之前的最后一个字节 uint8_t last_byte = get_last_rbsp_byte(); // 计算出pic_order_cnt_lsb int poc_lsb = extract_pic_order_cnt_lsb(last_byte); // 使用辅助函数计算完整的POC值 calculate_complete_poc(poc_lsb); // 基于poc确定pts/dts... } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值