Phát video YouTube bằng MPMoviePlayerController thay vì UIWebView


89

Tôi đang cố phát một số video trên YouTube bằng MPMoviePlayerController nhưng tôi đang gặp một số sự cố. Mã tôi đang sử dụng khá đơn giản và tôi có thể phát video .m4v bằng cách chuyển URL tới initWithContentURL. Khi tôi khởi chạy trình phát phim, trình phát sẽ xuất hiện nhưng sẽ biến mất sau khoảng 20 giây. Khi tôi thử nó trong trình mô phỏng, tôi nhận được một chế độ xem cảnh báo cho biết máy chủ không được định cấu hình chính xác. Có đối số mà tôi cần chuyển với URL để nhận một loại nguồn cấp dữ liệu video cụ thể từ google không?

NSURL *videoURL = [NSURL URLWithString:@"http://www.youtube.com/v/HGd9qAfpZio&hl=en_US&fs=1&"];
MPMoviePlayerController *moviePlayer;
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];

[moviePlayer play];

Tôi cũng đã thử http://www.youtube.com/watch?v=HGd9qAfpZio của URL sau

Tôi cũng đã thấy đối số & format = 1 và cố gắng thêm đối số đó vào cuối cả hai chuỗi nhưng không may mắn.


Tôi đã tìm thêm một số thông tin nhưng nó vẫn không hoạt động. Ai đó đã đề xuất sử dụng mã này cho URL: youtube.com/get_video?video_id=ID&t=SIGNATURE&fmt=18 Tôi đã nhập ID video của mình nhưng tôi không biết chữ ký là gì? Và trình phát video vẫn hoạt động như cũ. Nó mở trình phát rồi đóng sau 10 đến 20 giây.
jmurphy

Câu trả lời:


78

Cách duy nhất để phát video youtube bên trong ứng dụng của riêng bạn là tạo một UIWebViewvới thẻ nhúng từ Youtube cho phim bạn muốn phát làm UIWebView'snội dung. UIWebViewsẽ phát hiện đối tượng được nhúng là một liên kết Youtube và nội dung của chế độ xem web sẽ là bản xem trước trên youtube cho video. Khi người dùng của bạn nhấp vào bản xem trước, video sẽ được hiển thị trong MPMoviePlayerController. Đây là kỹ thuật được mô tả tại liên kết mà Muxecoid cung cấp ( cách phát video youtube trong một ứng dụng ) và đây là (theo như tôi biết) là cách duy nhất để phát video youtube trong một ứng dụng. Bạn vẫn có thể khởi chạy ứng dụng Youtube bằng cách chuyển URL youtube tới -[UIApplication openURL:], nhưng tất nhiên điều này sẽ đóng ứng dụng của chính bạn mà điều này thường không mong muốn.

Rất tiếc, không có cách nào để phát trực tiếp video MPMoviePlayerControlleryoutube vì youtube không hiển thị các liên kết trực tiếp đến các tệp video.


1
Đúng, đó là cách duy nhất để phát video YouTube trong ứng dụng của bạn. Đã dành 2 tìm kiếm các giải pháp thay thế. Chất lượng cũng hơi tệ.
samvermette

Vẫn không còn cách nào khác - sau hơn 2 năm?
fabb

Có khả năng nhận được thông báo PlaybackFinishReason và PlaybackState trong trường hợp phát video youtube dưới dạng nhúng không?
Roshit

7
Đây không phải là cách duy nhất. Bạn có thể lấy tệp mp4 từ Youtube. Tôi làm điều đó trong Dự án Python AirPlayer của mình , cho phép bạn phát video youtube trên AppleTV của mình. Tôi sẽ chuyển nó và sử dụng nó trong dự án iOS hiện tại của mình và đăng mã ở đây khi nó sẵn sàng.
hellozimi

7
Thật không may, việc sử dụng một liên kết trực tiếp bị cấm. Mục II / 10. trong Develop.google.com/youtube/terms : "Ứng dụng khách API của bạn sẽ không [...] truy cập bất kỳ phần nào của bất kỳ nội dung nghe nhìn nào trên YouTube bằng bất kỳ phương tiện nào ngoài việc sử dụng trình phát YouTube hoặc trình phát video khác được YouTube cho phép rõ ràng;"
Lvsti

26

Nếu bạn đang sử dụng Mã:

- (void)embedYouTube:(NSString*)url frame:(CGRect)frame {  
     NSString* embedHTML = @"\ 
        <html><head>\ 
     <style type=\"text/css\">\ 
     body {\ 
     background-color: transparent;\ 
     color: white;\ 
    }\ 
   </style>\ 
    </head><body style=\"margin:0\">\ 
       <embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" \ 
    width=\"%0.0f\" height=\"%0.0f\"></embed>\ 
       </body></html>";  
   NSString* html = [NSString stringWithFormat:embedHTML, url, frame.size.width, frame.size.height];  
   if(videoView == nil) {  
      videoView = [[UIWebView alloc] initWithFrame:frame];  
     [self.view addSubview:videoView];  
    }  
    [videoView loadHTMLString:html baseURL:nil];  
  }

Nguồn:

