2015-11-24 36 views
9

Tôi đã tạo một tập lệnh phát trực tuyến trên YouTube để phát ngẫu nhiên các video nhạc trên YouTube hoặc từ hàng đợi. Nó hoạt động tốt trong nhiều tháng cho đến tuần này, trong đó nó dường như không muốn tải các video khi sử dụng iPad/iPhone. Tôi nhận được lỗi sau thay vì:Cách khắc phục "Nếu phát lại không bắt đầu ngay, hãy thử khởi động lại thiết bị của bạn" bằng cách sử dụng API Youtube iFrame trên iPad?

Nếu phát lại không bắt đầu ngay, hãy thử khởi động lại thiết bị của bạn

Những gì tôi đã cố gắng:

Tôi đã thử Safari, Chrome , Firefox và Opera và tất cả đều là lỗi. Tôi đã thử xóa dữ liệu trang web/bộ nhớ cache, khởi động lại thiết bị, khởi động lại toàn bộ thiết bị. Không có gì hiệu quả. Điều kỳ lạ là, nó hoạt động hoàn toàn tốt trên một máy tính để bàn Windows mà dẫn tôi tin rằng nó không phải là một lỗi trong mã, nhưng cái gì đó đã hoặc là thay đổi với các API hoặc với Safari. Mã của tôi chưa được chỉnh sửa gần đây hoặc có thể đã khiến nó ngừng hoạt động.

Tôi đã thử gỡ lỗi nó bằng cách sử dụng jsconsole.com, không có gì đáng ngờ bật lên. Trong một số trường hợp, trình phát sẽ tải, tiêu đề của video sẽ hiển thị và hình ảnh sẽ như vậy, nhưng sau khoảng 30 giây, lỗi ở trên sẽ hiển thị cùng với trình quay tải.

Tôi biết rằng playVideo(); không hoạt động (tự động phát) trên thiết bị iOS. Điều này là tốt, và một lần nữa, kịch bản đã làm việc trước đây, tôi chỉ phải bấm phát trên video đầu tiên. Nhưng bây giờ, có vẻ như iOS đang cố gắng tự động phát video. Vì vậy, tôi cũng đã thử nghiệm bằng cách xóa các cuộc gọi playVideo(), sự cố vẫn tiếp diễn.

Được thử nghiệm trên iPad 2, iPad mini và iPhone 4 (tất cả đều có iOS mới nhất có sẵn trên thiết bị và tất cả đã hoạt động trước đó).

Tôi đang thua lỗ và cố gắng sửa lỗi này trước ngày cuối tuần cho bữa tiệc nhà :) Vì vậy, tôi đánh giá cao mọi trợ giúp hoặc gợi ý về những gì có thể gây ra lỗi trên iOS.

Đây là đoạn mã javascript:

// 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 (25TH NOV 2015)

tôi đã quyết định bắt đầu từ đầu và làm việc với mã ví dụ trên https://developers.google.com/youtube/iframe_api_reference. Dường như loadVideoById() không còn hoạt động trên iPad nữa. Đó là trước kia. Nếu tôi không bao gồm loadVideoById() hoặc playVideo() nó hoạt động. Lý tưởng nhất, tôi muốn nó hoạt động với loadVideoById().

+0

Điều này xảy ra với tôi hôm nay, tất cả các video đều không hoạt động trên tất cả trình duyệt youtube và fb. – XBasic3000

Trả lời

5

Tôi đã đập đầu tôi chống lại máy tính trong nhiều giờ cố gắng để giải quyết một này ... Dưới đây là những gì tôi đã được tìm thấy.

Điều này xảy ra do giới hạn iOS của Apple dành cho iOS: các trang web chỉ có thể bắt đầu phát âm thanh/video khi phản hồi trực tiếp phản hồi của người dùng. (Lưu ý giới hạn này chỉ ảnh hưởng đến âm thanh/video đầu tiên của lần đầu được phát trên một trang.)

Thông thường, cuộc gọi play() của bạn diễn ra trực tiếp trong trình xử lý sự kiện (ví dụ: trình xử lý nhấp chuột). Tính năng này hoạt động cho API âm thanh trên web và video HTML5 thông thường - nhưng nội dung nào đó về trình phát YouTube ngăn điều này làm việc cho YouTube.

Kết quả là, giải pháp cho YouTube rõ ràng là yêu cầu người dùng nhấp vào chính video YouTube để bắt đầu phát lại. Từ đó, bạn có thể kiểm soát nó bằng API iframe của YouTube (phát, tạm dừng, tìm kiếm, v.v.). Nhưng bạn không thể kiểm soát video trên YouTube bằng API cho đến sau người dùng đã nhấp vào video.

Để có trải nghiệm người dùng dễ sử dụng, bạn có thể ẩn tất cả giao diện người dùng kiểm soát trình phát của mình và yêu cầu người dùng nhấp vào chính video YouTube để bắt đầu phát lại. Sau đó, một lần, người dùng đã nhấp vào video một lần, bạn có thể kích hoạt giao diện người dùng của mình. Tất nhiên, bạn nên thiết kế này chỉ để áp dụng cho iOS.

Cảm ơn bạn đã đau đầu, Apple!

4

Tôi gặp sự cố tương tự và đã thực hiện một số thao tác, hóa ra Apple đã xóa khả năng tự động phát các mục nhúng qua tập lệnh v.v. để người dùng cuối không sử dụng hết dữ liệu của họ bất ngờ. Người dùng cần tự kích hoạt nút phát.

Cách tốt nhất để khắc phục sự cố này sẽ là kiểm tra xem người dùng có sử dụng thiết bị di động hay máy tính để bàn và đặt biến (true/false) hay không.

Đây là những gì tôi đã làm

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

 
if(!mobileDevice) ytPlayer.playVideo();

Hy vọng rằng sẽ giúp.

Source (https://developer.apple.com)

Để ngăn chặn tải không mong muốn trên mạng di động với chi phí của người sử dụng , phương tiện truyền thông nhúng không thể được phát tự động trong Safari trên iOS người dùng luôn luôn khởi phát lại.

Nhiều câu trả lời ở đây - YouTube API not working with iPad/iPhone/non-Flash device

1

Nếu vấn đề là những gì hai câu trả lời khác (Adrian & Junior) nói sau đó nó phải được giải quyết một cách dễ dàng bằng cách truy cập UIWebView (hoặc WKWebView) và thiết lập mediaPlaybackRequiresUserAction cờ. Điều này có thể được thực hiện nếu bạn đã cuộn giải pháp của riêng mình hoặc nếu bạn sử dụng khung chính thức (https://github.com/youtube/youtube-ios-player-helper).

Swift

let playerView = YTPlayerView() 
playerView.webView.mediaPlaybackRequiresUserAction = false 
0

tôi phải đối mặt với vấn đề sau khi cài đặt một ứng dụng âm thanh DPS để máy tính xách tay của tôi. Các ứng dụng đã sửa đổi Trình điều khiển Âm thanh hiện tại của tôi thành các Loa "(Trạm điện kỹ thuật số)" Thiết bị âm thanh.

Bằng cách đọc bài đăng Reddit, tôi thay thế thiết bị âm thanh thành nguồn gốc của Máy tính xách tay của tôi. Do đó, vấn đề đã được khắc phục cho tôi.

Các vấn đề liên quan