我正嘗試使用AVFoundation
來創建一個從文件播放視頻的應用程序。視頻顯示在一個視圖中,通過點擊父級表格中的一行來訪問。真正的應用程序將爲每一行都有一個視頻,但目前我只用一個進行測試。AVPlayer在多次播放後崩潰 -
在模擬器上運行時,應用程序可以正常運行,但是在設備上運行(在ios 5.1下)時,視頻播放正常約5次,然後以各種方式崩潰不可預知。 最常見的是,視頻加載視頻,但視頻本身不播放,但有時 coremedia.remote
我得到一個EXC_BAD_ACCESS
線程,抱怨沒有自動釋放池分配的對象。我添加了一個包裝啓動AVPlayer的代碼的@autoreleasepool
塊,但這似乎沒有幫助。
我想知道是否GCD在主隊列上創建多個線程來播放項目,但它們沒有終止。
因此,關鍵問題是 - 我怎麼清理多餘的GCD線程AVPlayer上 運行,如果用戶點擊視頻查看 後退按鈕儘可能我已經按照提供的示例代碼蘋果的AVFoundation
文檔here 我已經添加了一些日誌和(如上所述)@autoreleasepool
塊內的一個GCD塊 - 除了我沒有改變代碼。
的viewDidLoad
方法如下:
-(void)viewDidLoad{
[super viewDidLoad];
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"TestLapCar2Vid" withExtension:@"m4v"];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
NSString *tracksKey = @"tracks";
[asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] completionHandler:
^{
dispatch_async(dispatch_get_main_queue(),
^{
@autoreleasepool {
NSError *error = nil;
AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error];
if(status == AVKeyValueStatusLoaded){
avPlayerItem = [AVPlayerItem playerItemWithAsset:asset];
[avPlayerItem addObserver:self forKeyPath:@"status"
options:0 context:&ItemStatusContext];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification object:avPlayerItem];
avPlayer = [AVPlayer playerWithPlayerItem:avPlayerItem];
[videoView setPlayer:avPlayer];
NSLog(@"Asset loaded");
[avPlayer play];
}
else{
NSLog(@"The asset's tracks were not loaded");
}
}
});
}];
}
的viewWillDisappear
方法是:
-(void)viewWillDisappear:(BOOL)animated{
NSLog(@"view will disappear called");
[super viewWillDisappear:animated];
dispatch_async(dispatch_get_main_queue(),
^{
[avPlayer pause];
[avPlayerItem removeObserver:self forKeyPath:@"status"];
[[NSNotificationCenter defaultCenter]removeObserver:self];
NSLog(@"Race timeline nav controller has %d sub controllers",self.navigationController.childViewControllers.count);
avPlayerItem = nil;
avPlayer = nil;
videoView = nil;
dataStore = nil;
pkReader = nil;
receivedData = nil;
revDial = nil;
speedDial = nil;
mapView = nil;
throttle = nil;
NSLog(@"releasing stuff");
});
}
我一直在爲此而努力的最今天 - 任何幫助將感激地收到
thanx的要求! – headkit 2012-09-02 14:38:19