57

Как я могу получить продолжительность видео в секундах?

Что я пробовал:

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

8 ответов8

78

Просто используйте ffprobe напрямую. Нет необходимости в sed , grep и т.д. Есть несколько "длительностей", которые вы можете получить (в зависимости от вашего ввода).

Формат (контейнер) длительность

$ 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 является продолжительностью:

Сколько времени это займет, конечно, зависит от сложности декодирования и продолжительности вашего ввода и возможностей вашего компьютера.

31

Если у вас есть ffmpeg , у вас также должен быть ffprobe:

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

Это также даст доли секунд, если это проблема, вы можете в дальнейшем обработать это с помощью sed.

28

Чтобы получить минуты, вы должны разделить 2383 секунды на 60.

39.7167

и затем умножьте дробную часть .7167 на 60, чтобы получить оставшиеся секунды.

43.002

Итак, это 39 минут 43 секунды. Приложение, кажется, дает вам точное значение.

3

Решение с mplayer, которое дает секунды напрямую:

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

Для моего ffmpeg-0.6.5-1.el6.rf.x86_64, чтобы получить только второй, формат команды ffprobe:

ffprobe <file> -show_format 2>&1 | sed -n 's/duration=//p' 
1
mediainfo --Output='General;%Duration%' file.flv

Это выводит длительность в миллисекундах как одно целочисленное значение. Нет необходимости в grep/cut/sed/...

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% "дает вам продолжительность в миллисекундах.

-6

Если вам нужна ТОЧНАЯ продолжительность, забудьте FFmpeg. Он только дает оценку на основе размера файла и среднего битрейта. Я нашел, в некоторых случаях, предполагаемое время отключения в 2 раза!

В Linux, если файл создается и изменяется только во время упомянутой видеозаписи, альтернативным решением будет использование времени создания и последнего изменения для вычисления длительности, как в:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .