2011-10-20 51 views
0

蘋果的相機應用程序似乎將視頻直接保存到相冊中。我想知道這種能力是否可以通過我們這些凡人的開發人員來實現。將視頻保存到PhotosAlbum很慢

我遇到並測試過的兩種方法都是將視頻文件複製到相冊中。文件越大,保存時間就越長。 2分鐘的創建時間可能會有所不同。我有兩個時間,分別是45秒和1分12秒,以複製大約150MB的文件。與Apple Camera應用程序大小相似的文件可能需要6秒鐘的時間。

我已經看過AVCam演示代碼,它使用了我已經測試的兩種方法之一。

ALAssetsLibrary實例方法writeVideoAtPathToSavedPhotosAlbum:completionBlock:

我使用AVFoundation連接到相機,並打開了一個流文件的UIKit功能UISaveVideoAtPathToSavedPhotosAlbum。對於上下文,以下是我打開該文件的位置。 movieURLPath是我的應用程序文檔目錄區域中的文件引用。

outputWriter = [AVAssetWriter assetWriterWithURL: [projectPaths movieURLPath] fileType: AVFileTypeQuickTimeMovie error: &error]; 

當通過停止記錄關閉文件時,我最終得到了這一行。

UISaveVideoAtPathToSavedPhotosAlbum ([projectPaths movieFilePath], self, @selector(video:didFinishSavingWithError: contextInfo:), nil); 

有沒有人有任何其他選擇來加快寫作過程?很明顯,我的首選是將movieURLPath指向PhotosAlbum中的文件。最好是在該文件夾中打開該文件,而這正是我認爲Apple所做的。

回答

0

我不知道如何相機應用程序的工作,但我知道我是如何修復我的應用程序相同的問題。

使用從2010年WWDC相同AVCam代碼示例中,AVCamCaptureManager下,你可以找到以下信息:

- (NSURL *) tempFileURL 
{ 
    return [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%@", NSTemporaryDirectory(), @"output.mov"]]; 
} 

我所做的就是將其更改爲類似如下:

- (NSURL *) tempFileURL 
{ 
    return [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%@", [NSHomeDirectory() stringByAppendingPathComponent: @"Documents"], @"output.mov"]]; 
} 

將所有相機輸出轉儲到應用程序文檔文件夾。現在我所需要做的就是錄製結束時將臨時文件重命名爲文檔文件夾中唯一的東西,這是一個非常快速的過程,不依賴於文件大小。

我給了用戶選擇將文件保存到庫中,但它仍然是一個非常漫長的過程。我無法使用ALAssetsLibrary找到更好的解決方案。很想聽聽有關真正有用的東西!

ps。如果你正在開發IO5,我相信蘋果因爲iCloud而徹底改變/取代了這個框架。

ps2。我真的相信Apple在相機應用程序上也做了同樣的事情,但是這個API不可用。

+0

爲保存的文件提供一個唯一的名稱很容易,但它並不能真正解決問題。正如我在上面的評論中提到的,我擔心如果用戶直接進入PhotosAlbum,用戶會認爲文件是MIA。我沒有提供本地保存文件的播放界面。 WTF!我無法在這個該死的編輯器中輸入新的段落。 –

+0

爲了簡化問題,您正試圖避免視頻文件的複製過程。不幸的是,在當前的ALAssetsLibrary API中,這是不可能的(根據我所知道和測試的)。同樣,這不適用於iOS 5. – EladG

+0

是的,我更喜歡直接在PhotosAlbum中打開文件路徑,或者像Unix mv命令。我不知道你爲什麼補充說'不適用於iOS 5'的評論。它的確如此。 –

0

運行,在後臺代碼(如洛根建議):

#define ASYNC(block) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block) 

ASYNC(^{ 
    // save to photo album 
});