2012-05-01 3 views
0

Я создаю видеопроигрыватель в своем приложении с AVPlayerLayer и AVPlayer.AVPlayerLayer и AVPlayer

, когда новое видео выбрано я сделать этот метод:

//this to remove the current video 
    if (avPlayerLayer) { 
      [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:[audioPlayer currentItem]]; 
      [avPlayerLayer.player pause]; 
      [avPlayerLayer removeFromSuperlayer]; 
      avPlayerLayer = nil; 
    } 

//and this is to add a new one 
    audioPlayer = [[AVPlayer alloc]initWithURL:[NSURL fileURLWithPath:fileName]]; 
    avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:audioPlayer] retain]; 
    [avPlayerLayer setFrame:self.view.bounds]; 

    CGRect frame = avPlayerLayer.frame; 
    [avPlayerLayer setFrame:CGRectMake(frame.origin.x, frame.origin.y - 30, frame.size.width, frame.size.height)]; 

    [[self.view layer] addSublayer:avPlayerLayer]; 

    [audioPlayer play]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(finishPlayingSong) 
                name:AVPlayerItemDidPlayToEndTimeNotification 
                object:[audioPlayer currentItem]]; 
    [audioPlayer release]; 

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

Редактировать

Я заметил, что это произойдет после того, как я играю 5 песен.

+0

Почему вы используете уведомление, когда метод делегирования доступен для avplayer? попробуйте установить audioplayer.delegate = nil вместе с настройкой аудиоплеера на нуль и при инициализации нового игрока установите для себя делегат. –

+0

У AVPlayer есть методы делегирования? ты уверен? – MTA

+0

жаль, что это было мое замешательство, его AVAudioplayer, у которого есть метод делегатов. –

ответ

0

Нет причин создавать новые экземпляры AVPlayer и AVPlayerLayer только для изменения входных данных. Все, что вам действительно нужно, это новый AVPlayerItem. Назначьте его текущему AVPlayer и продолжайте использовать существующий AVPlayerLayer.

1

У вас есть утечка памяти. Каждый раз, когда вы создаете AVPlayer с alloc: init: и назначаете его audioPlayer. Это дает ему значение сохранения 1. Затем вы создаете AVPlayerLayer, который еще раз увеличивает счетчик удержания.

Позже вы освободите avPlayerLayer, который уменьшает количество удержаний на audioPlayer, но он никогда не возвращается к нулю и, следовательно, никогда не освобождается.

Утечки плохие, но вы столкнулись и с другой проблемой. В iOS есть инфраструктурный предел до a maximum of 4 audio/video render pipelines. Когда вы создаете пятый, он не может захватить конвейер рендеринга, и поэтому воспроизведение не выполняется.

Чтобы решить вашу проблему, исправьте утечку памяти.

audioPlayer = [AVPlayer playerWithURL:[NSURL fileURLWithPath:fileName]]; 

Использование playerWithURL: статический конструктор фабрики будет неявно выполнить autorelease:, декремент сохранить кол этого объекта и избежать утечки.

-1

Как правило, для настройки вашего MPMovie-плеера лучше использовать AVPlayerLayer с AVPlayer.

Используя этот индивидуальный плеер, вы можете настроить элементы управления проигрывателем (воспроизведение/пауза, обратное, вперед, остановка и громкость и т. Д.) По своему усмотрению.

Смежные вопросы