インスタンス化とパラメータ設定
var engine = new P2PEngineVHS(player, {p2pConfig: [opts]}, videojs = window.videojs);
新しい P2PEngineVHS インスタンスを作成します。player は video.js のインスタンスです。
opts を指定した場合、対応するデフォルト値は上書きされます。
| フィールド | 型 | デフォルト値 | 説明 |
|---|---|---|---|
| logLevel | string|boolean | 'error' | logのレベル。warn、error、noneに分かれます。trueを設定するとwarn相当、falseを設定するとnone相当になります。 |
| token | string | undefined | tokenは管理パネルでの複数ドメインのデータ集計表示に使用します。また、channelIdをカスタマイズする場合もtokenの設定が必要です。 |
| trackerZone | string | 'eu' | trackerサーバーアドレスの国コード。'cn'、'eu'、'hk'、'us' に分かれます。 |
| memoryCacheLimit | Object | {"pc": 400 * 1024 * 1024, "mobile": 100 * 1024 * 1024} | p2pキャッシュの最大データ量。PCとmobileに分かれます。 |
| useDiskCache | boolean | true | VODモードでIndexedDBを使ってデータを保存します。 |
| diskCacheLimit | Object | {"pc": 1500 * 1024 * 1024, "mobile": 1000 * 1024 * 1024} | ディスクキャッシュの最大データ量。PCとmobileに分かれます。 |
| p2pEnabled | boolean | true | P2Pを有効にするかどうか。 |
| webRTCConfig | Object | undefined | stunとdatachannelを設定するための辞書オブジェクト。 |
| useHttpRange | boolean | true | 可能な場合にHttp Rangeリクエストを使用して、p2pダウンロードのタイムアウトによる残りのデータを補完します。 |
| sharePlaylist | boolean | false | m3u8ファイルのP2P伝送を許可するかどうか。 |
| strictSegmentId | boolean | false | デフォルトのシーケンス番号ベースの代わりに、urlベースのSegmentIdを使用します。 |
| prefetchOnly | boolean | false | HLSモードでプリフェッチ方式のみでP2Pダウンロードを行います。 |
| startFromSegmentOffset | number | 3 | trackerサービスへのリクエストを開始するsegmentオフセット。 |
P2PEngineVHS API
P2PEngineVHS.version (static)
P2PEngineVHSのバージョン番号を取得します。
P2PEngineVHS.protocolVersion (static)
P2Pプロトコルのバージョン番号を取得します。
P2PEngineVHS.isSupported() (static method)
現在のブラウザがWebRTC datachannelに対応しているかを判定します。
engine.enableP2P()
p2pが一時停止中または未開始の場合にp2pを開始します。
engine.disableP2P()
p2pを停止し、メモリを解放します。
engine.destroy()
p2pを停止し、engineを破棄してメモリを解放します。
P2PEngineVHS のイベント
engine.on('peerId', function (peerId) {})
サーバーからpeerIdを取得した際にこのイベントがコールバックされます。
engine.on('peers', function (peers) {})
新しいノードとのp2p接続が確立に成功した際にこのイベントがコールバックされます。
engine.on('stats', function (stats) {})
このコールバック関数からp2p情報を取得できます。内容は以下の通りです:
stats.totalHTTPDownloaded: HTTP(CDN)からダウンロードしたデータ量(単位KB)
stats.totalP2PDownloaded: P2Pからダウンロードしたデータ量(単位KB)
stats.totalP2PUploaded: P2Pでアップロードしたデータ量(単位KB)
stats.p2pDownloadSpeed: P2Pダウンロード速度(単位KB/s)
engine.on('serverConnected', function (connected) {})
websocketの接続・切断時にこのイベントがコールバックされます。
engine.on('exception', function (e) {})
このコールバック関数からSDKの例外情報を取得できます。内容は以下の通りです:
e.code: 例外の識別子(TRACKER_EXPT SIGNAL_EXPT)
e.message: 例外メッセージ
e.stack: 例外のスタック情報
p2pConfigを通じてp2p情報を取得する
p2pConfig: {
getStats: function (totalP2PDownloaded, totalP2PUploaded, totalHTTPDownloaded, p2pDownloadSpeed) {
// p2pダウンロード情報を取得
},
getPeerId: function (peerId) {
// 自ノードのIdを取得
},
getPeersInfo: function (peers) {
// 接続に成功したノードの情報を取得
},
onHttpDownloaded: function (traffic) {
// httpダウンロードトラフィックを監視
},
onP2pDownloaded: function (traffic, speed) {
// p2pダウンロードトラフィックと速度を監視
},
onP2pUploaded: function (traffic) {
// p2pアップロードトラフィックを監視
},
}WARNING
ダウンロード・アップロードデータ量の単位はKB、ダウンロード速度の単位はKB/sです。
高度な使い方
動的なm3u8/mpdパスの問題を解決する
一部のストリーミング配信事業者のm3u8/mpdは動的に生成されており、ノードごとにmpdのアドレスが異なります。例えばexample.com/clientId1/streamId.mpdとexample.com/clientId2/streamId.mpdのようになります。 本プラグインはデフォルトでm3u8/mpdをchannelIdとして使用します。このような場合、実際に同じライブ配信/動画を視聴しているノードを同じチャンネルに配置するために、共通のchannelIdを構築する必要があります。
// channelId をカスタマイズするには、先に p2pConfig で token を設定する必要があります!
p2pConfig: {
token: YOUR_TOKEN,
channelId: function (mpdUrl) {
const videoId = extractVideoIdFromUrl(mpdUrl); // 差異のある部分を無視し、一貫したchannelIdを構築します。extractVideoIdFromUrlは自身で定義する必要があり、url内の動画IDを抽出して結果として返すことができます
return videoId;
}
// channelId: VIDEO_ID // for fixed channel id
}動的なセグメントパスの問題を解決する
動的mpdパスの問題と同様に、同じセグメントファイルでもパスに差異がある場合があります。この場合、セグメントパスの差異部分を無視する必要があります。本プラグインはデフォルトでセグメントの絶対パス(url)を各セグメントファイルの識別子として使用するため、フック関数によって識別子を再構築する必要があります。以下のように設定できます:
p2pConfig: {
/*
segmentUrl: The url of segment
range: The byte range of segment
*/
segmentId: function (segmentUrl, range) {
const segId = extractSegmentIdFromUrl(segmentUrl, range);
return segId;
}
}p2pConfig: {
/*
streamId: The id of stream
sn: The serial number of segment
segmentUrl: The url of segment
range: The byte range of segment
*/
segmentId: function (streamId, sn, segmentUrl, range) {
const tsId = extractSegmentIdFromUrl(segmentUrl);
return tsId;
}
}