2012-10-21 36 views
4

我正在一個應用程序,從磁盤中讀取的媒體數據,將其轉換成適當的像素格式,並然後轉到其關閉,以AVAssetWriter用於壓縮和寫入磁盤。我正在做自己的閱讀交錯,而不是使用AVAssetReader。我的閱讀器確保以串行方式呈現正好一幀的視頻數據和一幀的音頻數據。我遇到的問題是,如果我沒有在expectsMediaDataInRealTime屬性設置爲YES ,視頻資產作家總是恰好經過30幀返回NO爲isReadyForMoreMediaData。如果我在30幀之前停止寫入,它可以正常工作並且輸出文件有效。但是,如果將期望MediaInRealTime設置爲YES,則它可以在整個持續時間內完美工作,可以是幾千幀。開始expectsMediaDataInRealTime集的轉碼操作YES之後,我觀看了應用程序的內存使用量在壓縮很長視頻的過程中,而且沒有任何不合理的內存使用情況,也沒有任何內存泄漏。所產生的MOV文件似乎確實寫得相當正常,例如音頻數據就像人們期望的那樣與視頻數據交錯。AVFoundation的AVAssetWriterInput預期MediaDataRealTime屬性到底做了什麼?

那麼,爲什麼我會永遠設置expectsMediaDataInRealTime爲NO,如果沒有明顯的缺點,以將其設置爲YES?這隻適用於使用Apple API讀取數據(使用AVAssetReader)嗎?該文檔說,此屬性控制「在理想的交錯模式下爲存儲和回放效率編寫媒體數據」,但是當期望MediaInRealTime設置爲YES時,isReadyForMoreMediaData永遠不會返回NO,並且該文件看起來完美無缺。因此,如果AVAssetWriter可以在此屬性設置爲YES時執行此操作,爲什麼設置爲NO時無法執行此操作?來源完全一樣。

究竟什麼就這個屬性做的比「確保readyForMoreMediaData的值被適當地計算」(這意味着絕對沒有給我)其他?

回答

0

據我的理解,將期望MediaInRealTime設置爲YES意味着編碼器需要實時數據流供給,例如攝像頭等。在這種情況下,您將不斷向編碼器提供數據,isReadyForMoreMediaData會告訴您是否您可以將數據提供給編碼器。如果isReadyForMoreMediaData爲NO,則必須刪除當前樣本,並等待下一個樣本到達,然後再次檢查isReadyForMoreMediaData是否爲YES。另一方面,如果期望MediaInRealTime爲NO,則意味着編碼器不是實時來源,而是離線數據流,例如AVAssetReader。在這種情況下,因爲你可以自己控制流量的速度,因此,在isReadyForMoreMediaData是NO,你可以按住輸入和編碼器,等到isReadyForMoreMediaData變成YES(例如,使用一個無限循環睡覺,等待isReadyForMoreMediaData變化等)。

我假設的目的是讓內部機制嘗試儘可能對齊交錯音頻和視頻時間戳,因此,它不會讓播放器,解碼器預取方式獲取太多數據進行播放。這是數據源端數據完整性和播放端體驗之間的妥協。雖然,我想你可以一直使用expectMediaDataInRealTime爲YES,但是在isReadyForMoreMediaData == NO的情況下放棄提前饋送的樣本會更好。

相關問題