映像の帯域指定
- 以下の Youtube の PC プレイヤーにあるように、Adaptive な映像の視聴時に動画プレイヤー側で再生時のレンディションを指定したいケースはままある
GoogleCastでの実現方法
- GoogleCast の Receiver アプリでも MPL ライブラリの機能を利用するとレンディションの選択を簡単に実現が出来る
- MPLのガイド の 「Set video/audio bitrates」 に以下のような記載があるがこれだけだと少し分かり辛い
host.getQualityLevel = function(streamIndex, qualityLevel) {
if (streamIndex == videoStreamIndex && videoQualityIndex != -1) {
return videoQualityIndex;
} else if (streamIndex == audioStreamIndex && audioQualityIndex != -1) {
return audioQualityIndex;
} else {
return qualityLevel;
}
};
- streamIndex は各 Stream に割り振られた Index
- 例) 映像→0, 音声→1, キャプション→2
- qualityLevel は各 Stream 毎のレンディション
- 例) 720p→0, 480p→1, 360p→2, …
- MPL は定期的にこの関数を呼び出し、現在の通信状況から候補として qualityLevel を提示してくる
- 例えば以下のように実装すると、何もハンドリングしないのと同じ結果になる
host.getQualityLevel = function(streamIndex, qualityLevel) {
return qualityLevel;
}
- ここで 任意の qualityLevel の Index を返却することで再生するレンディションを指定出来る
- ガイドにある例だと、映像、音声、それぞれで予めどのレンディションを返すかを videoQualityIndex, audioQualityIndex で決めておいて固定で返す実装になっている
streamIndex と各レンディションの確認
- 再生しようとしている映像について、事前に何番目の streamIndex が映像/音声なのか、何番目の qualityLevel がどのレンディションか、を知る必要がある
- ガイドには記載されていないが、以下の onManifestReady のタイミングで取得出来る
var host = new cast.player.api.Host({
mediaElement: element, url: url
});
var protocol = cast.player.api.CreateDashStreamingProtocol(mediaHost); // DASHの場合
host.onManifestReady = function() {
for (var i = 0, count = protocol.getStreamCount(); i < count; i++) {
var streamIndex = i;
var streamInfo = protocol.getStreamInfo(i);
// ...
}
};
// ...
- streamInfo は StreamInfo 型になっていて、Manifest をパースした結果の様々な情報が取れる
- この情報を保持しておいて、先の getQualityLevel の判定で用いる