Як отримати тривалість відео за секунди?


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

Відповіді:


36

Щоб отримати хвилини, вам потрібно розділити 2383 секунди на 60.

39.7167

а потім помножте дробову частину .7167 на 60, щоб отримати інші секунди.

43.002

Отже, це 39 хвилин, 43 секунди. Здається, додаток дає точне значення.


95

Просто використовуйте 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тривалість:

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


Вони не працюють для .m2v файлів, чи є у вас рішення для них
utdev

@utdev Дивіться розділ "З ffmpeg".
логіан

Ваше третє рішення дає мені неправильний час, моє відео триває 01:19:00, але команда повертає мені час = 01: 09: 15.32, ви маєте здогад, чому це відбувається
utdev

Дуже корисна тривалість передачі медіа. Дякую.
Ми Борг

Для всіх, хто використовує avprobe, параметри дещо відрізняються: avprobe -v помилка -show_format_entry тривалість. \ Sample.mp4
Бред

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.


як я можу видалити частку дробу?
Tina 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' 

як я можу видалити частку дробу?
Tina 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

Це виводить тривалість у мілісекундах як єдине ціле значення. Немає необхідності в греп / різання / 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, btw: - "mediainfo FILE --Inform =" Відео;% Тривалість% "дає тривалість у мілісекундах.


Ви не надали більше інформації та кращого рішення, ніж інші відповіді
Сем

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

Для його декодування знадобиться деякий час процесора, поки:

[...]

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 неточний?
алеб

4
% X - час останнього доступу. % Y - час з моменту останнього змінення. Це нічого не говорить про тривалість відео.
Джо Хілленбранд

1
Здається, це троль
Джордж Chalhoub
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.