FFmpegフィルターを使用した降雪

FFmpegは、幅広い機能を備えた強力なソフトウェアです。 この記事では、ffmpegフィルターのちょっと変わったアプリケーションと、それらを排他的に使用して何ができるかについてお話します。 以下のビデオは、1つのffmpegコマンドを使用して作成されました(グラフィックエディターは破損していません)。





gitからコンパイルされた最新バージョンのffmpegを使用します。 したがって、私の例を動作させたい場合は、masterブランチからコンパイルすることをお勧めします。 アセンブリとインストールは簡単で、サイトffmpeg.orgで説明されています。./configureで「--enable-libfreetype」を指定することを忘れないでください。



まず、ビデオの背景を作成する必要があり、ffmpegツールを使用します。 実際、ffmpegを使用すると、実際のデバイス(ビデオカメラやsdiカードなど)やファイルを入力ソースとして使用できるだけでなく、 lavfiという独自の仮想デバイスも使用できます。



FFmpegには、ビデオ画像を生成する既製のフィルターがいくつか含まれています。 それらの中には:



フィルターの完全なリストは、コマンドで表示できます

ffmpeg -filters







それらは次のようになります。





ffmpegのみを使用することを示したため、1つのffmpegコマンドでこのイメージを生成しました。 ここにあります:

 ffmpeg \ -f lavfi -i "testsrc=s=320x240" \ #   lavfi       320x240 -f lavfi -i "cellauto=s=320x240" \ -f lavfi -i "life=s=320x240" \ -f lavfi -i "mandelbrot=s=320x240" \ -f lavfi -i "rgbtestsrc=s=320x240" \ -f lavfi -i "smptebars=s=320x240" \ -filter_complex \ "[0:0]pad=iw*6:ih[a];\ #      pad [1:0]pad=iw:ih[b];\ [2:0]pad=iw*2:ih[c];\ [3:0]pad=iw*3:ih[d];\ [4:0]pad=iw*4:ih[e];\ [5:0]pad=iw*5:ih[f];\ [a][b]overlay=w[x];\ #      overlay [x][c]overlay=w[y];\ [y][d]overlay=w[z];\ [z][e]overlay=w[v];\ [v][f]overlay=w" -vframes 1 all_filters.jpg
      
      





写真を作成しましたが、このコマンドを使用して、6つのビデオを連続して組み合わせたり、「パズル」を作成したりできますが、入力ソースとしてビデオファイルを置き換え、パッドとオーバーレイフィルターの設定を変更するだけです。 オプションを見てみましょう:



そして、ビデオの背景を作成します。

 ffmpeg2 -f lavfi -i "color=lightblue" -t 30 -y blue.ts
      
      





ここではすべてが写真付きの例と同じですが、ここではビデオを作成し、フィルタージェネレーターの代わりに単純なカラーフィルターを使用しています。 フレーム数に加えて、「-t」スイッチを使用してビデオの継続時間を指定できます。 デフォルトでは、ffmpegは出力ストリームのfpsを25に設定します。出力.tsファイルに拡張子を指定したため、ffmpegはMPEG2TSコンテナとmpeg2videoコーデックを使用します。



スノーフレークを追加します。 これには、drawtextフィルターを使用します。 はい、はい、テキストまたは特別なUnicodeシンボル ""(U + 2744)を使用してスノーフレークを描画します。







これを行うチーム:

 ffmpeg -f lavfi -i "color=lightblue" \ -vf "drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=50:text='':fontcolor=white:x=sin(n/10)*30+w/2:y=n" \ -t 5 -y snow.gif
      
      





Drawtextフィルターオプション:





ご覧のとおり、すべてのソルトは座標にあります。 実際、ffmpegを使用すると、たとえばフレーム番号やタイムスタンプに応じて、一部のフィルターのパラメーターをその場で変更できます。 この例では、既におなじみのwとhに加えて、別の内部エイリアスffmpega“ n”を使用しました。これは、現在のフレームの番号と正弦関数で、雪片を左右に移動させます。 ffmpegフィルターでは、truncやrandomなどの三角関数および算術関数を使用できます。 機能の完全なリストはここにあります



これで、さらにフィルターを追加するだけになります(さらにフィルターが必要です!)他の雪片を作成し、サイズと動きを変更します。
Ffmpegスタートライン
 ffmpeg -f lavfi -i "color=lightblue" \ -vf "drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=10:text='':fontcolor=white:x=sin(n/10)*30:y=3*n,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=16:text='':fontcolor=white:x=cos(n/9)*3+w/3:y=n/2-h/16,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=19:text='':fontcolor=white:x=sin(n/7)*10+w/9:y=n/3-h/20,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=15:text='':fontcolor=white:x=cos(n/25)*20+w/2:y=nh/9,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=20:text='':fontcolor=white:x=sin(n/19)*4+ww/3:y=nh/20,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=17:text='':fontcolor=white:x=cos(n/10)*9+w/7:y=n/2-h/18,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=16:text='':fontcolor=white:x=sin(n/20)*23+ww/7:y=2*nh/15,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=19:text='':fontcolor=white:x=cos(n/15)*15+w/5:y=nh/6,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=20:text='':fontcolor=white:x=sin(n/15)*50+ww/9:y=nh/10,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=12:text='':fontcolor=white:x=cos(n/30)+w/2:y=n*2,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=16:text='':fontcolor=white:x=cos(n/9)*3+w/3:y=n/2-h/6,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=19:text='':fontcolor=white:x=sin(n/7)*10+w/9:y=n/4-h/2,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=15:text='':fontcolor=white:x=cos(n/25)*20+w/2:y=n/5-h/2,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=20:text='':fontcolor=white:x=sin(n/19)*4+ww/3:y=nh/2,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=17:text='':fontcolor=white:x=cos(n/10)*9+w/7:y=n/2-h/2,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=16:text='':fontcolor=white:x=sin(n/20)*23+ww/7:y=2*nh/3,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=19:text='':fontcolor=white:x=cos(n/15)*15+w/5:y=n/6-h/2,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=20:text='':fontcolor=white:x=sin(n/15)*50+ww/9:y=2*nh/2,\ drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf:fontsize=12:text='':fontcolor=white:x=cos(n/22)+w/2:y=2+h"\ -qscale 1 -s 720x560 -t 12 -y snow.mp4
      
      









上のビデオでは、このコマンドの結果。 残念ながら、fontsizeパラメーターにランダム関数の結果を値として受け入れることはできませんでした。おそらくこれはまだサポートされていません。 結論として、私が遭遇したもう1つのニュアンスを指摘します。テキストパラメーターも、text = nという形式の値を取りません。 フレーム番号を表示するには、「text =%{expr \\:n}」構文を使用します。 それは私にとってすべてです、あなたがあなた自身のために新しい何かを学んだことを願っています。



All Articles