如何获得以秒为单位的视频时长?


69

如何获得以秒为单位的视频时长?

我尝试过的

ffmpeg -i file.flv 2>&1 | grep "Duration"
  Duration: 00:39:43.08, start: 0.040000, bitrate: 386 kb/s


mediainfo file.flv | grep Duration
Duration : 39mn 43s

距离这很近,但不是那么准确,2383是39.71分钟

ffmpeg -i file.flv 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,// | sed 's@\..*@@g' | awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }'
2383

Answers:


36

要获得分钟数,您必须将2383秒除以60。

39.7167

然后将小数部分.7167乘以60,得到剩余的秒数。

43.002

因此,这是39分43秒。该应用程序似乎为您提供了准确的价值。


95

只需ffprobe直接使用。无需sedgrep等有几个“持续时间”,你可以获取(取决于您的输入)。

格式(容器)持续时间

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

30.024000

添加-sexagesimal选项将使用HOURS:MM:SS.MICROSECONDS时间单位格式:

0:00:30.024000

视频流时长

$ ffprobe -v error -select_streams v:0 -show_entries stream=duration \
  -of default=noprint_wrappers=1:nokey=1 input.mp4
30.000000

上面的命令来自FFmpeg Wiki:FFprobe Tips

ffmpeg

如果发现容器或流的持续时间丢失或不准确(可能由于文件损坏或被截断),则可能需要完全解码输入。

$ ffmpeg -i input.mp4 -f null -
  …
  frame= 1587 fps=0.0 q=0.0 Lsize=N/A time=00:01:03.48 bitrate=N/A

在此示例中time=00:01:03.48是持续时间:

当然,这需要多长时间取决于解码的复杂度,输入的持续时间以及计算机的功能。


这些文件不适用于.m2v文件,您也有解决方案吗
utdev

@utdev请参见“使用ffmpeg”部分。
llogan

您的第三个解决方案给我一个错误的时间,我的视频长度为01:19:00,但是命令返回的时间为我= 0 = 1:09:15.32,您是否猜测为什么会这样
utdev

媒体流持续时间非常有用。谢谢。
我们是博格'18

对于使用avprobe的用户,参数略有不同:avprobe -v错误-show_format_entry持续时间。\ Sample.mp4
Brad

32

如果有ffmpeg,还应该具有ffprobe

ffprobe -i input.file -show_format | grep duration
ffprobe -i input.file -show_format -v quiet | sed -n 's/duration=//p'

这也将提供几分之一秒的时间,如果有问题,您可以使用sed进一步处理。


如何删除秒的小数部分?
蒂娜·J

@TinaJ只需将其与传送printf,例如| xargs printf %.0f-这将返回一个整数值。
伊利亚·罗斯托夫采夫

3

对于我的ffmpeg-0.6.5-1.el6.rf.x86_64,仅获取第二个ffprobe命令格式为:

ffprobe <file> -show_format 2>&1 | sed -n 's/duration=//p' 

如何删除秒的小数部分?
蒂娜·J

3

使用mplayer的解决方案可直接提供秒数:

mplayer -identify -frames 0 -vo null -nosound file.flv 2>&1 | awk -F= '/LENGTH/{print $2}'

2
mediainfo --Output='General;%Duration%' file.flv

这将以毫秒为单位的持续时间输出为单个整数值。不需要grep / cut / sed / ...


谢谢-这正是我想要的。可以在MacOS上安装brew install mediainfo
Alex K,

0

我遇到了从正在使用的某些视频文件中获取一些奇怪且不正确的元数据的问题,但是我无法使用ffmpeg,mp4box,ffprobe,mediainfo,mplayer等代码和工具来找到模式或任何类型的处理,以获得视频的真实时长。

确定视频的真实持续时间是我正在从事的项目的要求,而我发现始终正确的唯一方法是使用ffmpeg重新编码视频文件,并强制编码文件忽略原始文件的元数据,例如:

ffmpeg -i INPUT_FILENAME -acodec copy -vcodec copy -map_metadata -1 OUTPUT_FILENAME"

(这可能比您预期的要快。对于内容的类型和所使用的环境,平均时间为2秒,我感到惊讶)

...然后使用您选择的工具获取持续时间。我喜欢mediainfo,顺便说一句:-“ mediainfo FILE --Inform =” Video;%Duration%“给您持续时间(以毫秒为单位)。


您没有提供比其他答案更多的信息或更好的解决方案
山姆

0

如果只需要查询元数据:

ffprobe -hide_banner -v quiet -show_streams -print_format flat video.mp4

[...]

streams.stream.0.duration="5221.146009"

[...]

因此,您可以解析它:

while read -r; do
  if [[ "$REPLY" =~ ^streams\.stream\.([0-9])+\.duration=\"([^"]+)\"$ ]]; then
    echo -E Duration of stream "${BASH_REMATCH[1]}": "${BASH_REMATCH[2]}"
  fi
done < <(ffprobe -hide_banner -v quiet -show_streams -print_format flat video.mp4)

但是,如果要获得有效容器的持续时间,则需要对其进行解码:

AV_LOG_FORCE_NOCOLOR=y ffmpeg -nostdin -hide_banner -nostats -loglevel info -i video.mp4 -f null -c copy - 2>&1 | tail -n 2

解码它需要一些CPU时间,直到:

[...]

frame=130527 fps=53271 q=-1.0 Lsize=N/A time=01:27:01.12 bitrate=N/A speed=2.13e+03x
video:152014kB audio:40790kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

然后,您可以解析它:

if [[ "$(AV_LOG_FORCE_NOCOLOR=y ffmpeg -nostdin -hide_banner -nostats -loglevel info -i video.mp4 -f null -c copy - 2>&1 | tail -n 2 | head -n 1)" =~ \ time=([0-9]+):([0-9]{2}):([0-9]{2})\.([0-9]+) ]]; then
  declare duration=0 us="${BASH_REMATCH[4]}" t
  for t in "${BASH_REMATCH[@]:1:3}"; do
    ((duration *= 60))
    ((duration += ${t#0} ))
  done
  while [ ${#us} -lt 6 ]; do us+=0; done
  ((us >= 500000)) && ((duration++))
  ((duration)) || ((duration++))
fi
echo -E Duration: "$duration"

-6

如果您想要精确的持续时间,请忽略FFmpeg。它仅基于文件大小和平均比特率给出估计。在某些情况下,我发现估计的持续时间缩短了2倍!

在Linux上,如果仅在上述录像期间创建和修改文件,则另一种解决方案是使用创建和最后修改时间来计算持续时间,如下所示:

stat -c "%X %Y" video.mpg | awk '{print $2 - $1}'

5
您在哪里发现ffmpeg不正确?
aleb 2015年

4
%X是上次访问的时间。%Y是自上次修改以来的时间。这与视频长度无关。
Joe Hillenbrand

1
这似乎是一个巨魔
George Chalhoub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.