使用AVPlayer在OS X上播放全屏视频

时间:2014-07-07 10:47:39

标签: macos avfoundation avplayer

我想知道使用AVPlayer在Mac全屏播放视频的最佳方法是什么。

我试过这个,只有当我创建一个新的场景/ ViewController,附加一个AVPlayerView,然后在viewDidLoad中加载文件时它才有用。

    let url = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("wallaby", ofType:"m4v"))
    let videoPlayer = AVPlayer(URL: url)
    playerView.player = videoPlayer
    videoPlayer.play()

问题:

  • 此方法无法全屏显示
  • 我看不到全屏按钮

我能做的最好的就是提供一个全屏窗口:

self.view.frame.size = NSScreen.mainScreen().frame.size

感谢您提供有关示例代码的任何提示或指示!

3 个答案:

答案 0 :(得分:2)

AVPlayerView类包含showsFullScreenToggleButton属性。

答案 1 :(得分:2)

我也经历过AVPlayerView的这个问题。如果我按下这样启用全屏按钮:

self.playerView.showsFullScreenToggleButton = YES;

然后我点击全屏按钮,视频进入全屏,然而,该应用程序不接受任何键输入,你不能激活Mission Montrol,LaunchPad等。这是一个非常糟糕的用户体验,我相信如果您将这样的应用程序提交到Mac App Store,它将被拒绝。此外,我还试图让我的AVPlayerView成为第一个响应者但却无济于事。

解决方案

所以,我看了一下QuickTime Player如何在全屏播放视频方面工作。而且我注意到播放器控件上没有全屏按钮。它处理全屏的方式是当用户点击窗口的全屏控件时,它会重新调整大小,如果我是正确的AVPlayerView或Apple正在使用的。要实现与此类似的功能,请执行以下操作:

//The window that contains your AVPlayerView set the delegate
 [self.window setDelegate:self];


//So you can respond to these notifications

- (void)windowDidEnterFullScreen:(NSNotification *)notification{
        // wait a bit
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

                if (self.playerView.isReadyForDisplay == YES) {

        //Make sure the playerView is ready for display

        //Set the playerView to the screen's current frame (Very Important!)
         [self.playerView setFrame:[[NSScreen mainScreen] frame]];

        //Do other UI related things here e.g hide elements e.t.c

        }

        });
        }

- (void)windowWillExitFullScreen:(NSNotification *)notification{
//Do other UI related things here e.g show elements e.t.c

}

//If you have a ToolBar in your application do this:

- (NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions
{
    return (NSApplicationPresentationFullScreen |
            NSApplicationPresentationHideDock |
            NSApplicationPresentationAutoHideMenuBar |
            NSApplicationPresentationAutoHideToolbar);
}

// To determine if the window is in fullscreen e.g. if the application opened/restored in a fullscreen state the windowDidEnterFullScreen will not be called. So you need to do this:

- (BOOL) isFullScreenMode {
    NSApplicationPresentationOptions opts = [[NSApplication sharedApplication ] presentationOptions];
    if ( opts & NSApplicationPresentationFullScreen) {
        return YES;
    }
    return NO;
}

结论

我希望这能回答你的问题。此外,我认为这是Apple的一个错误,所以我明天会提交错误报告。

答案 2 :(得分:0)

我发现为什么全屏模式下的切换按钮不可点击,因为您可以探测到显示视图而不是窗口,例如您在按钮和视图之间使用storyboard segue,您应该将按钮链接到窗口(视图& #39;父母)。