ffprobe 对于图像和文本文件返回 codec_type=video

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 没有合适的方法吗?

答案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

相关内容