【问题标题】:Media Callbacks with Embedded YouTube Videos on iOSiOS 上嵌入 YouTube 视频的媒体回调
【发布时间】:2012-02-08 20:21:51
【问题描述】:

我将 YouTube 视频嵌入到 iOS 应用的 UIWebView。我在this YouTube blog post 使用“方法2”来嵌入视频。这很好用,除了因为 iOS 管理媒体播放器,我无法确定视频是否正在播放或已播放完毕。我不想在播放视频时将该视图与另一个视图交换,但我没有找到确定这一点的好方法。有任何想法吗?如果有一种方法可以获取 JavaScript 回调,那么它会起作用,或者如果有一种方法可以使用 HTML5 <video> 标签嵌入 YouTube 视频,那么它也会起作用(我已经尝试过,但没有成功)。

【问题讨论】:

标签: ios cocoa-touch uiwebview youtube


【解决方案1】:

只需为 MPAVControllerPlaybackStateChangedNotification 添加观察者。

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playbackStateDidChange:)
                                                 name:@"MPAVControllerPlaybackStateChangedNotification"
                                               object:nil];

然后开始听:

- (void)playbackStateDidChange:(NSNotification *)note
{
    NSLog(@"note.name=%@ state=%d", note.name, [[note.userInfo objectForKey:@"MPAVControllerNewStateParameter"] intValue]);
    int playbackState = [[note.userInfo objectForKey:@"MPAVControllerNewStateParameter"] intValue];
    switch (playbackState) {
        case 1: //end
            ;
            break;
        case 2: //start
            ;
            break;    
        default:
            break;
    }
}

如果您有兴趣,可以探索其他州。此外,所有对其他通知感兴趣的人都可以注册以查看全部:

CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), 
                                    NULL, 
                                    noteCallbackFunction, 
                                    NULL, 
                                    NULL,  
                                    CFNotificationSuspensionBehaviorDeliverImmediately);

然后检查发生了什么:

void noteCallbackFunction (CFNotificationCenterRef center,
                 void *observer,
                 CFStringRef name,
                 const void *object,
                 CFDictionaryRef userInfo)
{
    NSLog(@"notification name: %@", name);
    NSLog(@"notification info: %@", userInfo);
}

玩得开心!

【讨论】:

  • 这种方法可以让我走完 95% 的路,但由于我同时在屏幕上有多个 YouTube 播放器,它不允许我看到 哪个 视频开始播放.不过谢谢!
  • 您可以从头文件中解码更多通知:github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/… 例如MPAVControllerItemPlaybackDidEndNotification
【解决方案2】:

对于 iPhone,我使用了一些棘手的方法。当视频模式视图控制器被关闭时,您会收到通知。

-(void) onUIWebViewButtonTouch:(id) sender
{
     self.isWatchForNotifications = YES;
    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(windowNowVisible:)
     name:UIWindowDidBecomeVisibleNotification
     object:self.view.window
     ];
}

- (void)windowNowVisible:(NSNotification *)note
{
 if (isWatchForNotifications == YES)
 {
   //modal viewcontroller was dismissed
 }
  self.isWatchForNotifications = NO;
} 

【讨论】:

  • 有效,但仅适用于全屏播放视频的 iPhone。
【解决方案3】:

您可以将 javascript 注入 UIWebView(请参阅 http://iphoneincubator.com/blog/windows-views/how-to-inject-javascript-functions-into-a-uiwebview)...有关 javascript 和 UIWebView 的其他有趣内容可以在 herehere 中找到。

尝试将它与这个实验性的 youtube API 一起使用(请参阅http://code.google.com/apis/youtube/iframe_api_reference.html)...这应该能够得到你想要的。

另一个有用的资源是here

【讨论】:

  • 如果您使用 YouTube 应用播放视频。我将它们嵌入UIWebView。在 iPhone 上,这会推送一个模态视图控制器,但在 iPad 上,它们会内联播放。
  • 我明白 - 因为我不知道......删除我的答案。希望有人能给你一个可行的答案。
  • @JeffKelley 找到了一个选项...虽然无法测试... HTH
  • 不幸的是,这是针对大容量应用程序的。来自 API 链接:“注意:本文档中描述的 IFrame 播放器 API 是一项实验性功能,代表了 YouTube 播放器 API 的下一阶段。您不应使用此 API 构建业务关键型应用程序,也不应将使用此 API 的任何应用程序启动到生产环境中。”
  • @JeffKelley 这就是我写 experimental 的原因...虽然我希望 Google 会在某个时候将此 API 正式化...不知道您的时间表 - 也许是值得一试吗?
猜你喜欢
  • 2013-12-17
  • 2014-04-16
  • 2014-11-10
  • 2012-06-12
  • 2013-10-07
  • 1970-01-01
  • 2020-01-15
  • 2012-09-01
相关资源
最近更新 更多