将元数据写入ALAsset

时间:2011-04-22 08:40:18

标签: iphone video metadata alasset assetslibrary

我正在为iPhone开发视频应用。我正在录制视频并使用AssetsLibrary框架将其保存到iPhone相机胶卷。我使用的API是:

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

有没有办法使用ALAsset将视频的自定义元数据保存到相机胶卷。如果使用AssetsLibrary框架无法做到这一点,可以使用其他方法完成。基本上我有兴趣将有关我的应用程序的详细信息作为视频元数据的一部分。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

没有官方支持的方法来做到这一点。

您可能会执行的操作:将要保存的信息存储在单独的数据库中。然而,缺点是此类信息只能在您的应用中使用。

你到底想要完成什么?

答案 2 :(得分: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");
         }
     }];
 }];