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
'programing' 카테고리의 다른 글
요소 너비를 만드는 방법: 100% - 패딩? (0) | 2023.08.21 |
---|---|
파이썬처럼 자바스크립트로 된 사전이 있습니까? (0) | 2023.08.21 |
@Transactional은 어디에 두나요?인터페이스 사양 또는 구현 시? (0) | 2023.08.01 |
봄의 카프카 소비자 청취자 한 명이 여러 주제를 들을 수 있습니까? (0) | 2023.08.01 |
'instance로 보낸 인식되지 않는 선택기' 오류를 디버깅하려면 어떻게 해야 합니까? (0) | 2023.08.01 |