我有一个包含许多不同类型的文件的目录,我想找出每个视频文件的编解码器。使用以下命令可以很好地完成此操作:
$ 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 没有合适的方法吗?
答案1
FFmpeg 主要是一个定时媒体样本处理器。图像是由一帧组成的视频流。检查pipe
条目format=format_name
是检测图像的最佳方法。
对于文本文件,ffmpeg 会将.txt
内容转换为视频图像,codec_type 表示解码后的流类型。您可以format_name
再次检查tty
。
答案2
在 Gyan 的评论的帮助下,我为 fish shell 创建了这个小功能。
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