Ответ 1
Вы можете использовать оболочку
$ ff=$(ffmpeg -i video.mp4 2>&1)
$ d="${ff#*Duration: }"
$ echo "${d%%,*}"
Из следующего вывода ffmpeg -i
, как бы получить длину (00:35) -
$ ffmpeg -i 1video.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/david/Desktop/1video.mp4':
Metadata:
major_brand : isom
minor_version : 1
compatible_brands: isomavc1
creation_time : 2010-01-24 00:55:16
Duration: 00:00:35.08, start: 0.000000, bitrate: 354 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 640x360 [PAR 1:1 DAR 16:9], 597 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc
Metadata:
creation_time : 2010-01-24 00:55:16
Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 109 kb/s
Metadata:
creation_time : 2010-01-24 00:55:17
At least one output file must be specified
Вы можете использовать оболочку
$ ff=$(ffmpeg -i video.mp4 2>&1)
$ d="${ff#*Duration: }"
$ echo "${d%%,*}"
Таким образом вы получаете продолжительность в секундах. Я думаю, что это более удобно.
ffprobe -loglevel error -show_streams inputFile.mp3 | grep duration | cut -f2 -d=
ffprobe поставляется с ffmpeg, поэтому вы должны иметь его.
EDIT:
Для более выделенной версии вы можете использовать, например,
ffprobe -loglevel error -show_format -show_streams inputFile.extension -print_format json
Вместо JSON вы также можете использовать, например, CSV или XML. Дополнительные параметры вывода смотрите здесь http://ffmpeg.org/ffprobe.html#Writers
Вы хотите сделать это в готовом конвейере оболочки или прочитать результат в вызывающей программе?
/\s+Duration: ((\d\d):(\d\d):(\d\d)\.(\d+))/
... является PCRE, который разбивает результат вверх (замените \.
на [;:.]
, если ffmpeg может выводить продолжительность в кадрах, а не в дробные секунды). В конвейере Unix:
| grep Duration: | cut -f2- -d: | cut -f1 -d, | tr -d ' '
Есть, конечно, еще несколько способов выразить это.
Duration: (\d\d):(\d\d):(\d\d(\.\d\d)?)
должен работать. Каким бы ни был ваш язык $1
, это часы, $2
будет минут, $3
будет секундой, а $4
будет всего лишь в секундах, если они существуют.
для последней версии:
$cmd = "avconv -i input.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,";
$output = exec($cmd);
echo "\n\n==OUTPUT===|".$output."|=====\n\n";
Теперь $output будет удерживать вашу продолжительность видео ввода .mp4
Форматбудет: hh: mm: ss.ms
например 00: 02: 17,25
Длительность форматирования (контейнера):
$ 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