Как узнать длительность видеофайла с помощью 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']