drawtextフィルタで映像にテキスト書き込みできるffmpegをRaspberry Pi 3でビルドする


ffmpegでYouTubeにライブ配信して遊んでいます。ライブだと主張するため、映像に日時を書き込んでいます。
前回に紹介したFFmpegのビルド手順ではテキストの書き込みはできません。映像にテキスト書き込みを行うにはdrawtextフィルタが使えるようにビルドしなくてはなりません。
今回はその手順を紹介します。



前回の記事
Rapberry Pi 3 のハードウエアエンコーダh264_omxが使えるFFmpegをビルドする
Raspberry Pi 3でffplayをビルドする
でffplayが使えるFFmpegをビルドしました。
USBカメラの映像をYouTubeへライブ配信できます。
Raspberry Pi 3とffmpegでYouTubeへライブ配信をする

ライブ配信をする時にライブである事を主張するため日時を映像に書き込めるようにしましょう。
ffmpegで映像にテキストを書き込むにはdrawtextfilterを使います。
9.41 drawtext / FFmpeg Filters Documentation
drawtextフィルタを使うにはffmpegのconfigure時に
--enable-libfreetype --enable-libfontconfig --enable-libfribidi
を指定する必要があります。必要なライブラリもインストールします。

改めてビルド手順を紹介します。

drawtextが使えるFFmpegのビルド

piユーザとして説明します。piユーザのホームディレクトリの下のDownloadsフォルダで作業を行います。
Windowsパソコンでコマンドをコピペすると改行コードの問題で正しくペーストできないかもしれないので気を付けてください。

パッケージのインストール

ffplayをビルドするためとdrawtextフィルタのために必要なパッケージをインストールします。
sudo apt-get install -y libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsdl2-mixer-dev
sudo apt-get install -y libfontconfig1-dev libfribidi-dev
ソースを取得します。
cd ~/Downloads
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.1.2.tar.bz2
tar xjvf alsa-lib-1.1.2.tar.bz2

ALSAライブラリのビルド

ALSAライブラリをビルドします。
cd alsa-lib-1.1.2
./configure --prefix=/home/pi/Downloads/ffmpeg
make
make install
cd ..

FFmpegのビルド

この記事の公開時ではmasterブランチでビルドを行うとaacエンコードが極めて遅くなる症状が出てしまいます。そのため、バージョンn3.2.2をビルドします。
ffmpegのディレクトリへ移動します。
cd ffmpeg
使用するFFmpegのバージョンをcheckoutします。
git tag -l
git checkout refs/tags/n3.2.2
これはmasterブランチで問題が起きなければ必要ありません。

ビルドします。
./configure --enable-gpl --enable-nonfree --enable-mmal --enable-omx-rpi --enable-omx --enable-libfreetype --enable-libfontconfig --enable-libfribidi --extra-cflags="-I/home/pi/Downloads/ffmpeg/include" --extra-ldflags="-L/home/pi/Downloads/ffmpeg/lib" --extra-libs=-ldl
make -j4
ビルド時間は30分ほどでしょうか。
インストールします。
sudo make install
これで完成です。

動作確認

USBカメラをつないで映像をffplayで表示してみましょう。デスクトップで行います。
ffplay \
-f v4l2  -input_format yuyv422 -video_size 1280x720 -framerate 8 -i /dev/video0 \
-vf drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf:fontcolor=#FFFFFF:fontsize=40:text='%{localtime}'",scale=640:-1
うまくいけばウインドウが開きUSBカメラの映像が表示されます。映像は横640ドットにスケールされます。画面左上に白い文字で日時が表示されているでしょう。こうなれば成功です。

まとめ

今回のビルド手順で作ったffmpegは、もちろんRaspberry Pi 3のハードウエアエンコードも使えます。
drawtextフィルタでは文字を書く場所も色も自由に設定できます。アルファ値の指定をすれば透過する文字にもできます。いろいろいじるとオプション指定が長くなって面倒ですけどね。

masterブランチではエンコードがとても遅くなり数fps程度となってしまいました。原因が良くわかっていません。どうやらAACエンコードが遅くなるようですが、出力フォーマットによっては問題が出なかったような気もします。あるいはALSA入力との組み合わせだと遅くなるのかもしれません。
バージョンn3.2.2では問題が起きないので、次のstableバージョンまで様子見です。

既に何回かライブ配信のテストをしています。配信映像の例は私のチャンネルをご覧ください。
パドルがひん曲がって見えますが、これがローリングシャッターの問題というやつですね。USBカメラじゃダメかな?やはりカメラを良くしたいな。どうするか・・・

新年3日にStandup Paddleの初乗り配信もしたのですけど、なぜかアップロード動画が壊れて再生できなくなったので削除しました。ローカルSDカードに保存していたビデオファイルも再生できない。ビデオファイルの修復もできませんでした。何が起きたのだろうか。天気が良くてほどほど波もあって気持ちの良い日だったのになぁ。

コメント

最近のコメント

Threaded Recent Comments will be here.