Help us understand the problem. What is going on with this article?

新しいビデオコーデックのAV1を使って無理やり HLSでストリーミングしてみた

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away