46610号小行星

46610号小行星

FFmpegを使用してビデオにウォーターマークを追加する方法はありますか?

イントロダクション#

最近、仕事で大量のビデオに一括でウォーターマークを追加する必要があるという要件に直面しました。既存のウォーターマーク追加プログラムを試してみましたが、いくつかは有料であり、いくつかはスクリプトをサポートしていませんでした。実際、商用のビデオ処理プログラムのほとんどは、機能を実現するために FFmpeg を多かれ少なかれ利用していることが広く知られています。そのため、私はビデオに直接 FFmpeg を使用してウォーターマークを追加することにしました。これにより、バッシュスクリプトを使用して簡単にバッチ処理を行うこともできます。ちなみに、FFmpeg を利用した商用プログラムの中には、オープンソースライセンスに従わないものもあり、本当に悪いですね!

ダウンロードとインストール#

macOS/Linux では、パッケージ管理ツールを使用して直接インストールできます。Windows の場合は、FFmpeg のダウンロードからダウンロードしてください。具体的な手順は省略します。

使用方法#

FFmpeg の使用は非常に簡単です。
-iは入力ファイルを指定します。
末尾に出力ファイルを指定します。
ffmpeg -i input.mp4 output.avi
これは、mp4 形式のビデオを avi 形式に変換することを意味します。

-c:vパラメータを使用してビデオエンコーダの形式を指定することもできます。デフォルトは h264 エンコードです。

これは最も一般的なビデオ形式の変換ですが、私たちが必要としているのはウォーターマークの追加です。FFmpeg には、クリッピング、回転、画像の解像度変更、フィルタの追加などの機能を実現するためのフィルタオプションである-filterが用意されています。

FFmpeg には、シンプルなフィルタと複雑なフィルタの 2 種類があります。シンプルなフィルタは単一の入力と単一の出力の場合にのみサポートされ、複雑なフィルタは単純な線形処理ではないため、複数の入力と複数の出力をサポートしています。一般的に、シンプルなフィルタの処理速度は比較的高速であり、関連するフレームのデコード後に再エンコードされます。

 _________                        ______________
|         |                      |              |
| decoded |                      | encoded data |
| frames  |\                   _ | packets      |
|_________| \                  /||______________|
             \   __________   /
  simple     _\||          | /  encoder
  filtergraph   | filtered |/
                | frames   |
                |__________|

また、フィルタ同士を直列に組み合わせることもできます。1 つのフィルタの出力が別のフィルタの入力となり、フィルタチェーンが形成されます。

-vfはビデオフィルタのパラメータを、-afはオーディオフィルタのパラメータを表します。

例えば、

ffmpeg -i input.mp4 -c:v libx264 -vf "transpose=2" output.mp4

は、メインのビデオトラックを反時計回りに 90 度回転させることを意味します。

-vfパラメータの間にカンマを追加することで、フィルタチェーンを形成することもできます。

transpose のようなフィルタは他にもたくさんあります。FFmpeg フィルタドキュメントでは、ビデオフィルタだけでも約 300 種類のフィルタが利用可能です。

ウォーターマークの追加#

ウォーターマークの追加には大きく分けて 2 つのタイプがあります。

  • テキストウォーターマーク
  • 画像ウォーターマーク

これらのウォーターマークの追加時には、ウォーターマークの内容、位置、サイズ、透明度などを考慮する必要があります。

以下で 1 つずつ説明します。

テキストウォーターマーク#

テキストウォーターマークは、drawtextフィルタを使用して実装されます。

Drawtext ドキュメント

いくつかの有用なパラメータを紹介します。

  • fontsize(フォントサイズ)
  • fontfile(フォント)
  • text(テキスト)
  • x(x 座標)
  • y(y 座標)
  • fontcolor(テキストの色)
  • alpha(透明度)

以下のコマンドを使用してテストしてみます。

ffmpeg -i input.mp4 -vf "drawtext=fontsize=100:fontfile=Arial.ttf:text='水印':x=20:y=20:fontcolor=red:alpha=0.5" output.mp4

効果

截屏 2023-05-13 17.53.25.png

色、位置、フォント、透明度がすべてカスタマイズできることがわかります。

画像ウォーターマーク#

画像ウォーターマークは、movieoverlayの 2 つのパラメータを使用して実装されます。

以下に例を示します。

ffmpeg -i input.mp4 -vf "movie=watermark.jpg[wm];[in][wm]overlay=20:20[out]" output.mp4

効果

截屏 2023-05-13 18.03.16.png

写真が少し大きいようですが、どうすればいいでしょうか?これには前述のフィルタチェーンを使用して処理する必要があります。scaleを使用して画像を縮小します。

ffmpeg -i input.mp4 -vf "movie=watermark.jpg,scale=50:50[wm];[in][wm]overlay=20:20[out]" output.mp4

截屏 2023-05-13 18.07.02.png

写真が画面を覆ってしまうようですが、どうすればいいでしょうか?それなら透明にしてしまいましょう!まず、formatを使用して画像をアルファチャンネルを持つピクセルフォーマットに変換し、指定したブレンド方法で実現します。

ffmpeg -i input.mp4 -vf "movie=watermark.jpg,scale=200:200,format=yuva444p,colorchannelmixer=aa=0.5[wm];[in][wm]overlay=20:20[out]" output.mp4

截屏 2023-05-13 18.16.06.png

しかし、最初から透明な png 画像を使用しないのはなぜでしょうか?笑、それはもっと便利だからのようですね。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。