2012-05-01 5 views
0

AVPlayerLayerAVPlayer으로 내 앱에 비디오 플레이어를 빌드합니다.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로 설정하고 audioplayer를 nil로 설정하고 새 플레이어를 초기화하는 동안 델리게이트를 self로 설정하십시오. –

+0

AVPlayer에 대리자 메소드가 있습니까? 확실합니까? – MTA

+0

미안하지만, 델리게이트 메서드가있는 AVAudioplayer는 혼란 스럽습니다. –

답변

0

입력을 변경하기 위해 새로운 AVPlayer 및 AVPlayerLayer 인스턴스를 만들 필요가 없습니다. 정말로 필요한 것은 새로운 AVPlayerItem뿐입니다. 현재 AVPlayer에 할당하고 기존 AVPlayerLayer를 계속 사용하십시오.

1

메모리 누출이 있습니다. alloc: init:으로 AVPlayer을 만들고 audioPlayer에 할당 할 때마다 이렇게하면 보유 수는 1이됩니다. 그런 다음 보유 수를 다시 증가시키는 AVPlayerLayer을 작성합니다.

나중에 avPlayerLayer을 해제하면 보유 수를 audioPlayer에 감소시키지 만 결코 0으로 되돌아 가지 않으므로 할당이 해제되지 않습니다.

누수가 좋지 않지만 다른 문제가 발생하고 있습니다. iOS의 인프라 제한은 a maximum of 4 audio/video render pipelines입니다. 다섯 번째를 만들면 렌더링 파이프 라인을 가져올 수 없으므로 재생이 실패합니다.

문제를 해결하려면 메모리 누수를 수정하십시오. 내재적 객체의 카운트를 감분 유지하고 누설을 방지 autorelease:을 수행 할 playerWithURL: 정적 factory 생성자를 사용

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

.

-1

일반적으로 MPMovie 플레이어를 사용자 지정하려면 AVPlayer가있는 AVPlayerLayer를 사용하는 것이 좋습니다.

이 맞춤식 플레이어를 사용하여 원하는대로 플레이어 컨트롤 (재생/일시 중지, 뒤로, 앞으로, 중지 및 볼륨 등)을 사용자 정의 할 수 있습니다.