在视频播放期间响应 Apple tv 控件

Posted

技术标签:

【中文标题】在视频播放期间响应 Apple tv 控件【英文标题】:Respond to apple tv controls during video playback 【发布时间】:2015-12-03 14:07:31 【问题描述】:

我有一个带有 AVPlayer 的应用来播放视频。我希望能够检测到用户何时按下了遥控器上的按钮。我尝试实现以下方法,但是 remoteControlReceivedWithEvent() 不响应任何控制事件。

- (void)remoteControlReceivedWithEvent:(UIEvent *)event 
    //if it is a remote control event handle it correctly
    if (event.type == UIEventTypeRemoteControl) 
        if (event.subtype == UIEventSubtypeRemoteControlPlay) 
            NSLog(@"play");
         else if (event.subtype == UIEventSubtypeRemoteControlPause) 
            NSLog(@"pause");
         else if (event.subtype == UIEventSubtypeRemoteControlTogglePlayPause) 
            NSLog(@"toggle");
        
    


- (BOOL)canBecomeFirstResponder 
    return YES;


- (void)viewDidAppear:(BOOL)animated 
    // Setup Apple TV control events
    [super viewDidAppear:animated];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];


- (void)viewWillDisappear:(BOOL)animated 
    // Remove Apple TV control events
    [super viewWillDisappear:animated];
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
    [self resignFirstResponder];

任何帮助将不胜感激,谢谢!

【问题讨论】:

【参考方案1】:

您使用 UITapGestureRecognizer 来检测 tvOS 上的按钮点击。设置 allowedPressType 属性(例如设置为 @[@(UIPressTypePlayPause)])。

但是,您不应在 tvOS 上实现自定义交互式播放 UI。相反,使用 AVPlayerViewController (AVKit)。您的自定义播放器将大大低于用户的期望(Siri 命令不起作用、某些遥控器不起作用、您的手势会略有不同等)。

如果您发现 AVPlayerViewController 在其他平台上的限制过多,请再看一下 - tvOS 上有许多用于增强播放的新 API,包括外部元数据和插页式广告。

【讨论】:

嗨,Dan,感谢您的回复,但这不是与 tvOS 相关的问题。我只是指 Apple TV(第一代、第二代或第三代)上的正常播放。 遥控器是否与您的 AirPlay-ing 机器(OS X 或 ios)配对? Apple TV 上不需要配对。遥控器无论如何都可以工作。【参考方案2】:

这似乎是使用 Xcode 7/iOS 9 SDK 构建的项目的问题。使用 Xcode 6 尝试了同样的事情,效果很好。 我已经向 Apple 错误报告者提出了这个问题。

【讨论】:

【参考方案3】:

虽然您无法通过远程控制事件检测到这一点,但可以通过监控播放器的播放速率来检测代码中列出的事件。

如果使用 AVPlayer,请为“rate”添加一个 KVO 侦听器。当它变为 0.0 时,播放已暂停,当它变为 1.0 时,它会再次播放。

我已经成功地使用它来更新我的 UI 控件以反映当前状态。

【讨论】:

感谢回复,我已经实现了。但是,可以检测到远程控制事件(如上面的代码),Apple 开发支持已经证实了这一点。这适用于使用 iOS 8 SDK 及更低版本构建的应用程序,iOS 9 SDK 打破了这一点。 Apple 正在努力修复。 我希望你是对的。我试图让它工作很长时间,但它仍然没有出现在我的代码中,尽管它与上面的示例几乎相同。此外,许多其他人认为只有控制中心事件在起作用,而不是遥控器。不过,如果你说的是正确的,也许还有另一个原因它对我不起作用。

以上是关于在视频播放期间响应 Apple tv 控件的主要内容,如果未能解决你的问题,请参考以下文章

是否可以强制 AVPlayer 停止在外部播放视频(在 Apple TV 上)

从IOS设备播放音频/视频内容到Apple TV的起点[关闭]

Apple tv 音频停止

设置 Apple TV 视频 JavaScript

使用 swift 我们可以以编程方式在 Apple TV 上播放照片吗?

从 ios 应用程序播放空气时,外部 srt 字幕未显示在 Apple tv 中