2021年9月25日土曜日

ffmpeg-ptyhonでdrawtextフィルタを使用して、動画上に文字列を描画する

ffmpeg-ptyhonでdrawgridフィルタを使用して、動画上に文字列を描画するには、以下のサンプルプログラムのようにfilterメソッドにフィルタ名"drawtext"とパラメータを指定します。

サンプルプログラム

以下のサンプルプログラムを保存して実行します。

※ffmepg-pythonがインストールされた仮想環境の作成方法は「FFmpegをPythonから操作できるffmpeg-pythonをインストールした仮想環境を作成し、動画形式変換する」を参考にしてください。

各パラメータは以下の意味を持ちます。
・xパラメータ: x座標
・yパラメータ: y座標
・textパラメータ: 描画する文字列。「\n」で改行できます。
・fontfileパラメータ: 描画するフォントのファイルを指定します。日本語を描画する場合は、日本語フォントのファイルを指定します。
・fontsizeパラメータ: 文字の大きさを指定します。
・fontcolorパラメータ: 文字色

ffmpeg_drawtext.py
import ffmpeg

input = ffmpeg.input('./lake.mp4')
processed = input.video.filter("drawtext",x=100,y=50,text=u"サンプルです。\n2行目です。",fontfile="/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",fontsize=100,fontcolor='#FFFFFF')
ffmpeg.output(processed, input.audio, './lake_drawtext.mp4').run()

・実行方法
以下のコマンドを実行して、サンプルプログラムを実行します。
python ffmpeg_drawtext.py

〇元動画

〇出力動画

行間スペースの指定

改行を含む文字列を描画するとき、行間のスペースはline_spacingパラメータで指定できます。

ffmepg_drawtext_linespacing.py
import ffmpeg

input = ffmpeg.input('./lake.mp4')
processed = input.video.filter("drawtext",x=100,y=50,text=u"サンプルです。\n2行目です。",fontfile="/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",fontsize=100,fontcolor='#FFFFFF',line_spacing=200)
ffmpeg.output(processed, input.audio, './lake_drawtext_linespacing.mp4').run()

〇出力動画

文字列が含まれる矩形領域の色の指定

文字列が含まれる矩形領域の色の指定はboxcolorパラメータで指定し、boxパラメータに1を指定することで文字列を含む矩形領域が塗りつぶされます。

ffmepg_drawtext_boxcolor.py
import ffmpeg

input = ffmpeg.input('./lake.mp4')
processed = input.video.filter("drawtext",x=100,y=50,text=u"サンプルです。\n2行目です。",fontfile="/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",fontsize=100,fontcolor='#FFFFFF',box=1,boxcolor='#008800')
ffmpeg.output(processed, input.audio, './lake_drawtext_boxcolor.mp4').run()

〇出力動画

縁取りした文字列を描画

borderwパラメータで縁取りの幅、bordercolorパラメータで縁取りの色を指定することが出来ます。

ffmepg_drawtext_bordercolor.py
import ffmpeg

input = ffmpeg.input('./lake.mp4')
processed = input.video.filter("drawtext",x=100,y=50,text=u"サンプルです。\n2行目です。",fontfile="/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",fontsize=100,fontcolor='#FFFFFF',borderw=10,bordercolor='#404040')
ffmpeg.output(processed, input.audio, './lake_drawtext_bordercolor.mp4').run()

〇出力動画

影付き文字の描画

shadowcolorで影の色、shadowx/shadowyで元の文字に対する影文字の相対位置を指定します。

ffmepg_drawtext_shadowcolor.py
import ffmpeg

input = ffmpeg.input('./lake.mp4')
processed = input.video.filter("drawtext",x=100,y=50,text=u"サンプルです。\n2行目です。",fontfile="/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",fontsize=100,fontcolor='#FFFFFF',shadowcolor='#202060',shadowx=10,shadowy=5)
ffmpeg.output(processed, input.audio, './lake_drawtext_shadowcolor.mp4').run()

〇出力動画

文字列を右下に描画

座標x/yを指定する際、定義済みの変数を使用することができます。これらを使用して計算して、画面の右下に文字列を描画することが出来ます。
w: 入力画像の幅
h: 入力画像の高さ
tw: 描画する文字列の幅
th: 描画する文字列の高さ

ffmepg_drawtext_pos.py
import ffmpeg

input = ffmpeg.input('./lake.mp4')
processed = input.video.filter("drawtext",x="(w-tw)",y="(h-th)",text=u"サンプルです。",fontfile="/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",fontsize=100,fontcolor='#FFFFFF')
ffmpeg.output(processed, input.audio, './lake_drawtext_pos.mp4').run()

〇出力動画

フォントに関するtips

googleさんの日本語Notoフォントは、以下のコマンドでインストールする事が出来ます(Ubuntu 20.04)。
sudo apt-get -y install fonts-noto-cjk

インストールされているフォントの一覧は以下のコマンドで確認できます。
fc-list

関連情報

・様々な動画に関するアプリケーションについては、以下のまとめを参照してください。
動画関連アプリケーションのまとめ

0 件のコメント:

コメントを投稿