web-dev-qa-db-ja.com

ffmpegを使用してビデオ解像度を取得するにはどうすればよいですか?

次のコマンドでビデオの解像度を取得しようとしています。

ffmpeg -i filename.mp4

出力は長くなりますが、bashスクリプトの幅と高さだけが必要です。これらのパラメーターをどのようにフィルターで除外する必要がありますか?多分これを行うためのより良い方法があるでしょう。

25

ffprobeを使用

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
  1280x720

その他の出力フォーマットの選択肢の例

- 見る -ofオプションのドキュメント より多くの選択肢とオプション。継続時間やフレームレートなど、他の例については FFprobeヒント も参照してください。

Default

なしで [STREAM]ラッパー:

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=nw=1 input.mp4
  width=1280
  height=720

キーなし:

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=nw=1:nk=1 input.mp4
  1280
  720

CSV

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 input.mp4
  1280,720

JSON

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of json input.mp4
{
    "programs": [

    ],
    "streams": [
        {
            "width": 1280,
            "height": 720
        }
    ]
}

XML

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of xml input.mp4
<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
    <programs>
    </programs>

    <streams>
        <stream width="1280" height="720"/>
    </streams>
</ffprobe>
41
llogan

次のコマンドは、必要に応じて高さまたは幅を取得するために、純粋にffmpeg(およびgrepおよびcut)に依存しています。

高さ:

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' | cut -d'x' -f1

1280

幅:

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' | cut -d'x' -f2

720

2つの違いは、cutに対する-fパラメータだけです。

完全な解決文字列を使用する場合は、cutは必要ありません。

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}'

1280x720

以下は、これらのコマンドで実行していることです。

  1. ffmpeg -iを実行してファイル情報を取得します。
  2. Video:情報のみを含む行を抽出しています。
  3. digitsxdigitsのような3〜5文字の文字列のみを抽出します。
  4. 最初の2つについては、xの前後のテキストを切り取ります。
4
aalaap

ffprobeの出力は次のようになります。

streams_stream_0_width=1280
streams_stream_0_height=720

技術的には、evalを使用してこれらをbash変数に割り当てることができますが、これは必須ではなく、安全でない場合があります。詳細はこちらをご覧ください:

https://stackoverflow.com/questions/17529220/why-should-eval-be-avoided-in-bash-and-what-should-i-use-instead

代わりに、bashを使用しているため、組み込みの配列と文字列操作を利用します。

filepath="filename.mp4"
width_prefix='streams_stream_0_width='
height_prefix='streams_stream_0_height='
declare -a dimensions
while read -r line
do
    dimensions+=( "${line}" )
done < <( ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height "${filepath}" )
width_with_prefix=${dimensions[0]}
height_with_prefix=${dimensions[1]}
width=${width_with_prefix#${width_prefix}}
height=${height_with_prefix#${height_prefix}}
printf "%s\t%sx%s\n" "${filepath}" "${width}" "${height}"
2

grepを使用して、探している行のみを選択します。 ffmpegはすべての情報をそこに出力するため、出力をSTDERRからSTDOUTにリダイレクトします。

ffmpeg -i filename.mp4 2>&1 | grep <keyword>

編集:Perlを使用した完全に機能する例:

$ ffmpeg -i MVI_7372.AVI 2>&1 | grep Video | Perl -wle 'while(<>){ $_ =~ /.*?(\d+x\d+).*/; print $1 }'
640x480
1
Andreas F

私は最終的に答えを見つけました:

私はこれを使用しました メディア情報と呼ばれるパッケージ

そして私は命じました:

mediainfo mediainfo --Inform="Video;%Width%" midhand.mp4

パラメータのリストを表示するには:

mediainfo --Info-Parameters

ビデオメタデータを抽出するための最良のツール!

1

質問はbashに関するものだと知っていますが、誰かがWindowsバッチの解決策を探してここで終了した場合に備えて、私がそれを見つける前に私自身がそうでした。

for /f "delims=" %%a in ('ffprobe -hide_banner -show_streams filename.mp4 2^>nul ^| findstr "^width= ^height="') do set "myvideo_%%a"

コンソールメッセージは表示されず、Nice環境変数myvideo_widthおよびmyvideo_heightで終わります。あなたはそれをチェックすることができます:

C:\>set myvideo_
myvideo_height=720
myvideo_width=1280

もちろん、ビデオの解像度が1280x720の場合。

0
cdlvcdlv