假设我们有一个视频文件 some_video。
我怎样才能从 shell 脚本(使用 mplayer/transcode/gstreamer/vlc/ffmpeg/whatever)获取它的长度?
VIDEO_LENGTH_IN_SECONDS=`ffmpeg .... -i some_video ... | grep -o .....`
答案1
ffprobe -i some_video -show_entries format=duration -v quiet -of csv="p=0"
将返回视频时长(以秒为单位)。
答案2
类似于:
ffmpeg -i input 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//
这将提供:HH:MM:SS.ms
。您还可以使用ffprobe
,它随大多数 FFmpeg 安装提供:
ffprobe -show_format input | sed -n '/duration/s/.*=//p'
… 或者:
ffprobe -show_format input | grep duration | sed 's/.*=//')
要转换为秒(并保留毫秒),请输入:
awk '{ split($1, A, ":"); print 3600*A[1] + 60*A[2] + A[3] }'
要将其转换为毫秒,请输入:
awk '{ split($1, A, ":"); print 3600000*A[1] + 60000*A[2] + 1000*A[3] }'
如果只想要秒数而不想要毫秒数,请输入:
awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }'
例子:
答案3
ffprobe -v error -select_streams v:0 -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 movie.mp4
将返回以秒为单位的总时长。(视频+音频)= 124.693091
ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 movie.mp4
仅返回视频时长(秒)stream=duration
= 123.256467
ffprobe -v error -sexagesimal -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 movie.mp4
将仅返回使用该-sexagesimal
格式的视频时长。= 0:02:03.256467
答案4
如果您无法访问ffprobe
,您可以使用mediainfo
。
# Outputs a decimal number in seconds
mediainfo some_video --Output=JSON | jq '.media.track[0].Duration' | tr -d '"'`