Youtube iFrame APIを使用して動画の品質設定を行う際に問題が発生します。これは私のコードです:
var player;
player = new YT.Player('player', {
height: '490',
width: '725',
videoId: yturl,
/* setPlaybackQuality: 'hd720', <-- DOES NOT WORK */
/* suggestedQuality: 'hd720', <-- DOES NOT WORK */
events: {
'onReady': onPlayerReady
}
});
function onPlayerReady(event) {
player.setPlaybackQuality('hd720'); // <-- DOES NOT WORK
event.target.setPlaybackQuality('hd720'); // <-- DOES NOT WORK
player.setVolume(100); // <-- DOES WORK
console.log(player.getPlaybackQuality()); // <-- Prints 'small' to console
event.target.playVideo();
}
面白いことに、player.setPlaybackQuality
またはevent.target.setPlaybackQuality
を呼び出してもエラーは発生しません。プレイヤーが無視しているように見えます。たとえば、player.setSuggestedQuality
(存在しない関数)を呼び出すと、期待どおりにエラーがスローされます。
私はすべての有効な文字列パラメーターを APIリファレンスで概説 ( 'medium'、 'large'、 'hd720'など)として試しました。それらのどれも動作しません。
誰もがこのプロパティを設定する方法について何か提案がありますか?
まったく同じ問題と回避策があります。 YouTubeでは、ディスプレイの実際のサイズに基づいた品質レベルしか許可されていないので、実際に再生する前に、720ピクセルのビデオがない限り、デフォルトで720ピクセルにすることはできないと思います。次に、ユーザーコントロールがキックインし、YouTubeがディックでなくなる。
編集
突破口を打つだけです。イベント5(再生)の代わりにイベント3(バッファリング)を使用する場合、ユーザーにとって途切れることはありません。読み込みが始まるとすぐに品質が変更されます。奇妙なことに、それをonPlayerReadyにも設定する必要があるか、または機能しません。
function onPlayerReady(event) {
event.target.setPlaybackQuality('hd720');
}
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.BUFFERING) {
event.target.setPlaybackQuality('hd720');
}
}
可能なハック/解決策を見つけました。
ビデオの再生が始まるまで待つ場合は、setPlaybackQuality
を適用します-機能します。したがって:
player = new YT.Player('player', {
height: '490',
width: '725',
videoId: yturl,
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
function onPlayerReady(event) {
player.setVolume(100);
event.target.playVideo();
}
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PLAYING) {
event.target.setPlaybackQuality('hd720'); // <-- WORKS!
}
}
ただし、ビデオはまず低品質でバッファリングを開始するため、ソリューションは理想的ではありません。再生が開始されたら、720に切り替えます。コメントや代替ソリューションがあれば高く評価されます。
問題は、YouTubeが最適な再生品質を選択するため、setPlaybackQuality()
関数のonPlayerReady()
をオーバーライドすることです。
プレーヤーの幅と高さに関係なく、YouTubeプレーヤーを任意の品質で強制的に再生するソリューションを見つけました。
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
height: '180',
width: '320',
videoId: 'M7lc1UVf-VE',
events: {
'onReady': onPlayerReady,
'onPlaybackQualityChange': onPlayerPlaybackQualityChange,
'onStateChange': onPlayerStateChange
}
});
}
function onPlayerReady(event) {
event.target.playVideo();
}
function onPlayerPlaybackQualityChange(event) {
var playbackQuality = event.target.getPlaybackQuality();
var suggestedQuality = 'hd720';
console.log("Quality changed to: " + playbackQuality );
if( playbackQuality !== 'hd720') {
console.log("Setting quality to " + suggestedQuality );
event.target.setPlaybackQuality( suggestedQuality );
}
}
コードにより、品質の変更が推奨されます。
覚えておいてください:ユーザーはそのコードのプレーヤーボタンでビデオ品質を変更できませんでした。
とにかく、提案された品質を一度だけ強制することができます。
GChrome、Firefox、Safariでテスト済み
私にとって完璧に機能する解決策を見つけました:
function onPlayerStateChange(event) {
//Some code...
$(".btn-change-quality").on("click", function(){
pauseVideo();
player.setPlaybackQuality('hd720');
playVideo();
});
}
私はこの関数とsetPlaybackQuality
の作品でonPlayerReady
を少し遊んだことがあります。唯一の問題は、割り当てがすぐに行われないことです。実際、getPlaybackQuality
はビデオの開始直後に正しい値を返します。実際には、ビデオが開始される前にgetPlaybackQuality
は常にsmall
を返します。しかし、ビデオが開始するときに、正しいplayBackQualityを使用しています。
また、さまざまなプレーヤーサイズの組み合わせを試してみましたが、うまくいきます。
注:私はIFrame APIを使用しています。
別の解決策は、ビデオを停止してseekTo()
を使用することです。ライブストリーミングの場合、seekTo()
をスキップできます。悪いのはバッファリングを示しますが、良いのはプレーヤーのサイズに関係なく完全に制御できることです。
var player = YT.get('videoid');
rate = 'small';
var currentTime = player.getCurrentTime();
player.stopVideo();
player.setPlaybackQuality(rate);
player.playVideo();
player.seekTo(currentTime, false);