ffprobe возвращает codec_type = video для изображений и текстовых файлов

491
Alexander Bösecke

У меня есть каталог с множеством файлов разных типов, и я хочу узнать кодек каждого видеофайла. Это хорошо работает с этой командой:

$ ffprobe -v error -select_streams v -show_entries stream=codec_name,codec_type -of default=noprint_wrappers=1 video-file codec_name=hevc codec_type=video 

Но, к сожалению, я также получаю результат для JPG и текстовых файлов:

$ ffprobe -v error -select_streams v -show_entries stream=codec_name,codec_type -of default=noprint_wrappers=1 file.jpg  codec_name=mjpeg codec_type=video $ ffprobe -v error -select_streams v -show_entries stream=codec_name,codec_type -of default=noprint_wrappers=1 file.txt codec_name=ansi codec_type=video 

Оба файла явно не видеофайлы. Ну, я мог бы отфильтровать расширения файлов или занести в черный список эти имена кодеков. Но нет ли правильного способа с ffprobe?

2

2 ответа на вопрос

2
Gyan

FFmpeg - это, прежде всего, процессор синхронизированных выборок медиа. Изображение - это видеопоток, состоящий из одного кадра. Проверка pipeв format=format_nameзаписи является лучшим выбором для обнаружения изображений.

Что касается текстовых файлов, ffmpeg преобразует .txtсодержимое в видеоизображение, а codec_type указывает тип декодированного потока. Вы можете проверить еще format_nameраз tty.

Спасибо, это очень помогло мне понять проблему. Знаете ли вы другие не видео форматы, где ffmpeg распознает видеопоток? Alexander Bösecke 5 лет назад 0
0
Alexander Bösecke

С помощью комментария Гаяна я создал эту маленькую функцию для раковины рыбы.

function gvc --description 'Get the video codec of a file if the file is a video' --argument file if test -f "$file" set format (ffprobe -v panic -select_streams v -show_entries format=format_name -of default=nokey=1:noprint_wrappers=1 $file) if test -n "$format" -a "$format" != "image2" -a "$format" != "tty" echo (ffprobe -v error -select_streams v -show_entries stream=codec_name -of default=nokey=1:noprint_wrappers=1 $file) end end return $status end 

Похожие вопросы