FFmpegでタイムコードを書き込んだ動画を作成する


先に作ったShaka Streamerの環境で提供されるHLSがどの程度の遅延なのか確認するため、タイムコードを書き込んだ動画を作成する。
(よくよく考えたらタイムコードを書き込んだ動画を作成しただけでは遅延が確認するのは難しいことがわかったので、遅延を確認する環境の構築はまた改めて検討したい。なので、本記事ではタイムコードを書き込んだ動画を作成することだけにフォーカスする)

参考にしたページ

https://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping
https://trac.ffmpeg.org/wiki/Limiting%20the%20output%20bitrate
https://trac.ffmpeg.org/wiki/FilteringGuide
https://support.apple.com/en-us/HT201749

一番最初のリンクはかなり昔からお世話になっている気がする。

使用した環境

  • macOS 10.14.6(18G3020)
  • ffmpeg version 4.1.4

ffmpegのコマンド

オリジナルの動画は http://www.caminandes.com/ から拝借。

ffmpeg -i 03_caminandes_llamigos_1080p.mp4 \
-vcodec h264 -profile:v main -b:v 1000k -minrate:v 1000k -maxrate:v 1000k \
-bufsize:v 2000k -crf 23 -sc_threshold 0 \
-keyint_min 24 -r 24 -g 48 \
-vf "scale=640:-1, \
drawtext=fontfile=/Library/Fonts/Courier\ New\ Bold.ttf: \
timecode='00\:00\:00\:00': r=24: fontsize=60: fontcolor=white: \
x=(w-tw)/2: y=h-(2*lh): box=1: boxcolor=0x00000000@1" \
-acodec aac -ac 2 -ab 64k -ar 44.1k -y output.mp4

(2/20編集、timecodeのシングルクォートが抜けてました)

なんか必要ないオプションも含まれているかもしれないけれども、一応自分では以下のつもりで指定しています。間違ってたら教えて欲しい・・・

  • videoのビットレートは大体1000kになるように。
  • Frame Rateは24, GOPは2秒ごと
  • CRFは指定しなくていいけど(デフォルトも23)、いつか変更することも考慮して入れといた
  • width=640, heightはアスペクト比を保ったままwidthに応じてリサイズ

フォントはmacOSだと Font Book というアプリを開き、右クリックのメニュー(コンテクストメニュー)から「Finderに表示」を選択すると、そのフォントファイルの場所がわかります。

確認

ffplayで確認。大体うまくいっている。

ちなみにタイムコードはhh:mm:ss:(フレーム番号)です。
一番最後はms(milli-sec)ではないのでご注意を。

確認(ffprobe)

以下のコマンドでビデオのフレームが期待通りかどうかをざっと確認する。

ffprobe -i output.mp4 -select_streams v:0 -show_frames -print_format json

I-frameが48フレームごと、且つ2秒ごとなので、うまくいっている気がする。

以上。