FFmpeg 获取视频时长的几种方法

在视频处理、批量转码或自动化工作流中,获取视频时长是一个常见需求。FFmpeg 生态系统提供了多种方法来实现这一功能,本文将介绍几种常用技巧。

使用 ffprobe 获取时长

ffprobe 是 FFmpeg 自带的媒体信息探测工具,是获取视频元数据的最佳选择。+ ### 基本命令

此命令会返回秒数格式的时长,如 30.024000

人性化时间格式

添加 -sexagesimal 选项可以将输出转换为 时:分:秒.微秒 格式:

ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -sexagesimal input.mp4

输出示例:0:00:30.024000

使用 ffmpeg 命令获取时长

如果没有单独安装 ffprobe,也可以直接使用 ffmpeg 命令获取时长信息。

直接获取秒数

ffmpeg -i input.mp4 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,// | awk -F: '{ print $1*3600 + $2*60 + $3 }'

获取原始时长信息

如果需要保留原始格式的时长信息:

Linux/macOS:

ffmpeg -i input.mp4 2>&1 | grep Duration

Windows 命令提示符:

ffmpeg -i input.mp4 2>&1 | find "Duration"

Windows PowerShell:

ffmpeg -i input.mp4 2>&1 | Select-String "Duration"

注意:PowerShell 中没有 find 命令,需要使用 Select-String(可简写为 sls)来替代。2>&1 重定向语法在 PowerShell 中仍然有效。

输出示例:Duration: 00:11:16.70, start: 0.000000, bitrate: 206 kb/s

脚本实现

Bash 脚本

#!/bin/bash

# 输入文件路径
IN_FILE="input.mp4"

# 获取时长信息
DURATION_HMS=$(ffmpeg -i "$IN_FILE" 2>&1 | grep Duration | cut -f 4 -d ' ')

# 解析时分秒
DURATION_H=$(echo "$DURATION_HMS" | cut -d ':' -f 1)
DURATION_M=$(echo "$DURATION_HMS" | cut -d ':' -f 2)
DURATION_S=$(echo "$DURATION_HMS" | cut -d ':' -f 3 | cut -d '.' -f 1)

# 计算总秒数
let "DURATION = ( DURATION_H * 60 + DURATION_M ) * 60 + DURATION_S"

echo "视频时长: $DURATION 秒 ($DURATION_HMS)"

Windows VBS 脚本

Dim wShell
Set wShell=CreateObject("WScript.Shell")

Function getVideoSeconds(vfile)
    dim strCmd, duration, tmp, parts, objExec

    ' 构建命令
    strCmd="cmd /c ""ffmpeg -i " & vfile & " 2>&1"""
    
    ' 执行命令并捕获输出
    duration=""
    set objExec=wsShell.Exec(strCmd)
    Do
        tmp=objExec.StdOut.ReadLine
        if InStr(1,tmp,"Duration")>0 then
            duration=tmp
            exit do
        end if
    Loop while not objExec.StdOut.atEndOfStream

    ' 处理错误情况
    if duration="" then
        getVideoSeconds=0
        exit Function
    end if

    ' 解析并计算秒数
    parts=Split(Replace(duration,",",":"),":",-1)
    getVideoSeconds=CDbl(parts(1))*3600 + CDbl(parts(2))*60 + CDbl(parts(3))
End Function

' 使用示例
Dim videoFile, durationSec
videoFile="C:\path\to\your\video.mp4"
durationSec=getVideoSeconds(videoFile)
WScript.Echo "视频时长: " & durationSec & " 秒"

注意事项

  1. 确保 FFmpeg 已正确安装并添加到系统 PATH 中
  2. 对于某些特殊格式的视频文件,可能需要额外的解码器支持
  3. 使用脚本时注意处理可能的错误情况,如文件不存在或格式不支持
  4. ffprobe 方法比 ffmpeg 方法更高效,因为它只读取文件元数据而不解析整个文件

相关文章 📚

参考: