网站上嵌入YouTube视频的方法

28

我通过在互联网上找到的代码片段,嵌入了一个来自YouTube的视频,这是我使用的代码:

    @interface FirstViewController (Private)
- (void)embedYouTube:(NSString *)urlString frame:(CGRect)frame;
@end


@implementation FirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self embedYouTube:@"http://www.youtube.com/watch?v=l3Iwh5hqbyE" frame:CGRectMake(20, 20, 100, 100)];
}


- (void)embedYouTube:(NSString *)urlString 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, urlString, frame.size.width, frame.size.height];
    UIWebView *videoView = [[UIWebView alloc] initWithFrame:frame];
    [videoView loadHTMLString:html baseURL:nil];
    [self.view addSubview:videoView];
    [videoView release];
}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}

@end

它编译正确,但当我打开它时,我看到一个白色的框架位置不正确,这是代码创建的。我有两个问题:

  1. 我如何知道视频是否会播放,因为它只是一个纯白色的框,模拟器可以从YouTube播放视频吗?

  2. 我如何调整此框的位置?


这段代码在iOS 6上能用吗? - Dee
6个回答

13

我刚刚测试了你的代码,在iPhone上运行良好,但iOS模拟器不支持YouTube视频,所以你需要一个真实设备进行测试。

我如何定位这个框?

你已经在这一行中传递了盒子的X(20)、Y(20)、宽度(100)和高度(100):

[self embedYouTube:@"http://..." frame:CGRectMake(20, 20, 100, 100)];

要在之后更改视图的位置,您可以修改它的center属性:

videoView.center = CGPointMake(200, 100 );

顺便提一下,如果你在模态视图中这样做,当视频播放完毕时,我的应用程序会表现得很奇怪,它会关闭模态视图,UIButtons也无法响应。 一旦我将其移出模态视图,它就可以正常工作了。 - steve
你好,我曾经遇到同样的问题,现在我已经成功在设备上播放视频了,但是又出现了另一个问题,那就是视频只能在iOS 5.1.1版本中播放,如果我想在低于iOS 5.1.1版本中播放视频,我应该怎么做? - Birju
嗨,我正在使用以上代码播放视频。它可以完美地播放视频,但当我暂停视频返回应用程序时,它会崩溃。提示EXC_BAD_ACESS。这方面有什么想法吗? - The iCoder

7

这里是样例代码,在 iOS 5 及以后的版本中正常运作。这是 Youtube API 提供的新实现,myWeb 这里是一个 UIWebView。 URL 中的 showinfo=0 将会移除视频视图顶部的标题栏。

NSString *html = [NSString stringWithFormat:@"<html><body><iframe class=\"youtube-player\" type=\"text/html\" width=\"%f\" height=\"%f\" src=\"http://www.youtube.com/embed/q1091sWVCMI?HD=1;rel=0;showinfo=0\" allowfullscreen frameborder=\"0\" rel=nofollow></iframe></body></html>",frame.size.width,frame.size.height];
[myWeb loadHTMLString:html baseURL:nil];

希望这能对您有所帮助 :)

5

以下是适用于iOS 6和新的YouTube嵌入代码的版本:

- (void)embedYouTube:(NSString *)urlString frame:(CGRect)frame {
    NSString *html = [NSString stringWithFormat:@"<html><head><style type='text/css'>body {background-color: transparent;color: white;}</style></head><body style='margin:0'><iframe width='%f' height='%f' src='%@' frameborder='0' allowfullscreen></iframe></body></html>", frame.size.width, frame.size.height, urlString];
    UIWebView *videoView = [[UIWebView alloc] initWithFrame:frame];
    [videoView loadHTMLString:html baseURL:nil];
    [self.view addSubview:videoView];
}

在将电影加载到Web视图后,您能否自动播放它? - João Nunes
我不再使用这段代码,所以我不确定。你试过吗?如果它没有自动播放,我也不会感到惊讶。我现在只是加载一个外部的mp4视频,效果很好。 - adriandz

0

对于使用Monotouch和C#的人,您可以将这个类添加到您的项目中,并使用它来查看您的视频:

public class YouTubeViewer : UIWebView
{
    public YouTubeViewer(string url, RectangleF frame)
    {
        string youTubeVideoHTML = @"<object width=""{1}"" height=""{2}""><param name=""movie""
                            value=""{0}""></param><embed
                            src=""{0}"" type=""application/x-shockwave-flash"" 
                            width=""{1}"" height=""{2}""</embed></object>"; 

        string html = string.Format(youTubeVideoHTML, url, frame.Size.Width, frame.Size.Height);
        this.LoadHtmlString(html, null);
        this.Frame = frame;
    }
}

请确保您传递的URL是从YouTube提供的嵌入代码中单击“分享”按钮时提供的URL。(并勾选旧代码的复选框)


问题是关于iOS的。 - NSCoder
2
@NSCoder,这个答案是关于iOS的,Monotouch是由一家名为Xamarin的公司提供的软件,它允许开发使用C#编写本地iOS应用程序,而不是现在已弃用的Objective-C。(Swift) - TChadwick

0

Swift 实现:

let webView = UIWebView(frame: self.view.frame) // Position your player frame here

self.view.addSubview(webView)
self.view.bringSubviewToFront(webView)

// Playback options: play in-line and start playing immediately
webView.allowsInlineMediaPlayback = true
webView.mediaPlaybackRequiresUserAction = false

// Set the id of the video you want to play
let videoID = "zN-GGeNPQEg" // https://www.youtube.com/watch?v=zN-GGeNPQEg

// Set up your player
let embededHTML = "<html><body style='margin:0px;padding:0px;'><script type='text/javascript' src='http://www.youtube.com/iframe_api'></script><script type='text/javascript'>function onYouTubeIframeAPIReady(){ytplayer=new YT.Player('playerId',{events:{onReady:onPlayerReady}})}function onPlayerReady(a){a.target.playVideo();}</script><iframe id='playerId' type='text/html' width='\(self.view.frame.size.width)' height='\(self.view.frame.size.height)' src='http://www.youtube.com/embed/\(videoID)?enablejsapi=1&rel=0&playsinline=1&autoplay=1' frameborder='0'></body></html>"

// Load the HTML into your UIWebView
webView.loadHTMLString(embededHTML, baseURL: NSBundle.mainBundle().bundleURL)

另外,YouTube 为开发人员提供了一个很棒的帮助类,用于在他们的 iOS 应用中设置 YouTube 播放,该类会为您设置UIWebView


0

Swift 4

func embedYouTube(_ urlString: String, frame: CGRect) {

    let html = "<html><head><style type='text/css'>body {background-color: transparent;color: white;}</style></head><body style='margin:0'><iframe width='\(frame.size.width)' height='\(frame.size.height)' src='\(urlString)' frameborder='0' allowfullscreen></iframe></body></html>"
    let videoView = UIWebView(frame: frame)
    videoView.loadHTMLString(html, baseURL: nil)
    view.addSubview(videoView)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接