【GStreamer】テスト動画をhlsで配信してブラウザで視聴する
はじめに
GStreamerのテスト動画をHTTP Live Streaming (HLS)形式にして配信し、Google Chromeからアクセスして視聴したいと思います。HLSの動画を視聴するためにhttp-server
でWebサーバーを立ててNode.jsを利用したWebページを作成したいと思います。
環境
今回利用する環境のバージョンについてです。
- Node.js v14.5.0
- npm v6.14.6
- GStreamer v1.16.2
- gst-launch-1.0 v 1.16.2
HLS形式の動画を視聴するための流れ
HTTP Live Streaming (HLS)形式の動画を視聴するためのWebページを作成する
↓
GStreamerのテスト動画をHTTP Live Streaming (HLS)にする
↓
Webサーバで動画ファイルとWebページを配信
↓
ブラウザでアクセス
環境構築
まずは、環境を作成するためのプロジェクトフォルダを作成します。そして、cdコマンドでその中に移動します。
mkdir hls-sample cd hls-sample
Node.jsを利用できるようにプロジェクトフォルダを初期化します。これによりpackage.jsonが出来上がります。
npm init -y
HTTP Live Streaming (HLS)形式の映像をWebページで視聴するために、hls.jsを利用します。
npm i hls.js
hls.jsを利用するためにモジュールを読み込むことができて、JavaScriptファイルをバンドルすることができるParcelを利用します。
npm i -D parcel-bundler
GStreamerで動画をHLS形式に変換したときに生成されるファイルをWebサーバで配信する必要があるのでhttp-serverを利用します。
npm i -D http-server
サンプルコード作成
srcフォルダを作成して、その中にindex.htmlとindex.jsを作成します。
mkdir src touch src/index.html touch src/index.js
現在のディレクトリについてです。
├── package-lock.json ├── package.json └── src ├── index.html └── index.js
src/index.html
hlsを視聴するためのWebページになります。<video id="video"></video>
が動画を表示するタグになります。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <video id="video"></video> <script src="./index.js"></script> </body> </html>
src/index.js
hlsを視聴するため処理部分です。hls.loadSource("http://localhost:8080/playlist.m3u8");
この部分で今回hlsを視聴するためのurlを指定します。
import Hls from "hls.js"; if (Hls.isSupported()) { const video = document.getElementById("video"); const hls = new Hls(); hls.attachMedia(video); hls.on(Hls.Events.MEDIA_ATTACHED, function () { console.log("video and hls.js are now bound together !"); hls.loadSource("http://localhost:8080/playlist.m3u8"); hls.on(Hls.Events.MANIFEST_PARSED, function (event, data) { console.log( "manifest loaded, found " + data.levels.length + " quality level" ); }); }); }
ビルド
以下のコマンドで、Parcelを利用して先ほど作成したソースコードをビルドします。
npx parcel build src/index.html --public-url ./
これにより、distフォルダが作成され、その中にhlsを視聴するためのWebページが作成されます。
├── dist ← new │ ├── index.html ← new │ ├── src.86cc6b09.js ← new │ └── src.86cc6b09.js.map ← new ├── package-lock.json ├── package.json └── src ├── index.html └── index.js
また、--public-url ./
オプションを設定することで、http-server
でビルドしたソースコードのJavaScriptファイルを読み込むことができるようになります。
テスト動画をHLS形式にする
動画はvideotestsrc
を利用します。それをhlsに変換します。それらを実行するために以下のコマンドを実行します。
gst-launch-1.0 videotestsrc is-live=true ! x264enc ! mpegtsmux ! hlssink max-files=5
コマンドを実行するとplaylist.m3u8
というファイルがプロジェクトフォルダの直下に作成されます。また、segment00000.ts
というようなファイルも作成されます。これは、GStreamerの先ほどのコマンドの指定max-files=5
で最大5つのファイルが連番で作成されます。
├── dist │ ├── index.html │ ├── src.86cc6b09.js │ └── src.86cc6b09.js.map ├── package-lock.json ├── package.json ├── playlist.m3u8 ← new ├── segment00000.ts ← new ├── segment00001.ts ← new ├── segment00002.ts ← new ├── segment00003.ts ← new ├── segment00004.ts ← new └── src ├── index.html └── index.js
Webサーバで配信
ここまでで一通りの準備ができたので、あとはWebページとhlsのストリームをWebサーバにて配信するだけです。
http-server
を利用してWebサーバを立てます。
npx http-server --cors -o dist
-o dist
を指定することでdistフォルダをルートにブラウザで開いてくれます。正しく動作すると以下のようにブラウザで見ることができます。
サンプルコード
作成したコードはgithubに保存しています。
https://github.com/tomatoaiu/hls-sample
おわりに
無事にテスト動画をHLS形式に変換して、ブラウザで視聴することができました。これをするために、GStreamer, Parcel, hls.js, http-serverを利用しました。それらを使うことで手軽にHLSをテストする環境ができました。
参考文献
- Parcel, 入手先 https://ja.parceljs.org/
- hls.js - npm, 入手先 https://www.npmjs.com/package/hls.js/v/canary
- http-server - npm, 入手先 https://www.npmjs.com/package/http-server
- HTTP Live Streaming (HLS) - Apple Developer, 入手先 https://developer.apple.com/streaming/
- GStreamer: open source multimedia framework, 入手先 https://gstreamer.freedesktop.org/