it-swarm.com.de

Fehlerbehebung "Wenn die Wiedergabe nicht kurz beginnt, versuchen Sie, Ihr Gerät neu zu starten", indem Sie die Youtube iFrame API auf dem iPad verwenden.

Ich habe ein kleines YouTube-Streaming-Skript erstellt, das YouTube-Musikvideos oder aus einer Warteschlange zufällig wiedergibt. Es hat bis Monate in dieser Woche gut funktioniert, in der die Videos bei einem iPad/iPhone nicht geladen werden sollen. Ich erhalte stattdessen folgende Fehlermeldung:

Wenn die Wiedergabe nicht kurz beginnt, starten Sie Ihr Gerät neu

Was ich probiert habe:

Ich habe Safari, Chrome, Firefox und Opera ausprobiert und sie alle haben Fehler. Ich habe versucht, Website-Daten/Cache zu löschen, das Gerät neu zu starten und das Gerät vollständig neu zu starten. Nichts funktioniert. Das Seltsame ist, es funktioniert auf einem Windows-Desktop absolut einwandfrei, was mich zu der Annahme führt, dass es sich nicht um einen Fehler im Code handelt, sondern etwas, das sich entweder mit der API oder mit Safari geändert hat. Mein Code wurde in letzter Zeit auch nicht bearbeitet, was möglicherweise dazu geführt hat, dass er nicht mehr funktioniert.

Ich habe versucht, es mit jsconsole.com zu debuggen, es erscheint nichts Verdächtiges. In einigen Fällen wird der Player geladen, der Titel des Videos und das Bild werden angezeigt, aber nach etwa 30 Sekunden wird der obige Fehler zusammen mit dem Laderad angezeigt.

Mir ist bewusst, dass playVideo (); funktioniert nicht (automatische Wiedergabe) auf iOS-Geräten. Das ist in Ordnung, und das Skript hat schon einmal funktioniert, ich musste nur auf das first - Video drücken. Aber jetzt scheint es, als ob iOS versucht, das Video automatisch abzuspielen. Also habe ich auch durch das Entfernen der playVideo () - Aufrufe getestet, dass das Problem weiterhin besteht.

Getestet auf iPad 2, iPad Mini und iPhone 4 (alle mit dem neuesten iOS-Gerät auf dem Gerät und alles funktionierte zuvor). 

Ich bin ratlos und versuche, das Problem vor dem Wochenende für eine Hausparty zu beheben :) Ich würde mich über jede Hilfe oder Hinweise freuen, was den Fehler bei iOS verursachen könnte.

Hier ist der Javascript-Code:

// 2. This code loads the IFrame Player API code asynchronously.
var tag = document.createElement('script');

tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

// 3. This function creates an <iframe> (and YouTube player)
//    after the API code downloads.
var player;
function onYouTubeIframeAPIReady() {
    player = new YT.Player('player', {
        height: '390',
        width: '640',
        events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
        }
    });
}

// 4. The API will call this function when the video player is ready.
function onPlayerReady(event) {
    check_queue_timer = setTimeout(check_queue(),3000);
}

// 5. The API calls this function when the player's state changes.
//    The function indicates that when playing a video (state=1),
//    the player should play for six seconds and then stop.
var done = false;
function onPlayerStateChange(event) {
    if (event.data === 0) {
        // TRACK AS DONE, REFRESH QUEUE AND GET NEXT SONG
        // POST TO WRITE TO FILE
        $.ajax({
            type: 'POST',
            url: site_url+'ajax_next_track',
            dataType: 'json',
            data: 'queue_id='+$('#queue_id').val(),
            cache: false,
            success:
            function(data){

                if(data.status == 'success'){
                    $("#queue_table").empty();
                    if(data.queue.length == 0){
                        check_queue_timer = setTimeout(check_queue(),3000);
                    }
                    $.each(data.queue, function(i, item) {
                        if(i == 0){
                            event.target.loadVideoById(item.video_id);
                            event.target.playVideo();
                            $('#queue_id').val(item.queue_id);
                        }
                        $('#queue_table').append('<tr><td>'+item.title+'</td></tr>');
                    });
                }
                else{
                    console(data.message);
                }
            },
            error:
            function( jqXHR, textStatus, errorThrown ){
                $('#error_msg').html('Something broke.').fadeIn();
            }

        });
    }
}
function stopVideo() {
    player.stopVideo();
}

function check_queue(){
    $.ajax({
        type: 'POST',
        url: site_url+'ajax_next_track',
        dataType: 'json',
        data: 'no_delete=1',
        cache: false,
        success:
        function(data){

            if(data.status == 'success'){
                $("#queue_table").empty();
                if(data.queue.length == 0){
                    clearTimeout(check_queue_timer);
                    check_queue_timer = setTimeout(check_queue(),3000);
                }
                $.each(data.queue, function(i, item) {
                    if(i == 0){
                        player.loadVideoById(item.video_id);
                        player.playVideo();
                        $('#queue_id').val(item.queue_id);
                        clearTimeout(check_queue_timer);
                    }
                    $('#queue_table').append('<tr><td>'+item.title+'</td></tr>');
                });
            }
            else{
                console(data.message);
            }
        },
        error:
        function( jqXHR, textStatus, errorThrown ){
            $('#error_msg').html('Something broke.').fadeIn();
        }

    });
}

