Skip to content

インスタンス化とパラメータ設定

var engine = new P2PEngineDash(player, {p2pConfig: [opts]});

新しい P2PEngineDash インスタンスを作成します。playerdashjs のMediaPlayerインスタンスです。

opts を指定した場合、対応するデフォルト値は上書きされます。

フィールドデフォルト値説明
logLevelstring|boolean'error'logのレベル。warn、error、noneに分かれます。trueを設定するとwarn相当、falseを設定するとnone相当になります。
tokenstringundefinedtokenは管理パネルでの複数ドメインのデータ集計表示に使用します。また、channelIdをカスタマイズする場合もtokenの設定が必要です。
trackerZonestring'eu'trackerサーバーアドレスの国コード。'cn'、'eu'、'hk'、'us' に分かれます。
memoryCacheLimitObject{"pc": 400 * 1024 * 1024, "mobile": 100 * 1024 * 1024}p2pキャッシュの最大データ量。PCとmobileに分かれます。
p2pEnabledbooleantrueP2Pを有効にするかどうか。
webRTCConfigObject{}stunとdatachannelを設定するための辞書オブジェクト
useHttpRangebooleantrue可能な場合にHttp Rangeリクエストを使用して、p2pダウンロードのタイムアウトによる残りのデータを補完します。
useDiskCachebooleantrueVODモードでIndexedDBを使ってデータを保存します。
diskCacheLimitObject{"pc": 1500 * 1024 * 1024, "mobile": 1000 * 1024 * 1024}ディスクキャッシュの最大データ量。PCとmobileに分かれます。
prefetchOnlybooleanfalseHLSモードでプリフェッチ方式のみでP2Pダウンロードを行います。
startFromSegmentOffsetnumber3trackerサービスへのリクエストを開始する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情報を取得する

javascript
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を構築する必要があります。

javascript
// 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)を各セグメントファイルの識別子として使用するため、フック関数によって識別子を再構築する必要があります。以下のように設定できます:

javascript
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を有効にするには、まずオリジンサーバー側の対応が必要で、その上で以下の設定を追加してください:

javascript
p2pConfig: {
    useHttpRange: true,
}

STUNとTURNサーバーアドレスを自分で設定する

STUNはp2p接続の過程でグローバルIPアドレスを取得するために使用され、TURNはp2p接続が疎通しない場合にデータを中継するために使用できます。本SDKには公開のSTUNサービスが内蔵されており、開発者はP2pConfigを通じてSTUNアドレスを変更できます。TURNサーバーは開発者自身が構築する必要があり、coturnを参考にできます。

javascript
p2pConfig: {
    webRTCConfig: {
       iceServers: [
           { urls: YOUR_STUN_OR_TURN_SERVER }
       ]
    }
}

セグメントの正当性検証

ノードからダウンロードしたセグメントの正当性を検証する必要がある場合があります(bittorrentのハッシュ検証に類似)。 CDNByeはフック関数を提供しており、ダウンロードしたセグメントをコールバックして開発者が検証できるようにします。検証に使用する ハッシュテーブルはサーバーから直接ダウンロードすることを推奨します。開発者はプログラムで各tsファイルのハッシュを計算し、 特定のファイルに保存するか、m3u8ファイルに直接埋め込むことができます。検証に失敗した場合は、コールバック関数内で 直接falseを返すだけで構いません。

javascript
p2pConfig: {
   validateSegment: function (segId, buffer) {
       var hash = hashFile.getHash(segId);
       return hash === md5(buffer);
   }
}

粤ICP备18075581号