【问题标题】:AirPlay support, MPMoviePlayerController and MPVolumeView relationAirPlay 支持,MPMoviePlayerController 和 MPVolumeView 关系
【发布时间】:2011-08-09 12:19:30
【问题描述】:

我正在开发一个支持视频播放的 iPhone 应用程序。我正在使用带有自定义控件的 MPMoviePlayerController 来播放视频。为此,我将 MPMoviePlayerController 的控件样式设置为 MPMovieControlStyleNone。

我想为正在播放的视频支持 AirPlay 功能。根据文档,我们必须将 MPMoviePlayerController 的 'allowsAirPlay' 属性设置为 YES 以启用 AirPlay 功能。如果我将 MPMoviePlayerController 与自定义控件一起使用,如何在播放器 UI 上显示 AirPlay 按钮?

我尝试了以下方法:

  1. 实例化 MPVolumeView
  2. 将 MPVolumeView 的 showsRouteButton 和 showsVolumeSlider 属性设置为 NO 以隐藏音量滑块和路由按钮
  3. 在我的自定义播放器视图中添加了 MPVolumeView

我没有给出 MPVolumeView 和 MPMoviePlayerController 的参考。但是,如果 MPMoviePlayerController 的“allowsAirPlay”设置为 YES,则 AirPlay 按钮会显示在 MPVolumeView 上。 MPVolumeView 和 MPMoviePlayerController 有什么关系?这两个独立创建的类之间有什么联系?

【问题讨论】:

  • 您不能使用自定义控制栏。唯一可以显示 airplay 按钮(不篡改 Apple 代码)的地方是使用标准控制栏。
  • 希望通过 5.0 中的 AirPlay 更新解决此问题
  • 有人可以回答“MPVolumeView 和 MPMoviePlayerController 有什么关系吗?”

标签: iphone mpmovieplayercontroller relation airplay mpvolumeview


【解决方案1】:

由于 MPMoviePlayerController 一次只允许您播放一个视频,因此 MediaPlayer 框架始终知道正在播放的视频。这就是 MPVolumeView 了解 MPMoviePlayerController 的方式。我没有官方文档,但我想它是以这种方式融入框架的。

由于可能有很多制衡机制(而且他们喜欢一致的 UI),Apple 只允许您使用他们的 AirPlay 按钮/UI 来利用此功能。但是,您可以将该按钮放在任何您想要的位置:

airplayButton = [[MPVolumeView alloc] init];
airplayButton.frame = CGRectMake(myX, myY, 40, 40);
[airplayButton setShowsVolumeSlider:NO];
[customPlayerControls.view addSubview:airplayButton];

我只是猜测宽度,高度是 40,40,我确定它不正确,但是一旦我把按钮放在适当的位置就没有关系了。

【讨论】:

  • 但是,这并不能回答我的问题
  • 您问了两个问题: > 如果我使用带有自定义控件的 MPMoviePlayerController,如何在播放器 UI 上显示 AirPlay 按钮?代码 sn-p 回答了这个问题。创建一个 MPVolumeView 的实例,隐藏它的音量滑块,剩下的就是 Airplay 按钮。设置它的框架并将其添加到视图中。这会在您的控件中放置一个功能齐全的 Airplay 按钮。仅当范围内有启用 Airplay 的设备时才会出现。 【改变外观】:stackoverflow.com/questions/5730973/…
  • > MPVolumeView 和 MPMoviePlayerController 有什么关系?它们都是 MediaPlayer 框架的一部分,因此,当 MPMoviePlayerController 正在播放电影时,框架“知道”它。由于 MPVolumeView 在框架中,它“知道”它。这就是为什么您不需要将 MPMoviePlayerController 的任何引用传递给 Airplay 按钮 - 它已经知道了。
  • 感谢您的回复。我还有一个疑问:在创建 MPMoviePlayer 控制器之前,有什么方法可以在我们的 UI 上显示 Air Play Button [只是创建 MPVolumeView]。我认为这是不可能的;只是想符合...
  • 我没有测试过,所以我不确定,但我几乎可以肯定答案是否定的。但是由于该按钮无论如何都会失效(也就是说,由于应用程序没有媒体播放,因此它不会连接任何内容到 airplay),您可以使用 airplay 按钮图标轻松创建一个 UIButton 并将其放置在您想要的任何位置。不过,Apple 在审核期间可能会遇到问题。
【解决方案2】:
for (UIButton *button in volumeView.subviews) {
if ([button isKindOfClass:[UIButton class]]) {
    [button setImage:[UIImage imageNamed:@"custom-route-button.png"] forState:UIControlStateNormal];
    [button sizeToFit];
}}

我想这会对你有所帮助。

【讨论】:

  • 此解决方案可能会被 Apple 拒绝应用。但是,它是目前唯一可用的解决方案。 +1
  • @Till:由于此解决方案不使用任何私有 API,Apple 不会拒绝它。事实上,我们做类似的事情(自定义音量滑块),其他应用程序也这样做。如果 Apple 选择更改布局以使按钮不再是直接子视图,则代码将不再工作,但不会做任何有害的事情。
  • @DarkDust 使用非私有 API 方法不会阻止拒绝。在苹果显然无意修改苹果标准控制的地方也会增加这种风险。这个解决方案仍然有效,目前不会被 Apple 拒绝。
【解决方案3】:

MPVolumeView 有一个属性来隐藏音量滑块并显示 Route 按钮。所以不需要遍历隐藏东西的视图。

MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:myContainerView.bounds] autorelease];
volumeView.showsVolumeSlider = NO;
volumeView.showsRouteButton = YES;
[myContainerView addSubview:volumeView];

AirPlay (Route) 按钮的位置可能不是您所期望的,因此您可能需要稍微播放一下容器视图的框架才能将其放置在您想要的位置。

【讨论】:

    【解决方案4】:

    答案是:你不能。自 iOS 4.3 起,没有官方方法可以为 Airplay 提供您自己的控件 - 如果您需要该功能,则需要使用标准控件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多