我试图将一些XMP元数据附加到我使用QuickTime导出的AVAssetExportSession视频中。
AVFoundation确实支持编写元数据(AVMetadataItem),并且我成功地导出了简单的值,这些值随后可以使用出口工具进行检查
AVMutableMetadataItem *item = [AVMutableMetadataItem metadataItem];
item.identifier = [AVMetadataItem identifierForKey:AVMetadataCommonKeyTitle keySpace:AVMetadataKeySpaceCommon];
item.value = @"My Title";
exportSession.metadata = @[item];但我很难将我的AVMetadataItem配置为正确编码XMP。根据Adobe规范,QuickTime视频中的XMP应该位于moov / udta / XMP_原子之下,但我无法找到使用AVFoundation API或任何对应于元数据这一部分的键空间来生成分层元数据的方法。
我还需要将XMP元数据写入图像,而Image /O确实对此有直接支持(CGImageMetadataCreateFromXMPData),但在AVFoundation中找不到任何类似的东西。
如果不可能使用AVFoundation (或类似的),我可能会考虑集成XMP-Toolkit-SDK,但当AVFoundation似乎能够满足我的需要时,这感觉就像一个笨重的解决方案。
发布于 2020-09-14 12:56:38
在尝试了许多键/密钥空间和AVMetadataItem的其他属性之后,我终于想出了这一点。
XMP_键空间中使用自定义AVMetadataKeySpaceQuickTimeUserData键NSString,而是将其设置为包含有效载荷的UTF-8数据的NSData。dataType设置为原始数据这将导致XMP属性,这些属性可以按预期由exiftool读取。
NSString *payload =
@"<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"MyAppXMPLibrary\">"
"<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">"
"<rdf:Description rdf:about=\"\" xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\">"
"<xmp:CreatorTool>My App</xmp:CreatorTool>"
"</rdf:Description>"
"</rdf:RDF>"
"</x:xmpmeta>";
NSData *data = [payload dataUsingEncoding:kCFStringEncodingUTF8];
AVMutableMetadataItem *item = [AVMutableMetadataItem metadataItem];
item.identifier = [AVMetadataItem identifierForKey:@"XMP_"
keySpace:AVMetadataKeySpaceQuickTimeUserData];
item.dataType = (NSString *)kCMMetadataBaseDataType_RawData;
item.value = data;
exportSession.metadata = @[item];https://stackoverflow.com/questions/63837825
复制相似问题