web-dev-qa-db-ja.com

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は、主に時限メディアサンプルのプロセッサです。画像は、1つのフレームで構成されるビデオストリームです。 format=format_nameエントリでpipeをチェックすることは、画像を検出するための最善の策です。

テキストファイルに関する限り、ffmpegは.txtの内容をビデオ画像に変換し、codec_typeはデコードされたストリームタイプを示します。 format_namettyをもう一度確認できます。

2
Gyan

Gyanのコメントの助けを借りて、私は魚のシェルのためにこの小さな関数を作成しました。

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
0