我有一个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
设置应用特定值?这个键实际代表什么?
答案 0 :(得分:2)
一年前我遇到同样的问题。当我使用AVFoundation编写音频文件时,我没有看到任何元数据。我认为AVMetadataCommonKeyCreator不起作用。我现在不能说,但实际上是这样。
我使用C库taglib http://taglib.github.com解决了这个问题 为iOS构建这个库真的很容易。如果你不能编译它,我想你可以删除一些文件。
答案 1 :(得分:1)
我还要确认AVMetadataCommonKeyCreator
不会保存到视频资源的元数据中。我尝试的其他(AVMetadataCommonKeyTitle
,AVMetadataCommonKeyDescription
等)确实有用。我的基础SDK是iOS 8.2。
创作者密钥有什么特别之处吗? Apple是否将其保留用于其他用途?是否有其他密钥仅限于我们(或者只是不工作)?
(我没有足够的时间来测试23个AVMetadataCommonKeys中的每一个......)