AirPlay支持,MPMoviePlayerController和MPVolumeView的关系

14

我正在开发一款支持视频播放的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之间有什么关系?这两个独立创建的类之间有什么连接?

答案: 在使用MPMoviePlayerController时,可以通过设置其'allowsAirPlay'属性为YES启用AirPlay功能。如果要在自定义播放器UI上显示AirPlay按钮,则需要将MPMoviePlayerController的视图层次结构与MPVolumeView相关联。尽管这两个类是独立创建的,但是它们之间有联系。当MPMoviePlayerController的'allowsAirPlay'属性设置为YES时,它会自动搜索其视图层次结构中的MPVolumeView,并在其上显示AirPlay按钮。因此,将MPVolumeView添加到自定义播放器视图中可以使AirPlay按钮在该视图上显示。

你不能使用自定义控制栏来显示Airplay按钮。唯一可以显示Airplay按钮的地方(不需要篡改苹果的代码)是使用标准控制栏。 - lostInTransit
希望通过5.0版本中AirPlay的更新来解决这个问题。 - Jesse Naugher
有人能回答一下“MPVolumeView和MPMoviePlayerController之间的关系是什么吗?”这部分吗? - spd
4个回答

10

因为 MPMoviePlayerController 仅允许您同时播放一个视频,所以 MediaPlayer 框架始终知道正在播放的视频。这就是 MPVolumeView 如何了解 MPMoviePlayerController 的原理。我没有官方文档,但我想这是嵌入到框架中的。

由于可能存在很多检查和平衡(而且他们喜欢一致的用户界面),因此苹果只允许您使用他们的 AirPlay 按钮/用户界面来利用这个功能。但是,您可以在任何地方放置该按钮:

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

我只是猜测了宽度和高度为40,40,我确定这不是正确的,但是一旦我把按钮放到位,它就无所谓了。


但是,这并没有回答我的问题。 - spd
2
你有两个问题:
如果我正在使用带有自定义控件的MPMoviePlayerController,如何在我的播放器UI上显示AirPlay按钮?
代码片段回答了这个问题。创建一个MPVolumeView实例,隐藏它的音量滑块,你就会得到Airplay按钮。设置它的框架并将其添加到视图中。这将在你的控件中放置一个完全功能的Airplay按钮。只有在范围内存在启用Airplay的设备时才会出现。[要更改外观]:https://dev59.com/NG025IYBdhLWcg3w6KSO#6988562
- devdavid
MPVolumeView和MPMoviePlayerController是如何相关联的?它们都属于MediaPlayer框架的一部分,因此当一个MPMoviePlayerController播放电影时,框架会“知道”它。由于MPVolumeView也在框架中,它也“知道”它。这就是为什么您不需要向Airplay按钮传递MPMoviePlayerController的任何引用 - 它已经知道了。 - devdavid
谢谢您的回复。我还有一个问题:在创建MPMoviePlayer Controller之前,是否有任何方法可以在我们的UI上显示Air Play按钮[只需创建MPVolumeView]。我认为这是不可能的,只是想确认一下... - spd
我没有测试过,所以不能确定,但我几乎可以肯定答案是否定的。但是,由于按钮无论如何都会失效(也就是说,它不会将任何东西连接到AirPlay,因为应用程序没有媒体播放),您可以轻松地使用AirPlay按钮图标创建一个UIButton,并将其放在您想要的任何位置。然而,在审核过程中,苹果可能会对此有问题。 - devdavid

2
for (UIButton *button in volumeView.subviews) {
if ([button isKindOfClass:[UIButton class]]) {
    [button setImage:[UIImage imageNamed:@"custom-route-button.png"] forState:UIControlStateNormal];
    [button sizeToFit];
}}

我认为这将有助于您。


这个解决方案有被苹果拒绝的风险。然而,目前它是唯一可用的解决方案。+1 - Till
@Till:由于此解决方案不使用任何私有API,因此苹果不会拒绝它。实际上,我们做类似的事情(自定义音量滑块),其他应用程序也这样做。如果苹果选择更改布局,使按钮不再是直接子视图,则代码将不再起作用,但不会造成任何损害。 - DarkDust
@DarkDust 使用非私有 API 方法并不能防止被拒绝。在明显不是苹果公司预期的情况下修改苹果标准控件也会增加这种风险。尽管如此,该解决方案目前仍未受到苹果公司的拒绝。 - Till

2

MPVolumeView有一个属性可以隐藏音量滑块并显示路由按钮,因此不需要遍历视图来隐藏元素。

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

AirPlay(路由)按钮的位置可能不是你所期望的,因此你可能需要稍微调整容器视图的框架来将它放在想要的位置。

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

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