ピラーボックスまたはレターボックスに適合

ピラーボックスまたはレターボックスに適合

幅 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

背景色の変更

colorオプションを使用するパッドフィルター16進数値を指定するか、サポートされている色の名前

答え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、と の数値がheight2 で割り切れる必要があることに注意してください。

何が起こっているのかを説明します。

  • スケーリング:
    • まず、幅と高さのどちらで拡大縮小するかを決める必要があります。
    • これを行うには、出力の幅を入力の幅で割り、出力の高さを入力の高さで割ります。これにより、各次元のスケール係数が得られます。
    • 次に、どちらが低いか(min())を確認し、サイズ変更にはその係数のみを選択します。
    • 最後に、入力の幅と高さの両方にその係数 ( iw*min(…):ih*min(…)) を掛けます。
  • パディング:
    • $width:$height出力の幅と高さです
    • 結果のビデオをどこに配置するかを判断するには、最大出力幅からスケーリングされた幅を減算し、最大出力高さからスケーリングされた高さを減算する必要があります。
    • 拡大縮小された幅と高さはフィルターからの式ですscale
    • 結果のオフセットを 2 で割って、両側に境界線を追加します。

答え3

これを 3 つのステップで実行する必要があると思われます。

  1. 入力アスペクト比を確認する
  2. DAR > 7/4 のビデオを幅方向に拡大縮小し (幅を 700 に変更し、アスペクト比を維持するために高さを拡大縮小します)、DAR < 7/4 のビデオを高さ方向に拡大縮小します。
  3. ビデオを 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

当然、自分のニーズに合わせて調整する必要があります。

関連情報