我正在尝试使用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在文件中流式传输?
答案 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:\.]+"
。