Как отсоединить AVPlayerLayer от AVPlayer?

Я пытаюсь воспроизвести видео в фоновом режиме. Я следовал стольким учебникам, но не получил соответствующих результатов. Для этого я использую AVPlayer. Я следую этому URL-адресу, по которому я могу воспроизводить свое видео, когда состояние приложения активно. Но я хочу воспроизводить музыку в фоновом режиме, для этого мне нужно отсоединить AVPlayerLayer от AVPlayer. Но всякий раз, когда я хочу получить доступ к avPlayerLayer в фоновом режиме, он возвращает NULL. Пожалуйста, помогите мне.

Это мой код:

- (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];
 }

person Ashish Tiwari    schedule 08.09.2014    source источник


Ответы (1)


Это поздний ответ, но я надеюсь, что пример из моего собственного кода будет полезен (этот код находится в пользовательском подклассе 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 следует вызывать из AppDelegate в методе applicationDidEnterBackground. Используйте NSNotificationCenter (мое предложение).

reattachLayerToPlayer следует (вероятно) использовать, когда пользователь снова сможет увидеть ваше приложение. Так что вызывайте это из applicationWillEnterForeground...

ПРИМЕЧАНИЕ. Если ваше приложение отображается, когда пользователь дважды нажимает на главном экране, проигрыватель НЕ будет привязан к слою в это время, пока пользователь не выберет ваше приложение. Одним из возможных обходных путей является использование снимка экрана игрока в качестве заполнителя перед вводом фона.

person Mark Zgaljic    schedule 13.02.2015