5

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

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

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

4

3 回答 3

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

于 2012-06-15T09:49:16.817 回答
0

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

你可以做什么:将你想要保存的信息存储在一个单独的数据库中。然而,缺点是此类信息仅在您的应用程序中可用。

你到底想完成什么?

于 2011-05-08T07:50:14.560 回答
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");
         }
     }];
 }];
于 2014-06-16T18:57:01.053 回答