ffmpeg でAV1で(無理矢理)いろいろやってみました。
ffmpeg 4.1
AV1のcodecそのものはffmpeg 4.0でサポートされましたが、mp4コンテナに書き出すことはできませんでした。
ffmpeg 4.1 でそれが可能になりました。
AV1のテスト映像を作る
現状AV1のエンコード速度はとてもとても遅くてライブ配信には間に合いません。
なので、あらかじめAV1でエンコードしたテスト映像を作っておくことにします。
ffmpeg -f lavfi -i testsrc=s=320x240:r=30 -pix_fmt yuv420p -g 30 -strict -2 -vcodec av1 -r 30 -f mp4 sample_av1.mp4
適当なところで q
を入力してffmepgを止めます。
320x240の動画のエンコードの速度は1fpsくらいでした。遅い。。。!
必ず -g
オプションでGOP(キーフレームの間隔)を指定してください。
このオプションが無いとキーフレームは最初の1回しか作られませんでした。
キーフレームが定期的に来ないと、ライブストリーミングで途中から見始めたときにデコード開始のきっかけがなくて再生できないです。
(これでけっこうハマりました。)
HTTPサーバとブラウザの準備
なにかしらHTTPサーバを動かして、カレントディレクトリのファイルをHTTPで取り出せるようにします。
今回は簡単にpython3のライブラリを使いました。
python3 -m http.server
AV1を有効にしたFirefoxで以下のURLを開くとHLSでストリーミングされている動画を再生することができます。
http://localhost:8000/out.m3u8
FirefoxでAV1のCODECを有効にする方法は以下を見て下さい。
YouTubeのAV1のテスト配信を試す
また、HLSを直接再生するためにFirefoxには以下のプラグインをインストールしています。
Native MPEG-Dash + HLS Playback
Add-on
HLSでストリーミング
ffmpeg -re -r 30 -i sample_av1.mp4 -c copy -hls_segment_type fmp4 -hls_time 3 -hls_list_size 0 out.m3u8
HLSのメディアファイルとしてmpegtsでなくてfragmented MP4 を指定することがポイントです。
なお、-re -r 30
のオプションをつけると入力ファイルからの読み込み速度が30fpsになるように調整してくれるので、ライブストリーミングをシミュレーションすることができます。
生成されたファイルは以下の通り。
$ ls -lt
total 960
-rw-r--r-- 1 koba koba 28000 11月 28 18:11 out10.m4s
-rw-r--r-- 1 koba koba 412 11月 28 18:11 out.m3u8
-rw-r--r-- 1 koba koba 54434 11月 28 18:11 out9.m4s
-rw-r--r-- 1 koba koba 54394 11月 28 18:11 out8.m4s
-rw-r--r-- 1 koba koba 54482 11月 28 18:11 out7.m4s
-rw-r--r-- 1 koba koba 54574 11月 28 18:11 out6.m4s
-rw-r--r-- 1 koba koba 50820 11月 28 18:11 out5.m4s
-rw-r--r-- 1 koba koba 47426 11月 28 18:11 out4.m4s
-rw-r--r-- 1 koba koba 43185 11月 28 18:11 out3.m4s
-rw-r--r-- 1 koba koba 36299 11月 28 18:11 out2.m4s
-rw-r--r-- 1 koba koba 30249 11月 28 18:11 out1.m4s
-rw-r--r-- 1 koba koba 792 11月 28 18:11 init.mp4
-rw-r--r-- 1 koba koba 22206 11月 28 18:11 out0.m4s
-rw-r--r-- 1 koba koba 471205 11月 28 18:10 sample_av1.mp4
m3u8のファイルは以下の通り。
$ cat out.m3u8
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-MAP:URI="init.mp4"
#EXTINF:3.000000,
out0.m4s
#EXTINF:3.000000,
out1.m4s
#EXTINF:3.000000,
out2.m4s
#EXTINF:3.000000,
out3.m4s
#EXTINF:3.000000,
out4.m4s
#EXTINF:3.000000,
out5.m4s
#EXTINF:3.000000,
out6.m4s
#EXTINF:3.000000,
out7.m4s
#EXTINF:3.000000,
out8.m4s
#EXTINF:3.000000,
out9.m4s
#EXTINF:1.500000,
out10.m4s
#EXT-X-ENDLIST
# まとめ
かなり無理矢理ですが、AV1のCODECでHLSストリーミングして、それをブラウザで再生することができました。
AV1でライブストリーミングするための残りのピースは高速なエンコーダですね。
参考
Streaming conf #5でAV1の話をしました。
「新しいビデオコーデックの AV1 って今どうなってる?」
https://www.slideshare.net/tetsu.koba/new-video-codec-av1