FFmpeg 获取视频时长的几种方法
在视频处理、批量转码或自动化工作流中,获取视频时长是一个常见需求。FFmpeg 生态系统提供了多种方法来实现这一功能,本文将介绍几种常用技巧。
使用 ffprobe 获取时长
ffprobe 是 FFmpeg 自带的媒体信息探测工具,是获取视频元数据的最佳选择。+ ### 基本命令
- ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
- ```
-v error
: 只显示错误信息,减少干扰输出
-show_entries format=duration
: 只显示格式部分的时长信息-of default=noprint_wrappers=1:nokey=1
: 设置输出格式,去除包装器和键名
此命令会返回秒数格式的时长,如 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 }'
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 & " 秒"
注意事项
- 确保 FFmpeg 已正确安装并添加到系统 PATH 中
- 对于某些特殊格式的视频文件,可能需要额外的解码器支持
- 使用脚本时注意处理可能的错误情况,如文件不存在或格式不支持
- ffprobe 方法比 ffmpeg 方法更高效,因为它只读取文件元数据而不解析整个文件
相关文章 📚
参考: