[英]AVPlayerLayer and 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首歌曲后會發生這種情況。
您有內存泄漏。 每次您使用alloc: init:
創建一個AVPlayer
並將其分配給audioPlayer
。 這使其保留計數為1。然后創建一個AVPlayerLayer
,它再次增加其保留計數。
稍后,您釋放avPlayerLayer
,它會減少audioPlayer
上的保留計數,但是它永遠不會回到零,因此永遠不會被釋放。
泄漏很嚴重,但是您也遇到了另一個問題。 iOS中的基礎架構限制為最多4個音頻/視頻渲染管道 。 創建第五個時,它無法獲取渲染管道,因此播放失敗。
要解決您的問題,請更正內存泄漏。
audioPlayer = [AVPlayer playerWithURL:[NSURL fileURLWithPath:fileName]];
使用playerWithURL:
靜態工廠構造函數將隱式執行autorelease:
減少該對象的保留計數並避免泄漏。
確實沒有理由僅為了更改輸入而創建新的AVPlayer和AVPlayerLayer實例。 您真正需要的只是一個新的AVPlayerItem。 將其分配給當前的AVPlayer,然后繼續使用現有的AVPlayerLayer。
通常,要自定義MPMovie播放器,最好將AVPlayerLayer與AVPlayer一起使用。
通過使用此自定義播放器,您可以根據需要自定義播放器控件(播放/暫停,后退,前進,停止和音量等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.