ffmpeg/avconv で動画のサイズを変更して、静的なサイズのプレーヤーに収まるようにする

ffmpeg libav video-conversion

私は幅700px、高さ400pxのhtml 5ビデオプレーヤーを持っています。私はavconvでffmpegを使って(アスペクト比を保ったまま)サイズを変更して、プレーヤーに収まるようにしようとしています

入力はどんなサイズのファイルでも良いので、大きいものはリサイズして、小さいものは黒い棒で中央にする必要があります。これまでに試したことがあります。-s-aspectpad-vf スイッチと一緒に使われているのを見たことがありますが、必要なものを得るためにどのように働くのか理解できていません

Images

これが大まかな目安です。実現可能かどうかもわからないけど。ほぼCSSのmax-width/max-heightのような感じです。私はこれが単なる言葉のごちゃごちゃかもしれないことを認識していますが、もし誰か私が言っていることを理解している人がいたら、私は助けを感謝します、ありがとう

avconv command:

avconv -y -i control.avi -vcodec libx264 -b 2000k -bufsize 20M -acodec aac -strict experimental -ar 44100 -ab 256k bigbuck_out.mp4

  72  Jamie Taylor  2013-02-06


ベストアンサー

簡単な方法は、スケールフィルタforce_original_aspect_ratioオプションを使用することです

original image オリジナル画像。640×480、4:3 のアスペクト比の動画を表します

これらの例では、元の画像は元のアスペクト比を維持したまま、1280×720、16:9のアスペクト比の出力に収まるようにスケーリングされます。これを行うには、次のいずれかの方法があります


ピラーボックスやレターボックスに合わせて

pillarboxed image ピラーボックス化された画像。640×480 (4:3) 入力を 1280×720 (16:9) output.にフィット

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 の出力に収まると、レターボックシングが発生します

上記と同じですが、アップスケーリングなし

no upscaling 640×480 (4:3) 入力から1280×720 (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

フィットするようにクロップ

enter image description here 切り抜き画像。入力アスペクト比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進数の値を指定するか、サポートされている 色名 を使用することができます

68  llogan  2016-10-18


出力幅を固定して柱状やレターボックスを追加するコマンドは以下の通りです。少し長いですが、何らかの方法でパディングを指定する必要があります

まず、シェルで出力の幅と高さを定義します

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

これは、他のビデオやオーディオのオプションのサイズ変更やパッドの追加に必要な基本的なものだけを抜粋したものです。ほとんどのコーデックで動作するためには、widthheight の数値は 2 で割り切れる値でなければならないことに注意してください

ここでは、その説明をします

  • Scaling:
    • まず、幅と高さのどちらで縮尺するかを考える必要があります
    • これを行うには、出力幅を入力幅で割り、出力高さを入力高さで割ります。これにより、各次元のスケール係数が得られます
    • そして、どちらが低いか(min()で)をチェックして、その係数だけを選択してリサイズします
    • 最後に、入力の幅と高さの両方にその係数(iw*min(…):ih*min(…))を掛けます
  • Padding:
    • $width:$heightは出力幅と高さです
    • 結果として得られるビデオをどこに配置するかを決定するには、最大出力幅からスケーリングされた幅を減算し、最大出力高さからスケーリングされた高さを減算する必要があります
    • 縮尺された幅と高さは scale フィルタの表現です
    • 結果として得られたオフセットを2で割って、両側にボーダーを追加します

62  slhck  2013-02-06


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

明らかにあなたのニーズに合わせる必要があります

8  evilsoup  2013-02-06


タイトルとURLをコピーしました