Кто-нибудь знает, как получить общее количество кадров из видеофайла с помощью ffmpeg? Результат рендеринга ffmpeg показывает текущий кадр, и мне нужно количество кадров, чтобы вычислить прогресс в процентах.
Не все форматы (например, Matroska) сообщают количество кадров, в результате которых получается выходной файл N/A. См. Другие методы, перечисленные ниже.
Добавьте -skip_frame nokeyвозможность подсчета только ключевых кадров.
ffmpeg: подсчитать количество кадров
Если у вас его нет, ffprobeвы можете использовать ffmpegвместо этого:
ffmpeg -i input.mkv -map 0:v:0 -c copy -f null -
Это довольно быстрый метод.
Обратитесь к frame=концу вывода консоли.
Добавьте параметр -discard nokeyввода (ранее -i) для подсчета только ключевых кадров.
Редактировать списки
Игнорируйте список редактирования MP4 / M4V / M4A / MOV с -ignore_editlist 1опцией ввода. По умолчанию список редактирования не игнорируется.
Что означают параметры ffprobe
-v error Это скрывает вывод "информации" (информация о версии и т. Д.), Что упрощает синтаксический анализ.
-count_frames Подсчитайте количество кадров в потоке и сообщите об этом в соответствующем разделе потока.
-select_streams v:0 Выберите только видеопоток.
-show_entries stream=nb_framesили -show_entries stream=nb_read_framesПоказать только запись для nb_framesили nb_read_frames.
-of default=nokey=1:noprint_wrappers=1Установите формат вывода (он же «писатель») default, чтобы не печатать ключ каждого поля ( nokey=1) и не печатать заголовок и нижний колонтитул раздела ( noprint_wrappers=1). Есть более короткие альтернативы, такие как -of csv=p=0.
Известный mediainfoинструмент может выводить количество кадров:
mediainfo --Output="Video;%FrameCount%" input.avi
MP4Box
Для файлов MP4 / M4V / M4A.
MP4Box из gpac может показывать количество кадров:
MP4Box -info input.mp4
Обратитесь к Media Infoстроке вывода для рассматриваемого видеопотока:
Media Info: Language "Undetermined (und)" - Type "vide:avc1" - 2525 samples
В этом примере видеопоток состоит из 2525 кадров.
самосвал
Для файлов MP4 / M4V / M4A / MOV.
boxdumperэто простой инструмент от l-smash. Он выведет большой объем информации. Под stszполем размера выборки см. sample_countКоличество кадров. В этом примере на входе 1900 видеокадров:
Или, если вам нужна более высокая скорость и если nb_frames достаточно надежен, упростите как:ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
juanitogan
Это выводит ответ дважды для меня (т.е. 2600 \ n 2600). Какая-то конкретная причина, по которой это могло произойти?
jbodily
@jbodily Мой пример или пример juanitogan? Я не могу дублировать это, используя тоже. Здесь не с чем работать.
llogan
+1, не в последнюю очередь потому, что, в отличие от слишком многих других ответов о любом инструменте командной строки, этот фактически объясняет все параметры командной строки. Спасибо.
Ray
1
Обратите внимание, что первый вариант, запрос контейнера, фактически обрабатывает файл из-за count_frames. См. Комментарий @ juanitogan.
Вы сможете последовательно и безопасно находить Duration: hh:mm:ss.nnи определять размер исходного видеоклипа. Затем для каждой строки обновления (CR, без LF) вы можете проанализировать текст для текущей отметки времени, в которой она находится:
Простите за глупость, но как я могу указать время / продолжительность, если продолжительность в формате чч: мм: сс.нн, а время всегда в формате xx.yy?
Омар Али
2
@Omar, Как разработчик .NET, я создаю TimeSpanиз него, а затем использую currentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100). TimeSpan также предоставляет мощную функцию синтаксического анализа, проверьте это,
Шимми Вейцхандлер
отличное решение, мое время в чч: мм: сс: мс, поэтому я полагаю, что за эти 3 года FFMPEG улучшил формат времени вывода.
ElektroStudios
1
Обратите внимание, что на выходе консоли может быть указано 29,97, но это сокращение от 30000/1001. То же самое для 23,98, что составляет 24000/1001, а 59,94 - это 60000/1001.
llogan
Обратите внимание: это не работает для видео с переменной частотой кадров (очевидно).
Тимоти Зорн
8
Не все форматы сохраняют свое количество кадров или общую продолжительность - и даже если они это делают, файл может быть неполным, поэтому ffmpeg не определяет точно ни один из них по умолчанию.
Вместо этого попробуйте перейти к концу файла и прочитать время, а затем посчитать текущее время, пока вы идете.
В качестве альтернативы вы можете попробовать AVFormatContext->nb_index_entriesили обнаруженную продолжительность, которая должна работать нормально, по крайней мере, неповрежденный AVI / MOV, или библиотеку FFMS2, которая, вероятно, слишком медленная, чтобы возиться с индикатором выполнения.
которые дают числовую базу на основе вашей видеоинформации, проблема в том, что когда вы используете этот метод, возможно, вы получите в N/Aкачестве вывода.
Это должно быть быстро, так как кодирование не выполняется. ffmpegпросто демультиплексирует файл и как можно быстрее прочитает (декодирует) первый видеопоток. Первая grepкоманда захватит текст, показывающий фрейм. Вторая grepкоманда возьмет только номер из этого. Команда tailпросто покажет последнюю строку (окончательное количество кадров).
чтобы основываться на ответе Стю. вот как я узнал частоту кадров видео со своего мобильного телефона. Некоторое время я выполнял следующую команду. Я позволил счетчику кадров приблизиться к ~ 10 000, прежде чем я набрался терпения и нажал ^ C:
$ ffmpeg -i 2013-07-07\ 12.00.59.mp4 -f null /dev/null 2>&1
...
Press [q] to stop, [?] for help
[null @ 0x7fcc80836000] Encoder did not produce proper pts, making some up.
frame= 7989 fps= 92 q=0.0 Lsize=N/A time=00:04:26.30 bitrate=N/A dup=10 drop=0
video:749kB audio:49828kB subtitle:0 global headers:0kB muxing overhead -100.000042%
Received signal 2: terminating.
$
затем я взял две части информации из той строки, которая начинается с «frame =», количества кадров 7989 и времени 00: 04: 26.30. Сначала вам нужно преобразовать время в секунды, а затем разделить количество кадров на секунды, чтобы получить «количество кадров в секунду». «кадров в секунду» - это ваша частота кадров.
Я поддержал ваш ответ, но это сработает, только если видео не содержит звука. Если он содержит, то этот будет работать:ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video
Gobe
2
Извините за ответ necro, но, возможно, он понадобится (так как я не нашел решения для последних выпусков ffmpeg.
С ffmpeg 3.3.4 я обнаружил, что можно найти следующее:
В конце будет выведено количество кадров. У меня это сработало с видео со звуком. Тем не менее, он дает дважды строку "nb_frames", но первая строка - это фактическое количество кадров в видео, которые я тестировал.
Ответы:
Примечание. Наличие списка редактирования в MP4 / M4V / M4A / MOV может повлиять на номер вашего кадра. См. Раздел « Редактировать списки» ниже.
ffprobe: запросить контейнер
N/A
. См. Другие методы, перечисленные ниже.ffprobe: подсчитать количество кадров
-skip_frame nokey
возможность подсчета только ключевых кадров.ffmpeg: подсчитать количество кадров
Если у вас его нет,
ffprobe
вы можете использоватьffmpeg
вместо этого:frame=
концу вывода консоли.-discard nokey
ввода (ранее-i
) для подсчета только ключевых кадров.Редактировать списки
Игнорируйте список редактирования MP4 / M4V / M4A / MOV с
-ignore_editlist 1
опцией ввода. По умолчанию список редактирования не игнорируется.Что означают параметры ffprobe
-v error
Это скрывает вывод "информации" (информация о версии и т. Д.), Что упрощает синтаксический анализ.-count_frames
Подсчитайте количество кадров в потоке и сообщите об этом в соответствующем разделе потока.-select_streams v:0
Выберите только видеопоток.-show_entries stream=nb_frames
или-show_entries stream=nb_read_frames
Показать только запись дляnb_frames
илиnb_read_frames
.-of default=nokey=1:noprint_wrappers=1
Установите формат вывода (он же «писатель»)default
, чтобы не печатать ключ каждого поля (nokey=1
) и не печатать заголовок и нижний колонтитул раздела (noprint_wrappers=1
). Есть более короткие альтернативы, такие как-of csv=p=0
.Также см
медиа информация
Известный
mediainfo
инструмент может выводить количество кадров:MP4Box
Для файлов MP4 / M4V / M4A.
MP4Box
из gpac может показывать количество кадров:Обратитесь к
Media Info
строке вывода для рассматриваемого видеопотока:В этом примере видеопоток состоит из 2525 кадров.
самосвал
Для файлов MP4 / M4V / M4A / MOV.
boxdumper
это простой инструмент от l-smash. Он выведет большой объем информации. Подstsz
полем размера выборки см.sample_count
Количество кадров. В этом примере на входе 1900 видеокадров:stsz
атома.источник
ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
В Unix это работает как шарм:
источник
ffmpeg -i 00000.avi -map 0:v:0 -c copy -f null -y /dev/null 2>&1 | grep -Eo 'frame= *[0-9]+ *' | grep -Eo '[0-9]+' | tail -1
Вместо этого рассчитайте его по времени.
Это то, что я делаю, и это отлично работает для меня и многих других). Во-первых, найдите длину видео в приведенном ниже фрагменте:
Вы сможете последовательно и безопасно находить
Duration: hh:mm:ss.nn
и определять размер исходного видеоклипа. Затем для каждой строки обновления (CR, без LF) вы можете проанализировать текст для текущей отметки времени, в которой она находится:Просто будьте осторожны, чтобы не всегда ожидать идеального вывода от этих строк состояния. Они могут включать такие сообщения об ошибках, как здесь:
Если у вас есть время, это простая математика:
time / durration * 100 = % done
.источник
TimeSpan
из него, а затем используюcurrentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100)
. TimeSpan также предоставляет мощную функцию синтаксического анализа, проверьте это,Не все форматы сохраняют свое количество кадров или общую продолжительность - и даже если они это делают, файл может быть неполным, поэтому ffmpeg не определяет точно ни один из них по умолчанию.
Вместо этого попробуйте перейти к концу файла и прочитать время, а затем посчитать текущее время, пока вы идете.
В качестве альтернативы вы можете попробовать
AVFormatContext->nb_index_entries
или обнаруженную продолжительность, которая должна работать нормально, по крайней мере, неповрежденный AVI / MOV, или библиотеку FFMS2, которая, вероятно, слишком медленная, чтобы возиться с индикатором выполнения.источник
Попробуйте что-нибудь вроде:
Он записывает номер кадра в stderr, поэтому вы можете извлечь из него последний кадр.
источник
Вы можете использовать
ffprobe
для получения номера кадра с помощью следующих командffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v
которые говорят печатать данные в
json
форматеselect_streams v
скажетffprobe
просто предоставить намvideo
данные потока, и если вы удалите его, он также предоставит вамaudio
информациюи результат будет похож на
2. вы можете использовать
который предоставит вам потоковые данные, если вам нужна выбранная информация, такая как частота кадров, используйте следующую команду
которые дают числовую базу на основе вашей видеоинформации, проблема в том, что когда вы используете этот метод, возможно, вы получите в
N/A
качестве вывода.для получения дополнительной информации посетите эту страницу Советы FFProbe
источник
попробуй это:
источник
*.ts
. Результатом будет пустая строка.Поскольку мой комментарий получил несколько голосов, я решил оставить его в качестве ответа:
Это должно быть быстро, так как кодирование не выполняется.
ffmpeg
просто демультиплексирует файл и как можно быстрее прочитает (декодирует) первый видеопоток. Перваяgrep
команда захватит текст, показывающий фрейм. Втораяgrep
команда возьмет только номер из этого. Командаtail
просто покажет последнюю строку (окончательное количество кадров).источник
чтобы основываться на ответе Стю. вот как я узнал частоту кадров видео со своего мобильного телефона. Некоторое время я выполнял следующую команду. Я позволил счетчику кадров приблизиться к ~ 10 000, прежде чем я набрался терпения и нажал ^ C:
затем я взял две части информации из той строки, которая начинается с «frame =», количества кадров 7989 и времени 00: 04: 26.30. Сначала вам нужно преобразовать время в секунды, а затем разделить количество кадров на секунды, чтобы получить «количество кадров в секунду». «кадров в секунду» - это ваша частота кадров.
частота кадров моего видео составляет 30 кадров в секунду.
источник
Единственное, что мне удалось сделать, это следующее:
Чтобы убедиться, что это работает с видео:
источник
ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video
Извините за ответ necro, но, возможно, он понадобится (так как я не нашел решения для последних выпусков ffmpeg.
С ffmpeg 3.3.4 я обнаружил, что можно найти следующее:
В конце будет выведено количество кадров. У меня это сработало с видео со звуком. Тем не менее, он дает дважды строку "nb_frames", но первая строка - это фактическое количество кадров в видео, которые я тестировал.
источник
Я использую php_ffmpeg, тогда я могу получать все времена и все кадры фильма. Как показано ниже
А потом подробности на странице.
http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php
источник
источник
linux
Рубин
источник