【问题标题】:Why PTS and DTS are same in my stream?为什么我的直播中的 PTS 和 DTS 相同?
【发布时间】:2017-03-28 14:14:59
【问题描述】:

我正在使用 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 帧时它们应该是不同的。

有人请帮我理解这个吗?

【问题讨论】:

  • 如果您的视频中有B帧,那么DTS和PTS不能相同,因为双向依赖,B帧不能在I和P帧之前解码。

标签: ffmpeg mp4 h.264 ffprobe


【解决方案1】:

这些值不是您期望的 DTS/PTS,请注意 pkt_ 前缀。见here

pkt_pts

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

pkt_dts

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

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

【讨论】:

  • 有没有办法使用ffmpeg获取PTS和DTS?
  • 是的,使用ffmpeg -i in.mp4 -dump -map 0:v -f null -
  • @Mulvya:谢谢!我知道了。我需要按 D,它会显示 pts 和 dts。我还有一个问题。我可以用这个打印来打印“coded_picture_number”或“display_picture_number”吗?
  • @argistal:你能简单解释一下什么是“pkt_pts”和“pkt_pts”吗?它们是干什么用的?
  • @MayurK 帧pkt_ptspkt_dts 应用于解码 帧,它们都是用于显示的表示时间戳。在这种情况下,DTS 表示基于原始数据包解码时间的呈现时间戳。见这里:trac.ffmpeg.org/ticket/2375
【解决方案2】:

这是我终于找到的。

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

然后按“D”获取 PTS 和 DTS 打印。 它按解码顺序打印帧的 PTS 和 DTS。

【讨论】:

    猜你喜欢
    • 2014-04-19
    • 2012-11-15
    • 2018-05-12
    • 2018-08-08
    • 2011-08-28
    • 2015-11-02
    • 2020-06-14
    • 2015-11-05
    • 2021-09-05
    相关资源
    最近更新 更多