我正在尝试使用Mac OS X的DVDPlayback.framework
编写一个简单的DVD播放器。我可以在一个窗口中播放DVD,但最终我希望它作为全屏应用程序运行。
在播放DVD时,我很难添加子视图来显示媒体控件(暂停/播放,进度滑块滚动电影,更改章节等)。
似乎如果我在DVD框架使用的窗口内创建一个子视图(NSView
),它似乎总是落后于DVD内容,即使我告诉NSView
处于最顶层。
这是简化的代码,它只是试图在窗口区域内创建一个白色的子视图:
(我在10.6和10.7上尝试了相同结果的代码)。
const BOOL PLAY_DVD = YES;
@interface ControlsView : NSView {
}
@end
@implementation ControlsView
- (void)drawRect:(NSRect)rect {
[[NSColor whiteColor] set];
NSRectFill(rect);
}
@end
@implementation AppDelegate
@synthesize window = _window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSView *view = self.window.contentView;
if (PLAY_DVD) {
NSLog(@"%@ Playing DVD video", [self class]);
// Register error handler
OSStatus err;
err = DVDInitialize();
if (err != noErr) {
NSLog(@"DVDInitialise failed with error code %d", err);
[NSApp terminate:self];
}
// Set window to be the main window
err = DVDSetVideoWindowID([self.window windowNumber]);
// Set the display...
CGDirectDisplayID display = (CGDirectDisplayID) [[[[self.window screen] deviceDescription] valueForKey:@"NSScreenNumber"] intValue];
Boolean isSupported;
err = DVDSwitchToDisplay(display, &isSupported);
// Set video bounds
NSRect frame = [self.window frame];
CGRect rect = CGRectMake(0, 0, frame.size.width, frame.size.height);
err = DVDSetVideoCGBounds(&rect);
FSRef ref;
DVDOpenMediaFileWithURL([NSURL URLWithString:@"file:///Path/to/my/TestDVD/VIDEO_TS"]);
DVDOpenMediaFile(&ref);
DVDPlay();
}
// Attempt to add a subview to show the controls...
ControlsView *controls = [[ControlsView alloc] initWithFrame:NSMakeRect(20, 20, 100, 50)];
[view addSubview:controls positioned:NSWindowAbove relativeTo:nil];
}
@end
如果PLAY_DVD
NO
,则会正确呈现子视图(我可以创建其他子视图并显示排序正确)。
如果PLAY_DVD
YES
,则媒体会开始播放,但子视图永远不可见,因为它似乎总是落后于视频。
我能够找到的DVD播放的唯一例子是在第二个窗口中有控件,但对于全屏应用程序,我希望控件成为全屏视图的一部分并且褪色需要时进/出。
有谁知道如何做到最好?我的全屏控件是否必须位于一个单独的窗口中,该窗口漂浮在全屏窗口之上?我无法在同一个窗口中找到一个控件和DVD播放的例子。
提前感谢您的帮助!