MPEG2演示时间戳(PTS)计算

Nab*_*jon 7 c++ video mpeg2-ts

我有一个MPEG2 TS文件,现在我有兴趣从每个相框中提取PTS信息.我知道PTS用33位描述,包括3个标记位.但我不知道如何将这个位域转换为更易理解的形式(秒,毫秒).请有人帮帮我

Ale*_*x I 16

MPEG2传输流时钟(PCR,PTS,DTS)都具有1/90000秒的单位.PTS和DTS有三个标记位,您需要跳过它们.模式总是(从最高位到最低位)3位,标记,15位,标记,15位,标记.标记必须等于1.在C中,删除标记将如下工作:

uint64_t v; // this is a 64bit integer, lowest 36 bits contain a timestamp with markers
uint64_t pts = 0;
pts |= (v >> 3) & (0x0007 << 30); // top 3 bits, shifted left by 3, other bits zeroed out
pts |= (v >> 2) & (0x7fff << 15); // middle 15 bits
pts |= (v >> 1) & (0x7fff <<  0); // bottom 15 bits
// pts now has correct timestamp without markers in lowest 33 bits 
Run Code Online (Sandbox Code Playgroud)

它们还具有9位的扩展字段,形成42位整数,其中扩展是最低有效位.基数+扩展的单位是1/27000000秒.许多实现将扩展名全部保留为零.


小智 5

24小时/天* 60分钟/小时* 60秒/分钟* 90k /秒(时钟)= 7962624000,需要表示33位;您可以使用此信息从时钟中提取时间;

  • @wick不,不幸的是,这并不意味着那样。PTS以任意值开头,标准中未指定。产生传输流的大多数程序/设备在每个流的开头都从0开始。它们“可以”以PTS表示的一天中的某个时间开始,但实际上没有人这样做。 (3认同)