2011-10-03 33 views
4

在我的應用程序中,我渲染從用戶照片中檢索的圖像生成的視頻。我已經建立了一個AVAssetwriter與AVAssetwriterInput AVAssetWriterInputPixelBufferAdaptor。我能夠將從用戶庫檢索到的ALAsset對象轉換爲CVPixelBuffers,並將它們添加到視頻中,然後視頻保存爲mp4。將所有圖像添加到視頻是在後臺線程上完成的,後臺線程每幀發送一個通知給主線程,因此可以更新該接口。所有這一切運作良好,我從應用程序中獲得一個可用的電影文件。當應用程序在渲染過程中進入背景時,AVAssetWriter失敗

現在我的問題是,當用戶進入另一個應用程序,再次變爲活動狀態後,ALAssetWriter的狀態更改爲「失敗」,我無法將其他圖像添加到電影文件中。首先,我想我可能不得不結束當前的作者會議,並重新開啓一個新的應用程序,一旦該應用程序再次變得活躍,但這似乎沒有幫助。

我只是想知道當我希望用戶輸入其他應用程序時的一般方法。如果渲染可以在後臺繼續,最好的解決方案是。我想我需要一個來自UIApplication的後臺線程。但現在我很高興,如果渲染可能會繼續恢復我的應用程序後繼續。

我現在不會發布任何代碼,因爲它確實很多,我的問題可能是概念性的。如果您需要查看代碼,我會發布它。

編輯1: 在iOS 4.3和iOS 5上測試過。我在其他應用程序(如iTimelapse)上看過背景渲染,但我不確定它們使用哪個框架。

編輯2: 我現在有一個蘋果devforum成員的信息,AVAssetWriter不能在後臺工作。那麼有沒有其他框架能夠渲染QuickTime視頻?

+0

當應用程序轉到後臺時,AVAssetWriter是否有可能失去與它正在寫入的文件的連接? – huesforalice

回答

4

原來,AVAssetWriter只是無法在應用暫停時存活。您可以通過請求後臺時間添加額外的10分鐘渲染時間,但之後AssetWriter將失敗。如果您在手機上使用某些服務,也會發生這種情況例如撥打或接聽電話將使AVAssetWriter失敗。

1

如果您的應用程序在後臺進行任何OpenGL調用,那麼這將解釋此行爲,看起來相當可能。從OpenGL ES Pragramming Guide

背景應用程序可能無法在圖形硬件

一個OpenGL ES應用被終止執行的命令,如果它試圖執行 的OpenGL ES上的圖形硬件的命令。這不僅涉及 當您的應用程序在後臺時調用OpenGL ES, 而且還涉及以前提交的尚未完成 的命令。阻止處理OpenGL ES命令的後臺應用程序 的主要原因是爲了使圖形處理器 完全可用於最前面的應用程序。最前面的應用應該總是給用戶帶來很好的體驗。 允許後臺應用程序佔用圖形處理器可能會阻止這種情況。您的應用程序必須確保在移入 背景之前先前提交的所有命令都已完成。

該文檔繼續枚舉進入後臺/前臺應用程序委託回調的一組準則。我認爲尋找一種不使用圖形硬件來渲染的方法會很棘手,而且允許mp4編碼的框架(如ffMpeg)主要是GPL/LGPL,所以如果要處理商業產品(LGPL意味着您需要小心可以動態鏈接到庫,而不是靜態的,這在iOS上是無用的),因爲許可證會傳播到您的代碼中。

+1

感謝您的想法。我也考慮過這種可能性,但應用程序實際上並未終止。只是當應用程序在後臺添加圖片緩衝區時,AVAssetWriters狀態會更改爲「失敗」。即使我停止「ApplicationWillEnterBackground」上的渲染進程並在返回時重新啓動它,該進程也會失敗。我不使用任何OpenGL ES調用,我不知道是否有任何AVFoundation或CoreVideo框架.. – huesforalice

+0

這可能是AV東西內置的保護措施,以防止進行OpenGL調用並檢查應用程序是否已進入後臺,如果它沒有完全殺死應用程序,則進入「失敗」狀態。我不明白爲什麼它會在應用重新輸入前景後再次失敗。你是否創建新的AV對象? (也許一旦失敗,他們無法擺脫這種狀態)。 – jbat100

+0

其實我不使用新的AV對象。當重新進入前景時,AssetWriter的狀態仍然可以。只有在前臺應用程序添加另一個像素緩衝區後,它纔會失敗。 – huesforalice

相關問題