我到處搜索,仍無法找到解決此問題的解決方案。我有一個AVQueuePlayer
我正在製作一個廣播應用程序。它一次排隊約20 AVPlayerItems
。我將AVPlayerItemDidPlayToEndTimeNotification
觀察員添加到這些項目中的每一個。通知被觸發並執行代碼以刪除關鍵觀察者的元數據和狀態,以便它不會崩潰並前進到隊列中的下一個項目。但它不想玩。沒有錯誤,狀態已準備就緒,AVPlayer
網址加載完美。如果我點擊按鈕來調用advancenextitem,它可以完美運行,並且可以完美播放。 現在最奇怪的是:如果我手動發佈通知,通知代碼完美工作。我會很感激任何幫助或意見,因爲我一直在努力做到這一點。AVPlayerItemDidPlayToEndTimeNotification僅在強制使用時才起作用
if (playlist != nil) {
playlistInterval = [playlist count]/4.0;
NSMutableArray *playerItems = [[NSMutableArray alloc] initWithCapacity:playlistInterval];
for(int i = 0; i < playlistInterval; i++) {
NSString *tempString = [playlist objectAtIndex:i];
//NSLog(@"%@", tempString);
NSURL *temp = [[NSURL alloc] initWithString:tempString];
AVPlayerItem *itemTemp = [AVPlayerItem playerItemWithURL:temp];
[itemTemp addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:nil];
[itemTemp addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(playerItemDidReachEnd:)
name: AVPlayerItemDidPlayToEndTimeNotification
object: itemTemp];
[playerItems addObject:itemTemp];
playlistCounter++;
}
qPlayer = [AVQueuePlayer queuePlayerWithItems:playerItems];
qPlayer.actionAtItemEnd = AVPlayerActionAtItemEndAdvance;
[ qPlayer addObserver:self
forKeyPath:@"rate"
options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
context:rateDidChangeKVO];
[qPlayer addObserver:self forKeyPath:@"currentItem.duration"
options:0
context:durationDidChangeKVO];
return YES;
}
return NO;
}
- (IBAction)advancePlayer:(id)sender {
unsigned long size = [[qPlayer items] count];
NSLog(@"%tu",size);
if (size <= 0) {
[self initializePlayerWithItems:currentKey];
[qPlayer play];
} else {
//NSLog(@"%@",[qPlayer currentItem]);
[[qPlayer currentItem] removeObserver:self forKeyPath:@"status"];
[[qPlayer currentItem] removeObserver:self forKeyPath:@"timedMetadata"];
[qPlayer advanceToNextItem];
[qPlayer play];
}
}
- (void)playerItemDidReachEnd:(NSNotification *)notification {
[self advancePlayer:nil];
NSLog(@"IT REACHED THE END");
}
現在,如果我把這一切從一個按鈕或什麼完美的作品:
[[NSNotificationCenter defaultCenter]
postNotificationName:@"AVPlayerItemDidPlayToEndTimeNotification"
object:[qPlayer currentItem]];
感謝您的回覆。我嘗試了兩種方法。事情是在兩種情況下發送通知。在手動發佈通知的情況下,一切都按照原樣進行。在項目實際結束時發送通知的情況下,它會執行代碼,但音頻不會播放。但是我可以在球員和球員資料中找到任何錯誤。讓所有事情順利進行的唯一方法是按下按鈕以前進播放器。 – 2015-03-03 02:04:07
「此通知可能發佈在與觀察者註冊的其他線程不同的線程上」我想知道在後臺線程中是否存在所有這些問題。 – 2015-03-03 02:18:51
我會嘗試在主線程上註冊觀察者。我應該只在主線程或所有代碼(advancePlayer,initializeplayeritems等)上註冊觀察者嗎? – 2015-03-03 02:37:53