Как узнать длительность видеофайла с помощью mediainfo в секундах или других форматах?

Как узнать длительность видеофайла в миллисекундах, то есть в целых числах, детерминистическим способом. Я использовал ffprobe, чтобы получить продолжительность, но она не дает продолжительность для всех форматов файлов.

4 ответа

Решение

Используйте следующие команды:

я) Чтобы получить продолжительность видео потока:

$ mediainfo --Inform="Video;%Duration%"  [inputfile]

II) Чтобы получить продолжительность медиа-файла:

$ mediainfo --Inform="General;%Duration%" [inputfile]

iii) Чтобы получить продолжительность только аудио потока:

$ mediainfo --Inform="Audio;%Duration%" [inputfile]

iv) Чтобы получить значения более чем одного параметра:

$ mediainfo --Inform="Video;%Width%,%Height%,%BitRate%,%FrameRate%" [inputfile]

Вывод будет примерно таким:

1280,720,3000000,30.0

Как предложено Йотой для использования mediainfo --Inform="Video;%Duration%" [inputfile]возможно, но возвращает странные результаты.

Например, для видео длительностью 31 с 565 мс выход данной команды будет:

31565

Это не подходило для меня, и я пришел к следующему решению:

mediainfo --Inform="Video;%Duration/String3%" inputExample.webm

Возвращаемое значение:

00:00:31.565

В конце концов, вы можете просто отформатировать возвращаемое значение с помощью, скажем, PHP, чтобы преобразовать его в секунды, например:

$parsed = date_parse( '00:00:31.565' );
echo $parsed['hour'] * 3600 + $parsed['minute'] * 60 + $parsed['second'];

пример

Я использую приведенную ниже команду на своей машине xubuntu, и она делает именно то, что хочет выполнить OP.

      mediainfo --Output="Video;%Duration%\n" *.mp4 | awk '{ sum += $1 } END { secs=sum/1000; h=int(secs/3600);m=int((secs-h*3600)/60);s=int(secs-h*3600-m*60); printf("%02d:%02d:%02d\n",h,m,s) }'

Мы также можем использовать ffmpeg для получения длительности любых видео или аудио файлов.

Для установки ffmpeg перейдите по этой ссылке

import subprocess
import re

process = subprocess.Popen(['ffmpeg',  '-i', path_of_media_file], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
stdout, stderr = process.communicate()
matches = re.search(r"Duration:\s{1}(?P<hours>\d+?):(?P<minutes>\d+?):(?P<seconds>\d+\.\d+?),", stdout, re.DOTALL).groupdict()

print matches['hours']
print matches['minutes']
print matches['seconds']
Другие вопросы по тегам