panda's tech note

ffmpegでタイムスタンプを付ける方法

ffmpeg を使って防犯カメラやドライブレコーダーのように動画内に日付と時刻を合成して書き込む方法を紹介します。

時刻の文字を描画するために,フォントを準備する必要があります。今回は以下のように Ubuntu で fonts-fantasque-sans パッケージをインストールして,フォントファイルを準備しています。

$ sudo apt install fonts-fantasque-sans

フォントファイルは /usr/share/fonts ディレクトリにインストールされるので,そこから適当なフォントファイルを選択します。今回は /usr/share/fonts/truetype/fantasque-sans/Normal/TTF/FantasqueSansMono-Bold.ttf を使います。

入力デバイス(カメラ) /dev/video0 の映像に,上記手順で準備したフォント(20pt, 赤)で時刻を画面左上に描画して tmp.mkv ファイルに保存するコマンドは以下の通りです。動画のエンコード形式は H.264 としました。

$ ffmpeg -f v4l2 -i /dev/video0 -vf "drawtext=fontfile=/usr/share/fonts/truetype/fantasque-sans/Normal/TTF/FantasqueSansMono-Bold.ttf: fontsize=20: text='%{localtime\:%Y-%m-%d %X}': fontcolor=red@0.9: x=10: y=10" -c:v libx264 tmp.mkv

このコマンドで録画すると,以下のように動画の現在時刻が左上に描画できます。

ffmpeg timestamp

ここで上記コマンドの意味を説明します。

まず,

-f v4l2 -i /dev/video0

は入力を指定しています。-f オプションはこの後に指定する入力デバイスの形式を指定するオプションで, v4l2 は Video4Linux 形式のことで,多くのUSBカメラなどの動画デバイスに対して共通のAPIを提供する Linux モジュールです。 -i オプションは,入力ファイルやデバイスを指定します。今回は /dev/video0 を指定しています。環境によっては別のパスのこともあります。

次に,

-vf "drawtext=fontfile=/usr/share/fonts/truetype/fantasque-sans/Normal/TTF/FantasqueSansMono-Bold.ttf: fontsize=20: text='%{localtime\:%Y-%m-%d %X}': fontcolor=red@0.9: x=10: y=10"

のオプションについて説明します。-vf オプションは動画の拡大や縮小などの加工を指定するためのオプションで,ここで今回のタイムスタンプを描画するオプションを指定します。この -vf オプション内で drawtext=... と指定することで,文字の描画を指定しています。フォントや書き込む文字列のオプションは,この drawtext= の後ろに key=value: 区切りで指定します。 fontfile では上記でインストールしたフォントファイルのパスを指定しています。

次に fontsize でフォントサイズを指定しています。 text の内容が書き込む文字列です。ここで '%{localtime\:%Y-%m-%d %X}'localtime 変数を %Y-%m-%d %X 形式でフォーマットすることを意味します。フォーマットの指定は strftime と同じです。つまり,このオプションは localtime 変数は OS で設定しているタイムゾーンのタイムスタンプ(ローカルタイム)を %Y-%m-%d %X 形式でフォーマットして描画することを表しています。

この後ろの fontcolor で文字の色を指定します。今回は赤 (red) で透明度(アルファ値)を 0.9 にしました。最後の xy オプションは,文字を描画する場所を指定します。画面の左上の座標が (0, 0) なので,上記オプションは左上から右および下に10ピクセルの場所(ほぼ左上)に描画しています。