9

我有一个适用于 iPhone 的视频录制应用程序。我AVAssetWriter用于将录制的视频数据写入文件。我也有兴趣将自定义元数据嵌入到文件中。例如:我想将我的应用程序标识为视频的创建者。

因此,在创建资产编写器之后,我使用密钥将创建者值添加到AVMetadataCommonKeyCreator资产编写器的元数据中。

代码片段如下:

AVAssetWriter *assetWrtr = [[AVAssetWriter alloc] initWithURL:inURL fileType:AVFileTypeQuickTimeMovie error:&error];
self.assetWriter = assetWrtr;
[assetWrtr release];

NSArray *existingMetadataArray = self.assetWriter.metadata;
NSMutableArray *newMetadataArray = nil;
if (existingMetadataArray) 
{
    newMetadataArray = [existingMetadataArray mutableCopy]; // To prevent overriding of existing metadata
}
else 
{
    newMetadataArray = [[NSMutableArray alloc] init];
}

AVMutableMetadataItem *item = [[AVMutableMetadataItem alloc] init];
item.keySpace = AVMetadataKeySpaceCommon;
item.key = AVMetadataCommonKeyCreator;
item.value = @"My App";

[newMetadataArray addObject:item];
self.assetWriter.metadata = newMetadataArray;
[newMetadataArray release];
[item release];

录制完成后,我正在尝试使用 AVURLAsset 读取文件的内容。

NSURL *outputFileURL = [self.assetWriter outputURL];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:outputFileURL options:nil];
NSArray *keys = [NSArray arrayWithObject:@"commonMetadata"];

[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^(void) {

    NSError *error = nil;
    AVKeyValueStatus durationStatus = [asset statusOfValueForKey:@"commonMetadata" error:&error];
    switch (durationStatus) {
        case AVKeyValueStatusLoaded:
            NSLog(@"AVKeyValueStatusLoaded");
            NSLog(@"commonMetadata:%@", [asset commonMetadata]);
            break;
        case AVKeyValueStatusFailed:
            NSLog(@"AVKeyValueStatusFailed");
            break;
        case AVKeyValueStatusCancelled:
            NSLog(@"AVKeyValueStatusCancelled");
            break;
    }
}];

但是[asset commonMetadata]不返回任何AVMetadataItems. 它返回一个空数组。我可以设置其他元数据对象的值,例如AVMetadataCommonKeyTitle, AVMetadataCommonKeyModel, AVMetadataCommonKeySource。这些值被正确检索。问题仅在于AVMetadataCommonKeyCreator. 请让我知道这种行为的原因。是否无法为应用程序设置特定值AVMetadataCommonKeyCreator?这个键实际上代表什么?

4

2 回答 2

2

大约一年前我有同样的问题。当我使用 AVFoundation 编写音频文件时,我没有看到任何元数据。我认为 AVMetadataCommonKeyCreator 不起作用。我不能说现在,但确实如此。

我通过使用 C 库 taglib http://taglib.github.com解决了这个问题, 为 iOS 构建这个库真的很容易。我认为如果你不能编译它,你可以删除一些文件。

于 2012-10-27T20:03:55.060 回答
1

我还想确认AVMetadataCommonKeyCreator不会将其保存到视频资产的元数据中。我尝试过的其他(AVMetadataCommonKeyTitle,,AVMetadataCommonKeyDescription等)确实有效。我的基础 SDK 是 iOS 8.2。

创建者密钥有什么特别之处吗?苹果是否将其保留用于其他用途?是否有其他仅限于我们使用的键(或只是不起作用)?

(我没有足够的时间测试 23 个 AVMetadataCommonKeys 中的每一个..)

于 2015-03-24T18:11:55.243 回答