2014-09-08 5 views
0

백그라운드에서 비디오를 재생하려고합니다. 많은 튜토리얼을 따라 왔지만 적절한 결과를 얻지 못했습니다. AVPlayer를 사용하고 있습니다.이 URL을 통해 응용 프로그램 상태가 재생 될 때마다 내 비디오를 재생할 수 있습니다. 하지만 배경에서 avPlayerLayer를 분리해야합니다. 배경에서 avPlayerLayer에 액세스하려고 할 때마다 NULL이 반환됩니다. 도와주세요. AVPlayer에서 AVPlayerLayer를 분리하는 방법은 무엇입니까?

내 코드입니다 :이 늦은 답변입니다

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
[self becomeFirstResponder]; 

[[AVAudioSession sharedInstance] setDelegate: self]; 
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
[[AVAudioSession sharedInstance] setActive: YES error: nil]; 

NSURL *url = [[NSBundle mainBundle] URLForResource:@"sample" 

            withExtension:@"m4v" 

             subdirectory:nil]; 
avPlayerItem = [AVPlayerItem playerItemWithURL:url]; 
self.songPlayer = [AVPlayer playerWithPlayerItem:avPlayerItem]; 


self.avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer: self.songPlayer]; 

self.avPlayerLayer.frame = self.view.layer.bounds; 
UIView *newView = [[UIView alloc] initWithFrame:self.view.bounds]; 
[newView.layer addSublayer:avPlayerLayer]; 
[self.view addSubview:newView]; 

[ self.songPlayer play]; 


// Do any additional setup after loading the view, typically from a nib. 
} 

iewController *vc=[[ViewController alloc]init]; 
NSLog(@"%@",vc.avPlayerLayer); 
vc.avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:nil]; 
} 



- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    ViewController *vc=[[ViewController alloc]init]; 
    vc.avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:vc.songPlayer]; 
} 

답변

0

하지만 난 내 자신의 코드에서 예제가 도움이 희망 (이 코드는 사용자 정의 UIView 하위에, 나는 표시하고보기 내 플레이어).

요약 : UIView 객체에서 레이어를 가져 와서 하위 클래스로 만든 다음 AVPlayerLayer에 캐스트를 적용합니다. 그리고 나서 기본 제공 메서드를 사용하는 것처럼 간단합니다. .

- (void)removeLayerFromPlayer 
{ 
    AVPlayerLayer *playerLayer = (AVPlayerLayer *)[self layer]; 
    [playerLayer setPlayer:nil]; 
} 

- (void)reattachLayerToPlayer 
{ 
    AVPlayerLayer *playerLayer = (AVPlayerLayer *)[self layer]; 
    [playerLayer setPlayer:**your AVPlayer object here**]; 
} 

일반적 removeLayerFromPlayer 방법은 applicationDidEnterBackground :와 방법에서 AppDelegate에에서 호출되어야한다. NSNotificationCenter를 사용하십시오 (저의 제안).

reattachLayerToPlayer는 사용자가 앱을 다시 볼 수있을 때 사용해야합니다 (아마). applicationWillEnterForeground에서 호출하십시오 ...

참고 : 사용자가 홈 화면에서 두 번 탭했을 때 앱이 표시되면 사용자가 앱을 선택할 때까지는 플레이어가 현재 레이어에 연결되지 않습니다. 한 가지 가능한 해결 방법은 배경을 입력하기 전에 플레이어의 스크린 샷을 자리 표시 자로 사용하는 것입니다.

관련 문제