MPVolumeView Airplay仅在镜像

时间:2017-09-02 03:04:05

标签: ios swift controls airplay mpvolumeview

我使用自定义AVPlayerLayer来显示简单视频。我正在尝试添加airplay支持,但点按时按钮不会显示任何内容。

self.player.allowsExternalPlayback = true
...
let airplayButton = MPVolumeView(frame: self.airplayButtonPlaceholder!.bounds)
airplayButton.showsRouteButton = true
airplayButton.showsVolumeSlider = false

self.airplayButtonPlaceholder?.addSubview(airplayButton)
self.airplayButtonPlaceholder?.backgroundColor = UIColor.clear

当我运行我的代码(在真实设备上)时,我看到了按钮,但当我点击它时,没有任何反应。可能是什么导致了这个?是因为我使用自定义AVPlayerLayerAVPlayer

修改

当我打开通过控制中心的镜像时,我可以触摸按钮并显示弹出窗口。发生了什么事?

1 个答案:

答案 0 :(得分:1)

没有任何事情发生,因为你没有正确配置这个“新窗口”。

使用Airplay可以通过两种方式显示内容。

<强>镜像

不需要任何配置。

  

注意:您无需执行任何操作即可进行镜像。在iOS中   5.0及更高版本,镜像 - 即在主机设备和外部显示器上显示相同的内容 - 默认情况下发生   用户选择AirPlay视频输出设备。

额外窗口

check apple guide here

apple描述的步骤是:

  1. 在应用启动时,检查是否存在外接显示器并注册屏幕连接和断开连接通知。
  2. 当外部显示器可用时 - 无论是在应用程序启动时还是在您的应用程序运行时 - 为其创建并配置窗口。
  3. 将窗口与相应的屏幕对象相关联,显示第二个窗口,并正常更新。
  4. 以下是从苹果文档中获取的代码,以供快速参考。

    - 如果外部显示器已存在,则创建一个新窗口

    - (void)checkForExistingScreenAndInitializeIfPresent
    {
        if ([[UIScreen screens] count] > 1)
        {
            // Get the screen object that represents the external display.
            UIScreen *secondScreen = [[UIScreen screens] objectAtIndex:1];
            // Get the screen's bounds so that you can create a window of the correct size.
            CGRect screenBounds = secondScreen.bounds;
    
            self.secondWindow = [[UIWindow alloc] initWithFrame:screenBounds];
            self.secondWindow.screen = secondScreen;
    
            // Set up initial content to display...
            // Show the window.
            self.secondWindow.hidden = NO;
        }
    }
    

    - 注册连接和断开连接通知

    - (void)setUpScreenConnectionNotificationHandlers
    {
        NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    
        [center addObserver:self selector:@selector(handleScreenDidConnectNotification:)
                name:UIScreenDidConnectNotification object:nil];
        [center addObserver:self selector:@selector(handleScreenDidDisconnectNotification:)
                name:UIScreenDidDisconnectNotification object:nil];
    }
    

    - 处理连接和断开连接通知

    - (void)handleScreenDidConnectNotification:(NSNotification*)aNotification
    {
        UIScreen *newScreen = [aNotification object];
        CGRect screenBounds = newScreen.bounds;
    
        if (!self.secondWindow)
        {
            self.secondWindow = [[UIWindow alloc] initWithFrame:screenBounds];
            self.secondWindow.screen = newScreen;
    
            // Set the initial UI for the window.
        }
    }
    
    - (void)handleScreenDidDisconnectNotification:(NSNotification*)aNotification
    {
        if (self.secondWindow)
        {
            // Hide and then delete the window.
            self.secondWindow.hidden = YES;
            self.secondWindow = nil;
    
        }
    
    }
    

    修改

    使用AVPlayerViewController时,它已按文档here中所述自动实现。

      

    AVPlayerViewController自动支持AirPlay,但您需要   在它可以之前执行一些项目和音频会话配置   在您的应用程序中启用。