programing

AV Player 대리자가 없습니까?노래가 재생되면 추적하는 방법은 무엇입니까?목표 아이폰 개발

firstcheck 2023. 8. 1. 21:51
반응형

AV Player 대리자가 없습니까?노래가 재생되면 추적하는 방법은 무엇입니까?목표 아이폰 개발

주위를 둘러보았지만 대리인 프로토콜을 찾을 수 없습니다.AVPlayer class.왜 그러고 있어?

하위 클래스를 사용하고 있습니다.AVQueuePlayer일련의 곡을 연주하다AVPlayerItems각각 URL에서 로드됩니다. 노래 재생이 끝나면 메소드를 호출할 수 있는 방법이 있습니까?특히 줄 끝에?

그리고 그것이 불가능하다면, 버퍼링 후에 노래가 재생되기 시작할 때 메소드를 부를 수 있는 방법이 있을까요?로드 아이콘을 가져오려고 하는데 음악이 시작되기 전에 아이콘이 꺼집니다. 음악이 시작된 후에도 마찬가지입니다.[audioPlayer play]액션.

예, AVPlayer 클래스에는 AVAudioPlayer와 같은 위임 프로토콜이 없습니다.AVPlayerItem에 대한 알림을 구독해야 합니다.그렇지 않으면 전달할 URL과 동일한 URL을 사용하여 AVPlayerItem을 생성할 수 있습니다.-initWithURL:AVPlayer에서.

-(void)startPlaybackForItemWithURL:(NSURL*)url {

    // First create an AVPlayerItem
    AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL:url];

    // Subscribe to the AVPlayerItem's DidPlayToEndTime notification.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];

    // Pass the AVPlayerItem to a new player
    AVPlayer* player = [[[AVPlayer alloc] initWithPlayerItem:playerItem] autorelease];

    // Begin playback
    [player play]

} 

-(void)itemDidFinishPlaying:(NSNotification *) notification {
    // Will be called when AVPlayer finishes playing playerItem
}

예. 플레이어의 상태 또는 속도에 KBO 관찰자를 추가합니다.

- (IBAction)go {
   self.player = .....
   self.player.actionAtItemEnd = AVPlayerActionStop;
   [self.player addObserver:self forKeyPath:@"rate" options:0 context:0]; 
}

- (void)stopped {
    ...
    [self.player removeObserver:self]; //assumes we are the only observer
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (context == 0) {
        if(player.rate==0.0) //stopped
            [self stopped];
    }
    else
        [super observeVal...];
}

기본적으로 그게 다입니다.

고지 사항:저는 그것을 여기에 써서 코드가 좋은지 확인하지 않았습니다.또한 저는 전에 AVPlayer를 사용해 본 적이 없지만 거의 맞을 것입니다.

스위프트 3 - 관찰자를 추가합니다.AVPlayerItem플레이어에 비디오를 추가할 때마다:

func playVideo(url: URL) {
  let playerItem = AVPlayerItem(asset: AVURLAsset(url: someVideoUrl))
  NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidPlayToEndTime), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem)
  self.player.replaceCurrentItem(with: playerItem)
  self.player.play()
}

func playerItemDidPlayToEndTime() {
  // load next video or something
}

Apple 문서 AV Foundation Programming Guide(AVFoundation 프로그래밍 가이드)에는 많은 정보가 있습니다(재생 모니터링 섹션 참조).주로 KBO를 통해 제공되는 것으로 보이므로 익숙하지 않은 경우 이를 복습하기를 원할 수 있습니다(Key Value Observing Programming Guide에 대한 가이드가 있습니다).

저는 이것을 사용하고 있고, 그것은 작동합니다.

_player = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:_playingAudio.url]];
CMTime endTime = CMTimeMakeWithSeconds(_playingAudio.duration, 1);
timeObserver = [_player addBoundaryTimeObserverForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:endTime]] queue:NULL usingBlock:^(void) {
    [_player removeTimeObserver:timeObserver];
    timeObserver = nil;
    //TODO play next sound
}];
[self play];

어디에_playingAudio몇 가지 속성을 가진 내 사용자 정의 클래스입니다.timeObserver이라id아이바의

언급URL : https://stackoverflow.com/questions/6837002/no-avplayer-delegate-how-to-track-when-song-finished-playing-objective-c-iphon

반응형