次のコマンドでビデオの解像度を取得しようとしています。
ffmpeg -i filename.mp4
出力は長くなりますが、bashスクリプトの幅と高さだけが必要です。これらのパラメーターをどのようにフィルターで除外する必要がありますか?多分これを行うためのより良い方法があるでしょう。
ffprobe
を使用$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
1280x720
- 見る -of
オプションのドキュメント より多くの選択肢とオプション。継続時間やフレームレートなど、他の例については FFprobeヒント も参照してください。
なしで [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
$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 input.mp4
1280,720
$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of json input.mp4
{
"programs": [
],
"streams": [
{
"width": 1280,
"height": 720
}
]
}
$ 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>
次のコマンドは、必要に応じて高さまたは幅を取得するために、純粋に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
以下は、これらのコマンドで実行していることです。
ffmpeg -i
を実行してファイル情報を取得します。Video:
情報のみを含む行を抽出しています。digitsxdigits
のような3〜5文字の文字列のみを抽出します。x
の前後のテキストを切り取ります。ffprobe
の出力は次のようになります。
streams_stream_0_width=1280
streams_stream_0_height=720
技術的には、eval
を使用してこれらをbash
変数に割り当てることができますが、これは必須ではなく、安全でない場合があります。詳細はこちらをご覧ください:
代わりに、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}"
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
私は最終的に答えを見つけました:
私はこれを使用しました メディア情報と呼ばれるパッケージ
そして私は命じました:
mediainfo mediainfo --Inform="Video;%Width%" midhand.mp4
パラメータのリストを表示するには:
mediainfo --Info-Parameters
ビデオメタデータを抽出するための最良のツール!
質問は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の場合。