如何使用 AVAssetWriter 编写自定义 udta 原子?

How to write a custom udta atom with AVAssetWriter?

我在 iOS 9.3 SDK 上使用 AVAssetWriter 编写打包在 MP4 容器中的 AAC。很标准的东西。它运行良好。

但是,现在我需要添加一个包含在 udta 原子中的原子(在本例中称为 mine),所以我这样做了:

AVAssetWriter * writer =....  

NSData * valueData = [NSJSONSerialization dataWithJSONObject:obj options:0 error:nil];

AVMutableMetadataItem * item = [AVMutableMetadataItem metadataItem];  
item.keySpace = AVMetadataKeySpaceQuickTimeUserData; //udta  
item.key = @"mine";  
item.value = valueData;

writer.metadata = @[item];  

[writer startWriting];  
...  

最后,udta 原子根本没有出现在输出文件中。这里出了什么问题?

终于找到问题了。如果您在纯 MP4 (AVFileTypeMPEG4) 模式下创建资产编写器,那么自定义元数据似乎会悄无声息地掉在地上。解决方案是使用 QuickTime 容器文件类型:

AVAssetWriter * writer = [AVAssetWriter assetWriterWithURL:url fileType:AVFileTypeQuickTimeMovie error:nil];