
幅 700 ピクセル、高さ 400 ピクセルの HTML 5 ビデオ プレーヤーがあります。avconv
を使用してffmpeg
サイズを変更し (アスペクト比を維持したまま)、プレーヤーに収まるようにしたいと考えています。
入力ファイルは任意のサイズにすることができるため、大きいファイルのサイズを変更し、小さいファイルを黒いバーで中央に配置する必要があります。これまでに試したのは次のとおりです。-s
および、スイッチで使用されているの-aspect
を確認しましたが、必要な結果が得られるまでの動作を十分に理解していません。pad
-vf
これは私が必要としているものの大まかなアイデアです。それが可能かどうかはわかりません。CSS の max-width/max-height とほとんど同じです。これは単なる言葉の羅列かもしれませんが、私が話していることを理解できる方がいらっしゃいましたら、助けていただけるとありがたいです。ありがとうございます。
avconv
指示:
avconv -y -i control.avi -vcodec libx264 -b 2000k -bufsize 20M -acodec aac -strict experimental -ar 44100 -ab 256k bigbuck_out.mp4
答え1
簡単な方法はforce_original_aspect_ratio
、スケールフィルター。
元の画像。640x480、アスペクト比 4:3 のビデオを表します。
これらの例では、元の画像は元のアスペクト比を維持しながら、1280x720、16:9 アスペクト比の出力に収まるように拡大縮小されます。これを行うには、次のいずれかを実行します。
ピラーボックスまたはレターボックスに適合
ピラーボックス化された画像。640x480 (4:3) の入力を 1280x720 (16:9) の出力に適合させます。
ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1:color=black" output
これにより、画像が拡大されます。拡大を避けたい場合は、以下の例を参照してください。
入力アスペクト比が出力アスペクト比よりも広い場合、ピラーボックスではなくレターボックスが発生します。たとえば、アスペクト比 2.35:1 の入力を 16:9 の出力に合わせると、レターボックスが発生します。
上記と同じですが、アップスケールなし
640x480 (4:3) 入力をアップスケールなしで 1280x720 (16:9) 出力します。
ffmpeg -i input -vf "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:-1:-1:color=black" output
フィットするようにトリミング
トリミングされた画像。入力アスペクト比 4:3、出力アスペクト比 16:9。
使用方法切り抜きフィルター余分なものを切り取る:
ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720" output
それぞれサイズが異なる入力画像を使用する
一連の画像を入力する場合、画像のサイズが異なる場合はeval=frame
、スケールフィルター、 のような:
ffmpeg -i input -vf "scale=1280:720:force_original_aspect_ratio=decrease:eval=frame,pad=1280:720:-1:-1:color=black" output
背景色の変更
答え2
固定出力幅にピラーボックスまたはレターボックスを追加するコマンドを次に示します。少し長いですが、何らかの方法でパディングを指定する必要があります。
まず、シェルで出力の幅と高さを定義します。
width=700
height=400
次に、次のコマンドを実行します。
ffmpeg -i in.mp4 -filter:v "scale=iw*min($width/iw\,$height/ih):ih*min($width/iw\,$height/ih), pad=$width:$height:($width-iw*min($width/iw\,$height/ih))/2:($height-ih*min($width/iw\,$height/ih))/2" out.mp4
これは、サイズ変更とパディングに必要な最低限の要素にまで削減されています。必要に応じて、その他のビデオおよびオーディオ オプションを追加してください。ほとんどのコーデックで機能するにはwidth
、と の数値がheight
2 で割り切れる必要があることに注意してください。
何が起こっているのかを説明します。
- スケーリング:
- まず、幅と高さのどちらで拡大縮小するかを決める必要があります。
- これを行うには、出力の幅を入力の幅で割り、出力の高さを入力の高さで割ります。これにより、各次元のスケール係数が得られます。
- 次に、どちらが低いか(
min()
)を確認し、サイズ変更にはその係数のみを選択します。 - 最後に、入力の幅と高さの両方にその係数 (
iw*min(…):ih*min(…)
) を掛けます。
- パディング:
$width:$height
出力の幅と高さです- 結果のビデオをどこに配置するかを判断するには、最大出力幅からスケーリングされた幅を減算し、最大出力高さからスケーリングされた高さを減算する必要があります。
- 拡大縮小された幅と高さはフィルターからの式です
scale
。 - 結果のオフセットを 2 で割って、両側に境界線を追加します。
答え3
これを 3 つのステップで実行する必要があると思われます。
- 入力アスペクト比を確認する
- DAR > 7/4 のビデオを幅方向に拡大縮小し (幅を 700 に変更し、アスペクト比を維持するために高さを拡大縮小します)、DAR < 7/4 のビデオを高さ方向に拡大縮小します。
- ビデオを 700:400 のスペースに収まるようにパディングします。
FFmpeg/avconv は、ビデオ フィルターを使用してスケーリング/パディングを 1 つのステップで実行し、トランスコードを 1 回だけ実行できます。たとえば、16:9 のビデオを撮影し、幅方向にスケーリングしてから、結果をレターボックス化するには、次のようにします。
ffmpeg -i input.avi -filter:v 'scale=700:-1,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
-c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k output.mp4
...ただし、最初のステップ (アスペクト比を検出し、必要な 7:4 と比較する) では、何らかのスクリプトを使用する必要があります。
ffprobe input.avi 2>&1 | sed -n '/Video:/s/.*DAR \([0-9]*:[0-9]*\)].*/\1/p'
...ビデオのアスペクト比を取得します。これは「16:9」または「4:3」のようになります。bash スクリプトでは、次のようなものを使用します。
#!/bin/bash
## Get the aspect ratio in the form x/y
dar=$(ffprobe test0.mp4 2>&1 | sed -n '/Video:/s/.*DAR \([0-9]*:[0:9]*\)].*/\1/p' | sed 's|:|/|')
## use bc to do x/y*100 (bash can't handle floats)
DAR=$(bc <<< 'scale=2; $dar*100')
## ${DAR%.00} will remove the trailing .00 left by bc
if [ ${DAR%.00} -ge 175 ]; then
ffmpeg -i "$1" -filter:v 'scale=700:-1,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
-c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k "${1%.*}.mp4
else
ffmpeg -i "$1" -filter:v 'scale=-1:400,pad=700:400:(ow-iw)/2:(oh-ih)/2' \
-c:v libx264 -b:v 2000k -bufsize 20M -c:a aac -strict experimental -ar 44100 -b:a 256k "${1%.*}.mp4
fi
exit 0
当然、自分のニーズに合わせて調整する必要があります。