ffprobe -show_packets和-show_frames之间的区别

一、show_packets

我们只查看视频的packets

ffprobe -show_packets "rtmp://jdpull.jd.com/live/14042733" -of xml | grep video	

结果如下: 

									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									

可以看到,视频流的pts和dts并不同步,说明有B帧,dts递增,pts因为有B帧的原因所以非递增。所以,当使用show_packets分析视频流时,其实分析的是帧 frame,这里无论I帧,P帧还是B帧都还没有被解码。

二、show_frames

ffprobe -show_frames "rtmp://jdpull.jd.com/live/14042733" -of xml | grep video

结果如下 

									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									
									

可以看到,视频流的pts和dts依旧不同步(有B帧),但都是递增的,这是因为使用show_frames分析视频流时,其实分析的是经过解码后的数据,这时的数据已经时yuv数据了,并不是之前的frame了。 

三、DTS和PTS

DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
需要注意的是:虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。

当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,就回到了我们前面说的问题:解码顺序和播放顺序不一致了。

比如一个视频中,帧的显示顺序是:I B B P,现在我们需要在解码 B 帧时知道 P 帧中信息,因此这几帧在视频流中的顺序可能是:I P B B,这时候就体现出每帧都有 DTS 和 PTS 的作用了。DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像。顺序大概如下:

PTS: 480 640 560 520 600 800 720 680 760 960 ...

DTS: 400 440 480 520 560 600 640 680 720 760 ...
Stream: I P B B B P B B B P ...
播放序: 1 5 3 2 4 9 7 6 8 10 ...
 

总结就是dts一定是递增的,pts不一定,因为会有B帧出现。

参考:

音视频中的PTS和DTS及同步 - 知乎

https://www.cnblogs.com/yongdaimi/p/10676309.html

你可能感兴趣的:(日常心得,流媒体,音视频,ffmpeg,show_frames,show_packets)