2011-05-19 54 views
2

很長一段時間的讀者,第一次提問者...AVURLAsset長的聲音在iPod

我提出它採用AVAssetReader從iTunes資料庫中讀取MP3數據的音樂應用程序。我需要精確的定時,所以,當我創建AVURLAsset,我使用了「AVURLAssetPreferPreciseDurationAndTimingKey」來提取定時數據。這具有一些開銷(和我沒有任何問題,當我不使用它,但我需要它!)

每一件事情上工作精細iphone 4和ipad(1)。我希望它能用於我的iPod touch(第二代)。但它不會:如果聲音文件太長(>〜7分鐘),那麼AVAssetReader將無法開始讀取並引發錯誤(AVFoundationErrorDomain錯誤-11800。)

看起來我正在撞牆的iPod touch的掃描儀資源。任何想法發生了什麼,或者如何管理創建AVURLAsset,以便它可以處理長文件的開銷? (我試圖與性能工具運行這一點,我沒有看到在內存中的一大穗)。

謝謝,丹

回答

2

也許你開始讀太兒子?據我理解,支持MP3,它需要走線槽整個文件,以使精確計時。所以,試着延遲閱讀。 您也可以嘗試註冊爲一些AVAsset性質的觀察員。 iOS 4.3具有「可讀」屬性。我從來沒有嘗試過,但我的猜測是它的初始設置爲NO,並且一旦AVAsset完成加載,它將被設置爲YES。

編輯: 其實,只是看了看文檔。你應該使用AVAsynchronousKeyValueLoading協議爲蘋果提供了一個示例

NSURL *url = <#A URL that identifies an audiovisual asset such as a movie file#>; 
AVURLAsset *anAsset = [[AVURLAsset alloc] initWithURL:url options:nil]; 
NSArray *keys = [NSArray arrayWithObject:@"duration"]; 

[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^() { 

    NSError *error = nil; 
    AVKeyValueStatus durationStatus = [asset statusOfValueForKey:@"duration" error:&error]; 
    switch (durationStatus) { 
     case AVKeyValueStatusLoaded: 
      [self updateUserInterfaceForDuration]; 
      break; 
     case AVKeyValueStatusFailed: 
      [self reportError:error forAsset:asset]; 
      break; 
     case AVKeyValueStatusCancelled: 
      // Do whatever is appropriate for cancelation. 
      break; 
    } 
}]; 

如果「持續時間」將不利於試圖「可讀」(但就像我之前「可讀」提到需要4.3)。也許這會解決你的問題。

+0

嗨,亞歷克斯,謝謝!我一直在使用「loadValuesAsynchronouslyForKeys」協議,但我一直在使用「軌道」鍵而不是「持續時間」。看起來,在「持續時間」上運行它確實將開銷時間查找工作轉移到異步線程,而不是在[AVAssetReader startReading]上執行此項工作。大! – danI 2011-05-19 19:13:19

相關問題