P2PEngineMedia のインスタンス化
var engine = new P2PEngineMedia(p2pConfig);
P2PEngineMedia インスタンスを作成します。
p2pConfig を指定した場合、対応するデフォルト値は上書きされます。
| フィールド | 型 | デフォルト値 | 説明 |
|---|---|---|---|
| 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' に分かれます。 |
| diskCacheLimit | Object | {"pc": 400 * 1024 * 1024, "mobile": 100 * 1024 * 1024} | p2pキャッシュの最大データ量。PCとmobileに分かれます。 |
| pieceLength | number | 512 * 1024 | 各セグメントのサイズ(単位:Byte)。同じpieceLengthのノード同士でのみ接続できるため、ビットレートに応じて調整することを推奨します。 |
| mediaElem | HTMLMediaElement|string | undefined | videoまたはaudioタグのidまたはElementオブジェクトを指定します。デフォルトはdocument内の最初のvideo/audio要素です。 |
| p2pEnabled | boolean | true | P2Pを有効にするかどうか。 |
| webRTCConfig | Object | {} | stunとdatachannelを設定するための辞書オブジェクト。 |
| tag | string | '' | ユーザー定義のカスタムラベル。 |
| swFile | string | './sw.js' | ServiceWorkerファイル名とパス。 |
| swScope | string | './' | ServiceWorkerのデフォルトのスコープは現在のディレクトリとすべてのサブディレクトリです。そのため、sw.jsをサイトのルートディレクトリに置いた場合、サイトへのすべてのリクエストがServiceWorkerの制御範囲に入ります。 |
| diskCacheLimit | Object | {"pc": 1500 * 1024 * 1024, "mobile": 1000 * 1024 * 1024} | ディスクキャッシュの最大データ量。PCとmobileに分かれます。 |
| minBufferCount | number | 0 | video要素の残りバッファpiece数がこの値を下回った場合、強制的にHTTPダウンロードに切り替わります。 |
| startFromSegmentOffset | number | 3 | trackerサービスへのリクエストを開始するsegmentオフセット。 |
P2PEngineMedia API
P2PEngineMedia.version (static)
P2PEngineMediaのバージョン番号を取得します。
P2PEngineMedia.protocolVersion (static)
P2Pプロトコルのバージョン番号を取得します。
P2PEngineMedia.isSupported() (static)
現在のブラウザが WebRTC datachannel と ServiceWorker に対応しているかを判定します。
P2PEngineMedia.isWebRTCSupported() (static)
現在のブラウザが WebRTC datachannel に対応しているかを判定します。
P2PEngineMedia.isSeviceWorkerSupported() (static)
現在のブラウザが ServiceWorker に対応しているかを判定します。
engine.getProxiedUrl(originalURL)
ローカルプロキシのアドレスを取得します。引数は元のアドレス文字列で、戻り値はローカルプロキシアドレスのPromiseです。
engine.enableP2P()
p2p を開始します。
engine.disableP2P()
p2p を停止し、リソースを解放します。
engine.restartP2p()
p2p を再起動します。
P2PEngineMedia のイベント
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です。
MediaProxy.version (static)
MediaProxyのバージョン番号を取得します。
高度な使い方
動的なMP4/MP3パスの問題を解決する
一部のストリーミング配信事業者のmp4/mp3アドレスは動的に生成されており、ノードごとにmp4/mp3のアドレスが異なります。例えばexample.com/clientId1/streamId.mp4とexample.com/clientId2/streamId.mp4のようになります。本プラグインはデフォルトでmp4/mp3のアドレス(クエリパラメータを除いたもの)をchannelIdとして使用します。このような場合、実際に同じライブ配信/動画を視聴しているノードを同じチャンネルに配置するために、共通のchannelIdを構築する必要があります。
// channelId をカスタマイズするには、先に p2pConfig で token を設定する必要があります!他のプラットフォームと相互接続するには、同じ token を構築する必要があります。
p2pConfig: {
token: YOUR_TOKEN,
channelId: function (url) {
const videoId = extractVideoIdFromUrl(url); // 差異のある部分を無視し、一貫したchannelIdを構築します。extractVideoIdFromUrlは自身で定義する必要があり、url内の動画IDを抽出して結果として返すことができます
return videoId;
}
// channelId: VIDEO_ID // for fixed channel id
}WARNING
他のプラットフォームと相互接続する場合は、両者が同じ token と channelId を持つことを必ず確認してください。
