ffmpegを使ってストリーミング配信用動画ファイルを生成
ffmpegを利用してmp4ファイルをHLS(HTTP Live Streaming)形式に変換する方法。
ffmpegをインストールしていない方は「Windowsにffmpegをインストール」を読んでインストールしてください。
HLSについて
HTTP Live Streamingについて:https://developer.apple.com/streaming/
Apple が定めた動画をストリーミング再生するための技術です。
以下のような特徴をもっています。
- 視聴者のネットワーク状況に応じて最適なビットレートを選択できる
- VOD(オンデマンド配信)とライブ配信の両方に対応している
- 専用の設備が不要で、ApacheなどのWebサーバーでも配信可能
- HTTPSによる暗号化とユーザー認証に対応している
- ほぼすべてのサーバー上で実行でき、ほとんどのデバイスによってサポートされている
ストリーミング再生に必要なファイル
HLS(HTTP Live Streaming)で動画を配信するには、以下のファイルが必要です。
- インデックスファイル(.m3u8)
プレイリストととも呼ばれ、動画をスムースに再生させるために必要な情報が記述されているファイルです。tsファイルの順番や秒数、ファイル名などが定義されています。 - セグメントファイル(.ts)
細かく分割された動画コンテンツファイルです。インデックスファイルに定義された規則に従って再生されます。
次のような仕組みで動画を配信します。
- 動画を小さな部分(セグメント)に分割する
- インデックスファイル(.m3u8)に、再生するセグメントファイルのURLをリストする
- 配信サーバーで、インデックスファイルとセグメントファイルをHTTPの公開ディレクトリに置く
- 再生プレイヤーにインデックスファイルのURLを指定して再生を開始する
- 再生プレイヤーは、指定されたURLのインデックスファイルを取得し、最初に記載されたセグメントファイルをHTTP GETで取得して再生する
事前準備
作業フォルダを作成します。今回は「c:\movie」を作業フォルダとします。
テスト用のサンプル動画を「pixabay」からダウンロードして「movie」フォルダ内に配置します。
管理者権限でPowerShellを起動
「Windows」ボタンを右クリックして「Windows PowerShell(管理者)」を選択します。
ユーザーアカウント制御画面が表示されるので「はい」を選択します。
PowerShellが表示されます。
動画変換
ffmpegのドキュメント:https://ffmpeg.org/ffmpeg.html
コマンド
ffmpeg
オプション
-i:入力ファイル
ffmpeg -i 入力.mp4 出力.m3u8
早速「c:\movie/sample.mp4」を「c:\movie/sample.m3u8」に変換します。
以下のコマンドを実行します。
ffmpeg -i c:\movie/sample.mp4 c:\movie/sample.m3u8
プレイリスト(拡張子「.m3u8」ファイル)と分割された動画ファイル(拡張子「.ts」ファイル)が生成されました。
HTMLで再生
CDNから「hls.js」を取得します。
video要素に「sample.m3u8」ファイルをロードします。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ストリーミング動画配信</title>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
</head>
<body>
<video id="target" controls>
<script>
if (Hls.isSupported()) {
var video = document.getElementById('target');
var hls = new Hls();
hls.loadSource('sample.m3u8');
hls.attachMedia(video);
}
</script>
</body>
</html>
ブラウザで表示確認する場合はサーバを使用します(アドレス欄が「http://127.0.0.1:5500/index.html」)。(VSCodeでは拡張機能「LiveServer」を使用します)
サーバーを使用しないと(アドレス欄が「C:/movie/index.html」の場合は)ストリーミング再生されないので注意しましょう。
拡張子について
拡張子「.m3u8」の由来
拡張子「.m3u8」は、「M3U UTF-8」の略です。
M3Uの由来
M3Uは、「MP3 URL」の略語で、もともとは音楽ファイル(特にMP3形式)のプレイリストを作成するためのフォーマットとして登場しました。
M3Uファイルは、単なるテキストファイルで、音声や動画ファイルのパスやURLをリスト化して保存するものです。
M3U8への進化
「M3U8」は、M3UフォーマットのUTF-8エンコーディング版です。
従来のM3UはANSIエンコーディングが使われていましたが、UTF-8に対応することで、非英語圏の文字や特殊文字(例: 日本語やアクセント付き文字)を正確に扱えるようになりました。
M3U8は、特にHLS(HTTP Live Streaming)で標準的に使用されています。
補足
「M3U8」という名前は、単にM3Uに「UTF-8対応」を示す「8」が付加されたものです。
ファイル拡張子は「.m3u8」として使われますが、M3U8のフォーマット自体はUTF-8エンコーディングされたテキストなので、実際の内容は普通のテキストエディタで開くことができます。
拡張子「.ts」の由来
拡張子「.ts」は、「Transport Stream」の略です。
.tsファイルの概要
MPEG-TS(MPEG Transport Stream)形式で保存されるファイルに使われる拡張子です。
MPEG-TSは、デジタルビデオやオーディオデータを効率的に送信・保存するためのコンテナフォーマットの一つで、特にストリーミングやデジタル放送(例: 地上デジタルテレビ、衛星放送)で広く使用されています。
TSの由来:
「Transport Stream(輸送ストリーム)」は、データを連続的に送り届けるためのフォーマットであることを表しています。
特にリアルタイム配信やエラーレジリエンス(エラー耐性)が重要な場面で利用されます。
データの構造
TSファイルは、固定長のパケット(通常は188バイト)で構成され、各パケットにヘッダー情報が含まれます。
これにより、途中でエラーが発生しても、他のパケットに影響を与えることなく再生が可能です。