I'm creating a simple menu-drive movie player and have run into a problem with AVPlayerLayer. The first time I attach a player with a movie the playback is fine. When a second movie is selected from the menu, I never receive a status of -[AVPlayerLayer readyForDisplay] set to true. If I ignore this status the player will play but I only get audio playback (no video). Investigating the status of the view and associated layers involved shows that the layer for the layer-backed (not hosted) view becomes nil after playing the first movie.
I have no idea how this is happening. I've included the relevant snippets below because I'm probably looking right at the problem and not seeing it. Hopefully someone out that has a little more experience with AVFoundation and can give me a clue. I'm using ARC. @interface JTVMovieViewController : NSViewController { AVPlayerLayer* __strong playerLayer; } @property (assign) IBOutlet id<JTVMoviewViewDelegate> delegate; @property (strong) IBOutlet NSButton* homeButton; @property (strong) IBOutlet NSView* playerView; - (void)awakeFromNib { playerLayer = [AVPlayerLayer layer]; playerLayer.frame = self.playerView.bounds; playerLayer.videoGravity = AVLayerVideoGravityResizeAspect; [playerLayer addObserver:self forKeyPath:kReadyForDisplayKey options:NSKeyValueObservingOptionNew context:KVOPlayerLayerContext]; [self.playerView.layer addSublayer:playerLayer]; } - (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context { if ( context == KVOMoviePlaylistContext ) { [self startPlayingNewPlayer:[self.moviePlaylist selection]]; } else if ( context == KVOPlayerLayerContext ) { NSLog(@"Player layer %@ ready for display.", playerLayer.readyForDisplay ? @"is" : @"is not"); if ( YES == playerLayer.readyForDisplay ) { [playerLayer.player play]; } } } - (void)startPlayingNewPlayer:(AVPlayer*)player { [playerLayer setPlayer:player]; if ( YES == playerLayer.readyForDisplay ) { [player play]; } [self.delegate controllerDidBeginVideoPlayback:self]; } - (void)stopPlayback { [[playerLayer player] pause]; [[playerLayer player] seekToTime:kCMTimeZero]; // reset player [playerLayer setPlayer:nil]; } (lldb) po [self playerView] (NSView *) $2 = 0x000000010bf83310 <NSView: 0x10bf83310> (lldb) po [[self playerView] layer] (id) $3 = 0x000000010bf833d0 <_NSViewBackingLayer:0x10bf833d0; position = CGPoint (0 0); bounds = CGRect (0 0; 1920 1080); delegate = <NSView: 0x10bf83310>; backgroundFilters = ( ); filters = ( ); shadowColor = (null); anchorPoint = CGPoint (0 0)> (lldb) po [[[self playerView] layer] sublayers] (id) $4 = 0x000000010bf88880 <CALayerArray 0x10bf88880>( <AVPlayerLayer:0x10bf84b50; position = CGPoint (960 540); bounds = CGRect (0 0; 1920 1080); > ) (lldb) c Process 96211 resuming 2011-12-29 08:35:33.421 JTVideoPlayer[96211:503] Player layer is ready for display. << here is where I stop playback from the UI> 2011-12-29 08:36:35.289 JTVideoPlayer[96211:503] Player layer is not ready for display. (lldb) po [self playerView] (NSView *) $13 = 0x000000010bf83310 <NSView: 0x10bf83310> (lldb) po [[self playerView] layer] (id) $14 = 0x0000000000000000 <nil> (lldb) po [playerLayer superlayer] (id) $15 = 0x0000000000000000 <nil> (lldb) -Michael _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com