こんにちは!この記事では、動画配信でよく使われる「m3u8」と「HLSストリーミング」について、わかりやすく解説していきます。
この記事で分かること
- 動画配信の仕組み(HLSストリーミング)の基本
- m3u8ファイルの役割と中身
- FFmpegを使った動画のストリーミング配信方法
m3u8って何?なぜ必要なの?
YouTubeやNetflixなどの動画配信サービスを使っているとき、動画が途切れることなくスムーズに再生されることに気づいたことはありますか?
実は、動画をスムーズに配信するために、動画ファイルは小さな断片(セグメント)に分割されています。そして、それらの断片をどの順番で再生すればいいのか、どの品質の動画を再生すべきかという情報を記録しているのが「m3u8ファイル」です。
m3u8は「UTF-8でエンコードされたプレイリスト」という意味で、Appleが開発したHLS(HTTP Live Streaming)という技術で使用されています。
m3u8ファイルの中身を見てみよう
実際のm3u8ファイルの中身を見てみましょう。テキストエディタで開くことができます:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
segment000.ts
#EXTINF:10.0,
segment001.ts
#EXTINF:10.0,
segment002.ts
各行の意味を解説します:
-
#EXTM3U
: このファイルがm3u8形式であることを示します -
#EXT-X-VERSION
: HLSのバージョンを指定します -
#EXT-X-TARGETDURATION
: 各動画断片の長さ(秒)を指定します -
#EXTINF
: 次の動画断片の再生時間を示します -
segment000.ts
: 実際の動画ファイルの名前です(.tsという形式で保存されています)
品質の自動切り替えの仕組み
スマートフォンで動画を見ているとき、電波の状態が悪くなると自動的に画質が下がった経験はありませんか?これも実はm3u8の機能の一つです。
動画配信では、同じ内容の動画を複数の品質で用意しています。そして、それらをまとめた「マスタープレイリスト」というm3u8ファイルを作成します:
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
high/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720
medium/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=854x480
low/playlist.m3u8
このファイルには、高画質・中画質・低画質それぞれの動画への参照が含まれています。プレーヤーは通信速度を見ながら、最適な品質の動画を自動的に選択します。
FFmpegで動画をHLS形式に変換しよう
それでは、実際にFFmpegを使って動画をHLS形式に変換してみましょう。
基本的な変換コマンド
ffmpeg -i input.mp4 -c:v h264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 output.m3u8
このコマンドの意味を解説します:
-
-i input.mp4
: 入力ファイルを指定 -
-c:v h264
: 動画コーデックをH.264に指定 -
-c:a aac
: 音声コーデックをAACに指定 -
-f hls
: 出力フォーマットをHLSに指定 -
-hls_time 10
: 各セグメントの長さを10秒に設定 -
-hls_list_size 0
: すべてのセグメントをプレイリストに含める
複数の画質を用意する
より実践的な例として、複数の画質を同時に生成するコマンドを紹介します:
ffmpeg -i input.mp4 \
-filter_complex \
"[0:v]split=3[v1][v2][v3]; \
[v1]copy[v1out]; \
[v2]scale=w=1280:h=720[v2out]; \
[v3]scale=w=854:h=480[v3out]" \
-map "[v1out]" -c:v:0 h264 -b:v:0 5000k \
-map "[v2out]" -c:v:1 h264 -b:v:1 3000k \
-map "[v3out]" -c:v:2 h264 -b:v:2 1000k \
-map a:0 -c:a aac -b:a 192k -ac 2 \
-f hls \
-var_stream_map "v:0,a:0 v:1,a:0 v:2,a:0" \
-master_pl_name master.m3u8 \
-hls_time 10 \
-hls_list_size 0 \
quality_%v/stream.m3u8
このコマンドは、入力動画から3つの異なる画質(1080p、720p、480p)のストリームを生成します。
配信の設定
変換した動画を配信するには、Webサーバー(Apache、Nginxなど)で以下の設定が必要です:
-
MIMEタイプの設定:
- .m3u8ファイル:
application/vnd.apple.mpegurl
- .tsファイル:
video/mp2t
- .m3u8ファイル:
-
CORSの設定(必要な場合):
location ~ \.(m3u8|ts)$ { add_header 'Access-Control-Allow-Origin' '*'; }
まとめ
この記事では、動画配信の基本的な仕組みについて解説しました:
- m3u8ファイルは動画の再生リストを管理するテキストファイル
- 動画は小さな断片(セグメント)に分割して配信される
- 通信状況に応じて自動的に画質を切り替えることができる
- FFmpegを使えば、簡単にHLS形式の動画を作成できる
より詳しい技術情報については、元記事をご参照ください。