Chỉ cần tham khảo liên kết này

Đảm bảo rằng bạn kiểm tra nó trên thiết bị chứ không phải trên trình mô phỏng. Vì trình mô phỏng sẽ luôn hiển thị dấu hỏi với hộp màu xanh lam (nó không có trình phát thời gian nhanh).


23

Như tôi đã viết ở trên trong nhận xét của mình, tôi phải làm điều này trong một dự án mà tôi đang làm việc. Tôi đã giải quyết vấn đề này và gửi mã trên github.

Bạn có thể kiểm tra nguồn và phân nhánh nó tại đây .

Về cơ bản, nó cần một url youtube và nhận tất cả các url video tương thích với iOS.

Hy vọng điều này là để giúp đỡ bất kỳ!
Chúc mừng


1
Cảm ơn! BTW, các bản cập nhật đã khắc phục sự cố với các thay đổi gần đây của YouTube.
Peter DeWeese 3/10/12

1
Điều này không được phép theo ToS của YouTube. Hãy tự chịu rủi ro khi sử dụng vì ứng dụng của bạn có thể ngừng hoạt động bất kỳ lúc nào nếu YouTube nhận thấy bạn không tuân theo Điều khoản dịch vụ HOẶC nếu YouTube thay đổi mã nhúng mà ứng dụng tạo ra.
Mathew

13

Tôi vừa tình cờ gặp một người có thể đặt YouTubevideo bên trong MPMoviePlayerController. Nó dường như có thể bây giờ.

LBYouTubeView


@Thanx nó hoạt động tốt nhưng khi tôi sử dụng [mpplayer stop]; để ngăn chặn video này sau đó đoạn video là running.but tôi muốn dừng đoạn video
Jaspreet Singh

Có phải liên kết github cũng phát âm thanh trong nền không?
Khalid Usman

2

Để phát video ống của bạn, bạn cần trích xuất url trước khi chuyển url vào MPMoviePlayer. Bạn không thể chơi nó trực tiếp.

Github repo của tôi có một bản demo triển khai điều này.

Xem:

https://github.com/DpzAtMicRO/IOSYoutubePlayer

Hãy thử nó, điều này giúp bạn có thể tải và phát video youtube trực tiếp MPMoviePlayernhư bất kỳ video nào khác và cũng là một cách tiếp cận khá tốt.

CHỈNH SỬA: Đảm bảo rằng bạn đã xem qua Readme.md trước khi sử dụng nó trong dự án của bạn


2
Thật không may, chống lại ToS của YouTube. Nếu bạn làm điều này, bạn chỉ có thể mong đợi ứng dụng của mình hoạt động miễn là YouTube không biết bạn đang làm gì.
Mathew

Tôi cũng đã gửi email cho các nhân viên API của YouTube một thời gian để hỏi rằng liệu tôi có thể tự phân tích cú pháp URL của video không; đây là một trích dẫn từ câu trả lời tôi nhận: "Cơ chế chỉ được hỗ trợ là nhúng iframe truy cập suối liệu không được hỗ trợ bởi ToS của chúng tôi khác với res thấp RTSP suối chúng tôi cung cấp cho điện thoại tính năng."
Mathew

1
Bạn đã thuyết phục tôi về điểm không ủng hộ; Tôi đồng ý rằng nó phải là một công cụ để đánh dấu sự không chính xác và sự ủng hộ đó là đủ để cho thấy câu trả lời nào trong số những câu trả lời này mà tôi nghĩ là phù hợp nhất với những người đang cố gắng giải quyết vấn đề nhúng YouTube. Chết tiệt, Rõ ràng là StackOverflow đã khóa phiếu phản đối của tôi và tôi không thể xóa nó nữa trừ khi câu trả lời của bạn được chỉnh sửa.
Mathew

tuyệt quá! Tôi có thể thực hiện một chỉnh sửa và yêu cầu bạn xóa phiếu phản đối của bạn sau đó! ... Nhưng ... không cần..để nó ở đó!
DD_

@Mathew Rất nhiều ứng dụng iOS hợp pháp đang làm điều này (bỏ qua API của YouTube) và mặc dù nó vi phạm Điều khoản dịch vụ như bạn đã chỉ ra, Google dường như không bận tâm trong nhiều trường hợp vì nó cho phép sản phẩm của họ tiếp cận nhiều người xem hơn.
rmp251

1

Nó đơn giản như lấy phần tử src của iframe cho mã nhúng mới và gọi

[self.webView loadRequest:[NSURLRequest requestWithURL:self.url]];


0

Có một cách chính thức để nhúng video YouTube vào ứng dụng iOS do Google cung cấp.

Cài đặt thư viện qua cocoapods: pod "youtube-ios-player-helper"

import by: #import “YTPlayerView.h” Sử dụng UIViewvà đặt lớp thành YTPlayerViewhoặc tạo đối tượng của YTPlayerViewchương trình.

Tải video: [self.playerView loadWithVideoId:@"M7lc1UVf-VE"];

Ngoài ra còn có playVideostopVideocác phương pháp có sẵn. Để biết thêm thông tin, hãy truy cập Liên kết này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.