如何从ffmpeg获得准确的输出视频时长?

问题描述 投票:0回答:1

有没有办法让 ffmpeg.exe 给出输出视频的持续时间?

我知道如何从 ffmpeg 的输入视频中获取视频持续时间。只需查找“持续时间:”并解析 HH:MM:SS:XX。

Sample output:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.3.100
  Duration: 00:05:53.24, start: 0.000000, bitrate: 1102 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 854x480 [SAR 1:1 DAR 427:240], 937 kb/s, 23.98 fps, 23.98 tbr, 24k tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 159 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]

不幸的是,这只能精确到百分之一秒,我需要比这更精确的东西。这是输入视频的持续时间,我需要输出视频的持续时间。

我知道如何使用 ffprobe.exe 从视频中获取视频持续时间(以秒为单位,精确到小数点后六位)。

ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=duration video.mp4

Sample output:
353.227875

我还读到对 ffmpeg 库的调用返回一个浮点值,即输出视频的持续时间(以秒为单位)。所以 ffmpeg.exe 知道输出视频的持续时间,而且它知道得相当准确。

那么,有没有办法从 ffmpeg.exe 获取输出视频的准确持续时间?或者我是否一直在调用 ffmpeg.exe 进行视频处理,然后单独调用 ffprobe.exe 来获取视频持续时间?

video ffmpeg duration ffprobe
1个回答
0
投票

Gyan 在对我的问题的评论中提出了这个解决方案:

-progress <FILE>
添加到命令中。编码后查看最后一个
out_time_us
值。请注意,这是最后一个演示时间戳,因此您仍然需要添加最后一帧持续时间 - 使用帧速率的倒数。

我在一个 fps 为 25 的短片上给了

-progress
参数一个镜头。

我将

-progress progressfile.txt
添加到我的 ffmpeg 命令中。在progressfile.txt中,最后的
out_time_ms
行是
out_time_ms=1621333
,即1.621333秒,或者在25fps下,即40.533325帧,这很奇怪(视频怎么可能只有半帧多一点?)。不好。即使我添加最后一帧的时间(1/25 = 0.04 秒),它仍然是一个奇怪的帧数 41.533325 帧。这也是不准确的,因为视频实际上有 43 帧。

然而,进度文件确实有一行

frame=43
,在 25fps 下,为 1.72 秒。而“1.720000”正是 ffprobe 输出的视频时长。

因此,我可以看到两种可能的解决方案来获得以秒为单位的准确视频持续时间。我可以:

  1. 使用

    -progress
    参数创建 ffmpeg 进度文件,然后读取该进度文件,解析最终的
    frame
    值,并将该值乘以 fps 以获得以秒为单位的视频持续时间,或者...

  2. 在新创建的视频文件上使用上述参数运行 ffprobe,然后解析输出以获取视频持续时间(以秒为单位)。

无论哪种方式,我都会敲击磁盘几次。我将创建 ffmpeg 进度文件(点击 1),打开、读取并解析进度文件(点击 2),然后,如果我想要干净整洁,请删除进度文件(可选点击 3)——或者运行 ffprobe (点击 1),它将打开并读取视频文件(点击 2)并给出持续时间。值得注意的是,ffprobe 和视频文件读取磁盘命中率可能比创建、读取和删除小文本文件的命中率更大。

我必须尝试一些测试来确定哪个选项最适合我的用例。

谢谢吉安!

© www.soinside.com 2019 - 2024. All rights reserved.