ffprobe возвращает codec_type=video для изображений и текстовых файлов
У меня есть каталог с множеством файлов разных типов, и я хочу узнать кодек каждого видеофайла. Это хорошо работает с этой командой:
$ 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 ответа
FFmpeg - это, прежде всего, процессор синхронизированных выборок медиа. Изображение - это видеопоток, состоящий из одного кадра. Проверка на pipe
в format=format_name
Запись - ваш лучший выбор для обнаружения изображений.
Что касается текстовых файлов, ffmpeg преобразует .txt
содержимое видеоизображения, а codec_type указывает тип декодированного потока. Ты можешь проверить format_name
снова для tty
,
С помощью комментария Гаяна я создал эту маленькую функцию для раковины рыбы.
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