2011-04-22 99 views
4

我正在開發用於iPhone的視頻應用程序。我正在錄製視頻並使用AssetsLibrary框架將其保存到iPhone Camera Roll。我使用的API是:將元數據寫入ALAsset

- (void)writeVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL 
    completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock 

有什麼方法可以使用ALAsset將視頻的自定義元數據保存到相機膠捲。如果使用AssetsLibrary框架這是不可能的,可以使用其他方法來完成。基本上我有興趣將我的應用程序的細節作爲視頻元數據的一部分寫入。

回答

0

有沒有官方支持的方式來做到這一點。

你可能做什麼:將你想要保存的信息存儲在一個單獨的數據庫中。然而,缺點是這些信息只能在您的應用中使用。

你究竟想完成什麼?

+0

從我的應用程序錄制的視頻被保存在相機膠捲。當我從相機膠捲獲取所有視頻時,我想識別從我的應用保存的視頻。如何才能做到這一點? – 2011-05-09 03:51:39

+0

您可以使用ALAssetRepresentation的url方法來標識資產。 – holtmann 2011-07-05 06:34:17

+0

每個資產的url都是唯一且持久的(根據Apple文檔)。但是我觀察到,當iPhone OS升級時,URL不是永久的。在將iPhone OS從4.2.1升級到4.3.2時,爲相同資產生成不同的網址。 – 2011-08-25 14:02:21

1

由於iOS 4+還有AVFoundation框架,它還允許您從視頻文件讀取/寫入元數據。只有特定的密鑰可用於使用此選項添加元數據,但我不認爲這會是一個問題。

這裏有一個小例子,你可以用一個標題添加到您的視頻(但是,在這個例子中所有舊的元數據被刪除):

// prepare metadata (add title "title") 
NSMutableArray *metadata = [NSMutableArray array]; 
AVMutableMetadataItem *mi = [AVMutableMetadataItem metadataItem]; 
mi.key = AVMetadataCommonKeyTitle; 
mi.keySpace = AVMetadataKeySpaceCommon; 
mi.value = @"title"; 
[metadata addObject:mi]; 

    // prepare video asset (SOME_URL can be an ALAsset url) 
AVURLAsset *videoAsset = [[AVURLAsset alloc] initWithURL:SOME_URL options:nil]; 

    // prepare to export, without transcoding if possible 
AVAssetExportSession *_videoExportSession = [[AVAssetExportSession alloc] initWithAsset:videoAsset presetName:AVAssetExportPresetPassthrough]; 
[videoAsset release]; 
_videoExportSession.outputURL = [NSURL fileURLWithPath:_outputPath]; 
_videoExportSession.outputFileType = AVFileTypeQuickTimeMovie; 
_videoExportSession.metadata = metadata; 
[_videoExportSession exportAsynchronouslyWithCompletionHandler:^{ 
    switch ([_videoExportSession status]) { 
     case AVAssetExportSessionStatusFailed: 
      NSLog(@"Export failed: %@", [[_videoExportSession error] localizedDescription]);     
     case AVAssetExportSessionStatusCancelled: 
      NSLog(@"Export canceled"); 
     default: 
      break; 
    } 
    [_videoExportSession release]; _videoExportSession = nil; 
    [self finishExport]; //in finishExport you can for example call writeVideoAtPathToSavedPhotosAlbum:completionBlock: to save the video from _videoExportSession.outputURL 
}]; 

這也顯示了一些例子:avmetadataeditor

0

您還可以設置在videoWriter的元數據,以便像=>

NSMutableArray *metadata = [NSMutableArray array]; 
AVMutableMetadataItem *mi = [AVMutableMetadataItem metadataItem]; 
mi.key = AVMetadataCommonKeyTitle; 
mi.keySpace = AVMetadataKeySpaceCommon; 
mi.value = @"title"; 
[metadata addObject:mi]; 

videoWriter.metadata = metadata; 

其中videoWriter的類型是AVAssetWriter的

,然後當你停止記錄你叫=>

[videoWriter endSessionAtSourceTime:CMTimeMake(durationInMs, 1000)]; 
[videoWriter finishWritingWithCompletionHandler:^() { 
    ALAssetsLibrary *assetsLib = [[ALAssetsLibrary alloc] init]; 
    [assetsLib writeVideoAtPathToSavedPhotosAlbum:videoUrl 
    completionBlock:^(NSURL* assetURL, NSError* error) { 
     if (error != nil) { 
      NSLog(@"Video not saved"); 
     } 
    }]; 
}];