如何使用 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];
我在 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];