Как рассчитать длину видеофайла, который был закодирован до сих пор?

Я использую ffmpegдля преобразования видеофайла в формат H.264. Если я позвоню ffprobeво время ffmpegработы, продолжительность видео неизвестна. Только когда ffmpegзакончит, ffprobeбудет отображаться продолжительность.

Аналогично, если я запускаю mplayerвоспроизведение видео, пока оно все еще кодируется, продолжительность либо неизвестна, либо отображается неправильно.

Есть ли способ узнать продолжительность результирующего видео (h264 в контейнере .mkv), пока оно все еще кодируется ffmpeg?

Изменить : я сделаю вопрос немного более ясным.

Мне интересно узнать, какова длина видео, которое было закодировано до сих пор . Допустим, входной файл имеет длину 1 минуту 45 секунд. Полученный файл должен сохранить длину. Но я хотел бы знать, сколько ffmpegкодировал до сих пор . Если мы можем определить длину видео после завершения преобразования, не должен ли быть способ определить длину видео, которое уже было обработано и готово к воспроизведению?

Ответы (2)

Краткий ответ: нет.

Более длинный ответ, это зависит.

Если вы кодируете файл, то, как правило, вывод представляет собой продолжительность ввода, если только не -ss, -to, -tприменяются фильтры или параметры изменения скорости или обрезки. Для живого ввода FFmpeg остановит кодирование, когда встретит EOF на входе, поэтому, если вы этого не знаете, вы не будете знать продолжительность вывода. Для нескольких входов разной продолжительности это будет зависеть от того, что представляет собой команда, например, есть ли там a -shortest, есть ли amix, который по умолчанию соответствует самому длинному из входов или amergeкоторый завершается при самом коротком вводе.

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

Спасибо за объяснение. Я отредактировал свой вопрос и добавил некоторые детали, не могли бы вы проверить его и посмотреть, можете ли вы добавить больше данных в свой ответ?
Как говорится в моем последнем параграфе, ffmpeg уже отображает эту информацию в выводе консоли, который передается вstderr
Это верно. Я совершенно проглядел это! Еще раз спасибо.
Кроме того, я хотел бы добавить, что есть опция FFmpeg, -progressкоторая заставляет его выводить вышеупомянутую информацию о ходе выполнения в удобном для машин формате, который можно легко проанализировать.

Смотрите -reportвариант. Из справочных страниц:

-отчет

Скопируйте полный вывод командной строки и консоли в файл с именем « program-YYYYMMDD-HHMMSS.log » в текущем каталоге. Этот файл может быть полезен для отчетов об ошибках. Это также подразумевает " -loglevel verbose".

Установка переменной среды FFREPORTна любое значение имеет тот же эффект. Если значение представляет собой последовательность значений ключей: , разделенных ' ' , эти параметры повлияют на отчет; значения опций должны быть экранированы, если они содержат специальные символы или разделитель опций ' ' (см. раздел ``Цитаты и экранирование'' в руководстве по ffmpeg-utils).=:

Распознаются следующие варианты:

файл

установить имя файла для использования в отчете; %pрасширяется до имени программы, %tрасширяется до метки времени, " %%" расширяется до простого " %"

уровень

установите уровень детализации журнала с помощью числового значения (см. " -loglevel").

Например, чтобы вывести отчет в файл с именем ffreport.log , используя уровень журнала 32 (псевдоним для уровня журнала " info"):

FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output

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

Комбинируйте с -statsи ваш | head -n 2 | tail -n 1вариант:

-статистика (глобальная)

Печатать прогресс/статистику кодирования. Он включен по умолчанию, чтобы явно отключить его, вам нужно указать " -nostats".

Если у вас возникли проблемы с индикатором выполнения, который используется \rдля перезаписи одной и той же строки, вы можете ffmpeg -stats ... 2>&1 | tr \\r \\nперейти в начало и конец.