为什么我的流中PTS和DTS相同?

8

我正在使用ffprobe测试一个带有H264视频的mp4文件。 我使用以下命令获取帧信息。

ffprobe -i <input_mp4_file> -show_frames -select_streams v

我得到了以下输出。
[FRAME]
media_type=video
stream_index=0
key_frame=1
pkt_pts=0
pkt_pts_time=0.000000
pkt_dts=0
pkt_dts_time=0.000000
best_effort_timestamp=0
best_effort_timestamp_time=0.000000
pkt_duration=512
pkt_duration_time=0.033333
pkt_pos=48
pkt_size=513516
width=1920
height=1920
pix_fmt=yuv420p
sample_aspect_ratio=1:1
pict_type=I
coded_picture_number=0
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
[/FRAME]
[FRAME]
media_type=video
stream_index=0
key_frame=0
pkt_pts=512
pkt_pts_time=0.033333
pkt_dts=512
pkt_dts_time=0.033333
best_effort_timestamp=512
best_effort_timestamp_time=0.033333
pkt_duration=512
pkt_duration_time=0.033333
pkt_pos=513564
pkt_size=3299
width=1920
height=1920
pix_fmt=yuv420p
sample_aspect_ratio=1:1
pict_type=P
coded_picture_number=1
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
[/FRAME]
[FRAME]
media_type=video
stream_index=0
key_frame=0
pkt_pts=1024
pkt_pts_time=0.066667
pkt_dts=1024
pkt_dts_time=0.066667
best_effort_timestamp=1024
best_effort_timestamp_time=0.066667
pkt_duration=512
pkt_duration_time=0.033333
pkt_pos=823989
pkt_size=40971
width=1920
height=1920
pix_fmt=yuv420p
sample_aspect_ratio=1:1
pict_type=B
coded_picture_number=4
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
[/FRAME]
[FRAME]
media_type=video
stream_index=0
key_frame=0
pkt_pts=1536
pkt_pts_time=0.100000
pkt_dts=1536
pkt_dts_time=0.100000
best_effort_timestamp=1536
best_effort_timestamp_time=0.100000
pkt_duration=512
pkt_duration_time=0.033333
pkt_pos=784312
pkt_size=38785
width=1920
height=1920
pix_fmt=yuv420p
sample_aspect_ratio=1:1
pict_type=B
coded_picture_number=3
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
[/FRAME]
[FRAME]
media_type=video
stream_index=0
key_frame=0
pkt_pts=2048
pkt_pts_time=0.133333
pkt_dts=2048
pkt_dts_time=0.133333
best_effort_timestamp=2048
best_effort_timestamp_time=0.133333
pkt_duration=512
pkt_duration_time=0.033333
pkt_pos=516886
pkt_size=267344
width=1920
height=1920
pix_fmt=yuv420p
sample_aspect_ratio=1:1
pict_type=P
coded_picture_number=2
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
[/FRAME]

我的mp4文件包含 I、P 和 B 帧。我知道DTS是解码时间戳,它将在解码器输入流中按递增顺序出现。PTS是演示时间戳,在解码器输出流中也将按递增顺序出现。

但是我不明白为什么所有帧的PTS和DTS值都相同。我认为当流中有B帧时它们应该是不同的。

请有经验的人帮我理解这个问题好吗?


1
如果您的视频中有B帧,则DTS和PTS不能与B帧相同,因为由于双向依赖关系,在I和P帧之前无法解码B帧。 - Raghvendra Kumar
2个回答

6
数值不是您所期望的DTS/PTS,注意pkt_前缀。请参见这里

pkt_pts

从解码产生此帧的AVPacket复制的PTS。

pkt_dts

从触发返回此帧的AVPacket复制的DTS。

如果您执行-show_packets,则应看到不同的值。

有没有一种使用ffmpeg获取PTS和DTS的方式? - MayurK
5
好的,使用ffmpeg -i in.mp4 -dump -map 0:v -f null -命令。该命令的作用是将输入文件"in.mp4"中的视频流提取出来并输出到空设备中,不会产生任何实际输出。 - Gyan
@Mulvya:谢谢!我明白了。我需要按D键,它会显示pts和dts。我还有一个问题。我能在这个打印中同时打印“coded_picture_number”或“display_picture_number”吗? - MayurK
@argistal:您能简要解释一下什么是“pkt_pts”和“pkt_dts”吗?它们有什么用途? - MayurK
2
@MayurK 帧pkt_ptspkt_dts适用于解码后的帧,均为用于显示的演示时间戳。在这种情况下,DTS是基于原始数据包解码时间的演示时间戳。请参见此处:https://trac.ffmpeg.org/ticket/2375 - aergistal

3

这是我最终找到的。

ffmpeg -i -dump -map 0:v -f null –

然后按下“D”键以获取PTS和DTS打印输出。 它会打印按解码顺序排列的帧的PTS和DTS。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接