2014-01-15 68 views
4

我做了以下內容:重新加載密鑰時狀態AVKeyValueStatusFailed

  • 創建一個新的AVAsset與給定的URL。該URL指向遠程Web服務器上的視頻。
  • 嘗試通過調用loadValuesAsynchronouslyForKeys:completionHandler:
  • 初始請求失敗,我注意到,請求失敗致電statusOfValueForKey:error:
  • 加載tracks屬性,因爲沒有互聯網連接的存在
  • 然後我等待連接,重新出現(使用一些可達性代碼)。一旦它發生,我再次撥打loadValuesAsynchronouslyForKeys:completionHandler:

以下是問題出現的地方。我會想象,AVAsset繼續並嘗試重新加載軌道屬性,因爲它以前失敗。但是,這似乎並沒有發生。 statusOfValueForKey:error:仍然會返回AVKeyValueStatusFailed,儘管有效的互聯網連接可用且視頻可播放。

有沒有辦法重置這個給定屬性的狀態並嘗試另一個負載?有其他解決方法嗎?

+0

只是一種可能性,你試過'cancelLoading'後失敗了嗎? – Peres

+0

你在檢查每個鍵嗎?每個鍵都有自己的狀態,並隨機出現(不是真的,但這是它如何感覺時間上的明智),而不是全部在同一時間。視頻流的第一條規則是它比它看起來更奇怪 – Michael

回答

2
  1. 你正在創建一個新的AVURLAsset或只是重複使用前一個?
  2. loadValuesAsynchronouslyForKeys:completionHandler:的完成處理程序中,您是否將調度回主線程?

如果您在準備重試時再次調用此方法(或類似方法)會發生什麼情況。

- (void)setContentURL:(NSURL *)contentURL 
{ 
    if (_contentURL != contentURL) { 
     _contentURL = contentURL; 

     AVURLAsset *asset = [AVURLAsset URLAssetWithURL:_contentURL options:nil]; 

     NSArray *requestedKeys = [NSArray arrayWithObjects:ISIVideoPlayerControllerTracksKey, ISIVideoPlayerControllerPlayableKey, nil]; 

     [asset loadValuesAsynchronouslyForKeys:requestedKeys completionHandler: ^{ 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [self prepareToPlayAsset:asset withKeys:requestedKeys]; 
      }); 
     }]; 
    } 
} 
+0

我正在重複使用相同的AVURLAsset。我正在派遣回主隊列,是的。 – mplappert

+0

重試重新創建AVURLAsset,基本上從頭開始。我認爲在失敗後還有一些狀態。只要您未傳入AVURLAssetPreferPreciseDurationAndTimingKey選項,創建資產應該很快。 – Jesse