Как надежно определить количество кадров видео менее чем за несколько секунд?

Мне нужен быстрый и надежный способ получить общее количество кадров видео.

Вот следующие методы, которые я пробовал, и их недостатки:

  1. ffprobe (быстрый способ)

    ffprobe -select_streams v:0 -show_entries stream=nb_frames -of default=noprint_wrappers=1 input.mp4

Проблема: часто возвращает N/A, ненадежно.

  1. ffprobe (медленный способ)

    ffprobe -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mp4

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

  1. ffmpeg (быстрый способ)

    ffmpeg -i input.mp4 -map 0:v:0 -c copy -f null -

Проблема: необходимо один раз полностью декодировать видео, что довольно медленно

Я знаю, что то, что я ищу, возможно, потому что определенное программное обеспечение (например, Topaz Video Enhance) может это сделать. Но я не знаю, как я могу добиться этого в своем проекте С# или ffmpeg.


person nmkd    schedule 08.02.2021    source источник
comment
Необходимо один раз полностью декодировать видео, что довольно медленно --› с -c copy не декодирует.   -  person Gyan    schedule 08.02.2021
comment
Правильно, я думаю, тогда узким местом здесь является ввод-вывод. Запуск этого на BD Rip на 50 ГБ на жестком диске займет довольно много времени.   -  person nmkd    schedule 08.02.2021


Ответы (1)


Команда

ffmpeg -i input.mp4 -map 0:v:0 -c copy -f null -

не декодирует кадры и поэтому является самым быстрым универсальным способом.

Для файлов семейства MP4/MOV есть другой способ, который может быть быстрее.

ffmpeg -i in.mp4 -v trace 2>&1 -hide_banner | grep -A 10 codec_type=0 | grep -oP "(?<=sample_count=)\d+"

FFmpeg анализирует метаданные при подаче ввода. Демультиплексоры обычно публикуют в журнале несколько сообщений с некоторыми ключевыми параметрами, считанными из заголовка. Демультиплексор MOV/MP4 делает это на уровне журнала трассировки и включает «количество выборок» для всех дорожек. Приведенная выше команда извлекает его для видеодорожки.

person Gyan    schedule 08.02.2021