ffprobe / ffmpeg通过标准输入文件报告不同的视频时长

时间:2019-06-19 10:01:48

标签: ffmpeg ffprobe

我正在尝试使用ffmpeg确定MP4视频的时长,这当然是可能的,除了当通过stdin流式传输数据(在我的情况下是必需的)时,报告的时长小于实际值。是。 ffprobe也有同样的问题。

视频的实际长度约为13秒。

下面是我使用ffprobe收到的输出示例。

从磁盘读取文件(正确的持续时间):

$ ffprobe video.mp4
...
Duration: 00:00:13.05, start: 0.000000, bitrate: 736 kb/s
...

流式传输文件(持续时间不正确):

$ cat video.mp4 | ffprobe -i -
...
Duration: 00:00:08.40, start: 0.080000, bitrate: N/A
...

如何通过ffprobe报告正确的持续时间,同时还可以通过stdin在文件中流式传输?

2 个答案:

答案 0 :(得分:1)

您可以使用ffprobe的-show_packets选项,该选项将“显示有关输入多媒体流中包含的每个数据包的信息”。 (Read about it in the ffprobe docs。)

使用此选项,ffprobe将为流中的每个数据包输出一个条目,如下所示:

dts_time=13.008000

因此我们可以对dts_time的输出进行grep:

$ cat video.mp4 | ffprobe -i - -show_packets | grep dts_time
...
dts_time=13.008000
dts_time=13.029333

输出的最后一行将包含最后一个数据包的时间戳,可以将其视为视频的持续时间,因此,我们可以执行以下操作:

$ catvideo.mp4 \
    | ffprobe -i - -show_packets -v quiet \
    | grep dts_time \
    | tail -n 1 \
    | awk -F"=" '{print $2}'
13.029333

答案 1 :(得分:1)

您的输入MP4看起来要碎片化,在这种情况下,ffmpeg将在第一个碎片整理框之后停止探测,并报告其持续时间。对于普通的MP4而言,这不是问题。

您可以为这些文件运行cat fragmented.mp4 | ffmpeg -i - -c copy -f null - 2>&1 | grep -oP "(?<=time=)[\d:\.]+"