0

今日発見した重大な変更を示すために、以下のリンクで見つけることができる基本的な JS API サンプル ページを取り上げ、videoId パラメータをコメントアウトしました。

初期化エラーを示す YT サンプル コード: http://www.multitask123.com/fmgem/YT_Sample2.htm

上記の videoId パラメータの削除により、プレーヤは、埋め込みプレーヤに次のエラー メッセージを表示/初期化します。「エラーが発生しました。後で試してください。」これは、今日の午後まで当てはまりませんでした。

過去 3 か月間、次のように onYouTubePlayerAPIReady を呼び出すことができましたが、エラー メッセージは表示されませんでした。

function onYouTubePlayerAPIReady() {
        player = new YT.Player('player', {
            height: '390',
            width: '640',
            //videoId: 'JW5meKfy3fY', - COMMENTED OUT INTENTIONALLY! HARD REQUIREMENT!
            events: {
                'onReady': onPlayerReady,
                'onError': onPlayerError,
                'onStateChange': onPlayerStateChange
            }
        });
    }

エラーは初期化中に onPlayerError イベント ハンドラーによってキャッチされ、エラーは「evt」パラメーターのデータ属性で発生します。そのため、初期化時に onPlayerError(evt) が呼び出され、evt.data = 2 になります。この値は、「リクエストに無効なパラメータ値が含まれています」と文書化されています。これは、API が videoId を期待していることは明らかです。

あまり詳細には触れたくありませんが、ブラウザ間の初期化に関する問題が多数あるため、プレーヤーの初期化が適切に機能するように数え切れないほどの時間を費やしました。何かを再生するために実際に必要になるまで、プレーヤーを非表示にする必要があります。

どのブラウザが原因かは忘れましたが、ビデオが再生されていないにもかかわらず、そのうちの 1 つが実際にプレーヤーを表示するように強制します。

埋め込みプレーヤーは非同期で読み込まれるため、遅延読み込み/JIT できないことがわかりました。ユーザーが実際にビデオを表示したい場合や、プレーヤーなどのプレイリストを読み込む URL の他のパラメーターが含まれている場合にのみ読み込みを試みると、プレーヤーを初期化することも、ビデオを再生するように要求することもできないため、ボークします。

つまり、要点は、ページの読み込み時にプレーヤーを初期化する必要がありますが、videoId パラメーターを使用しないでください。これは、状況の 90% で何が再生されるのかまったくわからないためです。別の API への別の非同期呼び出しの結果。これは、videoid で初期化するソリューションが受け入れられないためです。

YouTube API は素晴らしく、とても気に入っているので、http://www.fmgem.comの開発に 18 か月を費やしましたが、この重大な変更により、ベータ ユーザーが私のアプリに対して持つ第一印象が台無しになっています。したがって、YT API チームが実際にこれを監視している場合は、元に戻してください。上に砂糖をかけてください。:))

ロード時に同じ関数の wmode 属性を使用して、数週間前に同様のことが起こりました。

//wmode: 'opaque' //--- Chrome で厄介なバグを引き起こします - そして、不透明を透明に変更できたので、大したことはありませんが、これにはアーキテクチャ全体を見直して、apx 9 の異なる非同期使用を体系的に処理する必要があります-繰り返しますが、すべてクロスブラウザーの癖がありました。

そのため、反応する余裕はなく、http: //www.fmgem.com のライブ コードに「くしゃみをする赤ちゃんパンダ」の videoId を挿入することを余儀なくされましたが、これは非常に専門的ではないように見えます。 YT チームがこれを重大な変更として実際に認識し、以前の動作に戻さない限り、アーキテクチャ全体を確認できます。

これは 2013 年 2 月 27 日の午後に一部のユーザーによって検出され、YouTube の開発者が SO を監視している Google グループを読みました。

回答、解決策、ガイダンス、または確認をいただければ幸いです。

ありがとう!!

4

3 に答える 3

1

空白の 0 秒のムービーを最初に読み込むことができます。または、コードを少し再配置することもできます。

onYouTubePlayerAPIReady関数を自分で呼び出さないでください。代わりにフラグ変数を使用します。

var playerAPIReady;
var player;

API ファイルがonYouTubePlayerAPIReady関数を呼び出すときに最初の変数を設定します。

function onYouTubePlayerAPIReady() {
    playerAPIReady = true;
}

ユーザーが最初のビデオの再生を選択したときに、2 番目の変数を設定します。

function createPlayerAndPlayVideo(id) {
    if(! playerAPIReady) {
        // player API file not loaded
        return;
    }
    if (! player) {
        player = new YT.Player('player', {
            height: '390',
            width: '640',
            videoId: id
            events: {
                'onReady': onPlayerReady,
                'onError': onPlayerError,
                'onStateChange': onPlayerStateChange
            }
        });
    } else {
        player.loadVideoById(id);
    }
}

ブロックに示されているように、後続のビデオに同じプレーヤーを再利用しelseます。

于 2013-03-04T21:09:03.380 に答える
0

これは疑いの余地のない重大な変更ですが、私はぐっすり眠れたので、遅延読み込み/プレーヤーの JIT に対する私自身の問題の解決策を見つけました。

概念実証があり、現在実装しているソリューションは、ビデオ ID があるかどうかをテストするグローバル変数を設定するのと同じくらい簡単です。

var cleared = false;
    function onYouTubePlayerAPIReady(videoid) {
        if (!cleared) return;
        .....

実際に動画を再生したい場合は、変数が false かどうかを確認し、そうであれば onYouTubePlayerAPIReady 関数を呼び出して videoid を渡して初期化します。私の間違いは、同じ呼び出しで play() 関数を初期化してから呼び出そうとしたことです。私にとっての解決策は、id を指定してイニシャライザを呼び出すか、すでに初期化されている場合は playbyid 関数を呼び出すことです。

私が使用している YT パブリック API やその他の API は大好きですが、多くの重大な変更への扉が開かれます。これは常に、自分のアーキテクチャと精神力のテストです。

于 2013-02-28T13:40:48.760 に答える
0

2 月 27 日に何かが変更された可能性を排除するつもりはありませんがvideoId、iframe プレーヤーを初期化するときに (またはリスト ID) が必要であることが常に意図されていました。ドキュメントには明示的に記載されていませんが、同時に、パラメーターがオプションであることを示唆することはなく、与えられたすべての例には の値が含まれていますvideoId

したがって、この動作が将来変更されるとは考えていません。

初期化して非表示にしたい YouTube iframe プレーヤーがある場合に行う最も一般的な方法は、CSS を使用してブラウザーの表示可能領域の外側にその位置を設定することです (ネガティブxy座標を使用するなど)。任意のプレースホルダー ビデオでプレーヤーを初期化しloadVideoById()、実際のビデオを再生する準備ができたら呼び出すことができます。またはで検出するonStateChangeと、プレーヤーを適切な表示位置に移動できます。YT.PlayerState.BUFFERINGYT.PlayerState.PLAYING

または、必要になるまでプレーヤーのロードを遅らせることもできます。

于 2013-03-04T20:59:42.947 に答える