UPDATE 1 (25. NOV 2015)

Ich habe beschlossen, bei Null anzufangen und mit dem Beispielcode unter https://developers.google.com/youtube/iframe_api_reference zu arbeiten. Es scheint, dass loadVideoById () auf iPads nicht mehr funktioniert. Es war davor. Wenn ich loadVideoById () oder playVideo () nicht einbeziehe, funktioniert es. Im Idealfall möchte ich, dass es mit loadVideoById () funktioniert.

10
David

Ich habe meinen Kopf stundenlang gegen den Computer geschlagen, als ich versuchte, dieses Problem zu lösen ... Folgendes habe ich gefunden.

Dies geschieht aufgrund der drakonischen iOS-Einschränkung von Apple: Webseiten können nur dann Audio/Video abspielen, wenn sie direkt auf Benutzerfeedback reagieren. (Beachten Sie, dass diese Einschränkung nur die erste Zeit betrifft, zu der Audio/Video auf einer Seite abgespielt wird.)

Normalerweise reicht es aus, um die Einschränkungen von Apple zu umgehen, um sicherzustellen, dass Ihr play () - Aufruf direkt in einem Event-Handler (z. B. einem Click-Handler) stattfindet. Dies funktioniert für die Web-Audio-API und normale HTML5-Videos - aber etwas über den YouTube-Player verhindert, dass dies für YouTube funktioniert.

Daher besteht die Lösung für YouTube anscheinend darin, dass der Benutzer auf das YouTube-Video selbst klicken muss, um die Wiedergabe zu starten. Von da an können Sie es mit der YouTube-Iframe-API steuern (Wiedergabe, Pause, Suchen usw.). Sie können das YouTube-Video jedoch nicht mithilfe der API steuern, bis after der Nutzer das Video angeklickt hat.

Für eine narrensichere Nutzererfahrung können Sie die gesamte Player-steuernde Benutzeroberfläche ausblenden und die Benutzer anweisen, auf das YouTube-Video selbst zu klicken, um die Wiedergabe zu starten. Sobald der Benutzer einmal auf das Video geklickt hat, können Sie Ihre Benutzeroberfläche aktivieren. Natürlich sollte dies nur für iOS gelten.

Danke für die Kopfschmerzen, Apple!

7
Adrian Holovaty

Ich hatte ein ähnliches Problem und habe ein wenig gegraben, stellte sich heraus, dass Apple die Möglichkeit zum automatischen Einbetten von Elementen über Skripts usw. entfernt hat, sodass der Endbenutzer seine Daten nicht unerwartet verbraucht. Der Benutzer muss die Wiedergabetaste selbst auslösen.

Sie können dieses Problem am besten beheben, indem Sie prüfen, ob sich der Benutzer auf einem mobilen Gerät oder auf dem Desktop befindet, und eine Variable festlegen (true/false).

Das habe ich getan

var mobileDevice = false;
if(typeof window.orientation !== 'undefined'){
	var mobileDevice = true;
}

if(!mobileDevice) ytPlayer.playVideo();

Hoffentlich hilft das.

Quelle (https://developer.Apple.com)

So verhindern Sie unerwünschte Downloads über Mobilfunknetze beim Benutzer Kosten können eingebettete Medien auf .__ nicht automatisch in Safari abgespielt werden. iOS: Der Benutzer startet immer die Wiedergabe.

Weitere Antworten hier - YouTube-API funktioniert nicht mit iPad/iPhone/Nicht-Flash-Geräten

5
Junior

Wenn das Problem das ist, was die anderen beiden Antworten (Adrian & Junior) sagen, sollte es leicht gelöst werden, indem auf die Variable UIWebView (oder WKWebView) zugegriffen wird und das Flag mediaPlaybackRequiresUserAction gesetzt wird. Dies kann geschehen, wenn Sie Ihre eigene Lösung gerollt haben oder wenn Sie das offizielle Framework verwenden ( https://github.com/youtube/youtube-ios-player-helper ).

Schnell

let playerView = YTPlayerView()
playerView.webView.mediaPlaybackRequiresUserAction = false
1
ABeanSits

Nach der Installation einer DPS-Audioanwendung auf meinem Laptop trat das Problem auf. Die Apps modifizierten meinen vorhandenen Audiotreiber zu ihren "Speakers (Digital Power Station)" Audiogeräten.

Durch das Lesen eines Reddit - Postens ersetze ich das Audiogerät in den Ursprung meines Laptops. Damit ist das Problem für mich behoben.

0
AR Rose