LoginSignup
11
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-01

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

11
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
7