【问题标题】:How to get the duration of any stream of a mp4 container with ffmpeg?如何使用 ffmpeg 获取 mp4 容器的任何流的持续时间?
【发布时间】:2019-07-29 20:01:30
【问题描述】:

我不确定,但下面的命令似乎就是这样做的。在这里我得到了 mp4 文件的第一个音频流的持续时间:

ffprobe -v error -select_streams a:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 -i input.mp4

但是,我正在寻找 ffmpeg 的等价物(如果存在)。如果ffmpeg 无法做到这一点,您的回答同样有效。

【问题讨论】:

  • 使用ffprobe有什么问题?这种类型的任务就是它的用途。 ffmpeg 的控制台输出并不意味着机器解析。
  • ffprobe 没什么问题,我只需要使用ffmpeg。我更新了问题标题,使其更加明确,我不仅想“获取任何 mp4 流的持续时间”容器,而且我想用 ffmpeg 来做。
  • 这并不能真正回答我的问题。我还是不太明白你为什么不能或者不想使用ffprobe,所以我的回答是“使用ffprobe”。
  • 为什么我不能使用ffprobe 无关紧要...我不在乎ffmpeg 是否更复杂(甚至不可能),这只是我的一个限制。我会将您的回答视为“使用 ffmpeg 不可能”。

标签: video ffmpeg ffprobe


【解决方案1】:

使用

ffmpeg -i input.mp4 -c copy -map 0:v:3 -f null - 2>&1 | tail -3 | grep -oP "(?<=time=).+?\s"

0:v:3 将选择第四个视频流。如果存在,输出将是一个持续时间,例如00:02:57.64

如果不存在,则输出为空。

【讨论】:

    【解决方案2】:

    .使用FFmpeg获取媒体文件时长,可以这样做:

    ffmpeg -i inputfile -map 0:0 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
    

    进一步阅读Map option.

    Source

    【讨论】:

    • 在哪里指定流的类型和流的索引?
    • @maximedupre @llogan 对于流选择,您可以使用选项-map。我使用后者更新了上面的命令。
    • 它确实返回了一个持续时间,但我注意到它返回特定流的持续时间。我认为它只是返回整个 mp4 容器的持续时间(所有流一起的持续时间)
    • 如果我没有自己测试,我不会向你推荐它。正如你所说,流选择似乎不起作用。我会再次检查并回复您。
    猜你喜欢
    • 2019-07-31
    • 1970-01-01
    • 2014-08-07
    • 2014-02-26
    • 2012-07-05
    • 2018-06-21
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多