インスタンス化とパラメータ設定
var engine = new P2PEngineDash(player, {p2pConfig: [opts]});
新しい P2PEngineDash インスタンスを作成します。player は dashjs のMediaPlayerインスタンスです。
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に分かれます。 |
| p2pEnabled | boolean | true | P2Pを有効にするかどうか。 |
| webRTCConfig | Object | {} | stunとdatachannelを設定するための辞書オブジェクト。 |
| useHttpRange | boolean | true | 可能な場合にHttp Rangeリクエストを使用して、p2pダウンロードのタイムアウトによる残りのデータを補完します。 |
| useDiskCache | boolean | true | VODモードでIndexedDBを使ってデータを保存します。 |
| diskCacheLimit | Object | {"pc": 1500 * 1024 * 1024, "mobile": 1000 * 1024 * 1024} | ディスクキャッシュの最大データ量。PCとmobileに分かれます。 |
| prefetchOnly | boolean | false | HLSモードでプリフェッチ方式のみでP2Pダウンロードを行います。 |
| startFromSegmentOffset | number | 3 | trackerサービスへのリクエストを開始するsegmentオフセット。 |
P2PEngineDash API
P2PEngineDash.version (static)
P2PEngineDashのバージョン番号を取得します。
P2PEngineDash.protocolVersion (static)
P2Pプロトコルのバージョン番号を取得します。
P2PEngineDash.isSupported() (static method)
現在のブラウザがWebRTC datachannelに対応しているかを判定します。
engine.enableP2P()
p2pが一時停止中または未開始の場合にp2pを開始します。
engine.disableP2P()
p2pを停止し、メモリを解放します。
engine.destroy()
p2pを停止し、engineを破棄してメモリを解放します。
P2PEngineDashのイベント
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 DASHJS_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です。
高度な使い方
動的なMPDパスの問題を解決する
一部のストリーミング配信事業者のMPDは動的に生成されており、ノードごとにmpdのアドレスが異なります。例えばexample.com/clientId1/streamId.mpdとexample.com/clientId2/streamId.mpdのようになります。 本プラグインはデフォルトで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: {
/*
streamId: The id of stream
sn: The serial number of segment
segmentUrl: The url of segment
range: bytes range of segmentUrl
*/
segmentId: function (segmentUrl, range) {
const segId = extractSegmentIdFromUrl(segmentUrl);
return segId;
}
}Http Rangeリクエストを許可する
ピア側のアップロード帯域幅が不足している場合、p2p伝送がタイムアウトしてhttpダウンロードに切り替わることがあり、元々p2pでダウンロードしたデータを再利用できなくなります。Http Rangeリクエストは、p2pダウンロードのタイムアウトによって残った部分のデータを補完するために使用されます。Http Rangeを有効にするには、まずオリジンサーバー側の対応が必要で、その上で以下の設定を追加してください:
p2pConfig: {
useHttpRange: true,
}STUNとTURNサーバーアドレスを自分で設定する
STUNはp2p接続の過程でグローバルIPアドレスを取得するために使用され、TURNはp2p接続が疎通しない場合にデータを中継するために使用できます。本SDKには公開のSTUNサービスが内蔵されており、開発者はP2pConfigを通じてSTUNアドレスを変更できます。TURNサーバーは開発者自身が構築する必要があり、coturnを参考にできます。
p2pConfig: {
webRTCConfig: {
iceServers: [
{ urls: YOUR_STUN_OR_TURN_SERVER }
]
}
}セグメントの正当性検証
ノードからダウンロードしたセグメントの正当性を検証する必要がある場合があります(bittorrentのハッシュ検証に類似)。 CDNByeはフック関数を提供しており、ダウンロードしたセグメントをコールバックして開発者が検証できるようにします。検証に使用する ハッシュテーブルはサーバーから直接ダウンロードすることを推奨します。開発者はプログラムで各tsファイルのハッシュを計算し、 特定のファイルに保存するか、m3u8ファイルに直接埋め込むことができます。検証に失敗した場合は、コールバック関数内で 直接falseを返すだけで構いません。
p2pConfig: {
validateSegment: function (segId, buffer) {
var hash = hashFile.getHash(segId);
return hash === md5(buffer);
}
}