AVAssetWriter追加HDR元数据报错-12743,求排查元数据拷贝问题
解决方案
报错-12743对应AVAssetWriterErrorCodeInvalidPixelBufferAttributes,核心问题是kCVImageBufferAmbientViewingEnvironmentKey的附加数据格式不符合要求。
禁止直接转成NSData/CFData:该key要求的附加值必须是符合特定结构的CFDictionary,而非序列化后的plist二进制数据。你从
CMFormatDescription.Extensions.Value获取的propertyListRepresentation是序列化后的结果,这不符合AVAssetWriter的格式要求。正确提取与附加方式:直接将环境数据转换为
CFDictionary后附加,跳过序列化步骤:
if let ambientEnv = sampleBuffer.formatDescription?.extensions[.ambientViewingEnvironment] as? CFDictionary { CVBufferSetAttachment(dstPixelBuffer, kCVImageBufferAmbientViewingEnvironmentKey, ambientEnv, .shouldPropagate) }
- 拷贝附件的修正逻辑:如果直接拷贝源缓冲区的附件,需先判断附件类型:
- 若源附件是序列化后的CFData,需先反序列化为CFDictionary再附加
- 若源附件本身就是CFDictionary,可直接附加
var attachmentMode: CVAttachmentMode = .shouldPropagate if let attachment = CVBufferCopyAttachment(sourcePixelBuffer!, kCVImageBufferAmbientViewingEnvironmentKey, &attachmentMode) { if let data = attachment as? CFData, let ambientDict = try? PropertyListSerialization.propertyList(from: data as Data, options: [], format: nil) as? CFDictionary { CVBufferSetAttachment(dstPixelBuffer, kCVImageBufferAmbientViewingEnvironmentKey, ambientDict, attachmentMode) } else if let ambientDict = attachment as? CFDictionary { CVBufferSetAttachment(dstPixelBuffer, kCVImageBufferAmbientViewingEnvironmentKey, ambientDict, attachmentMode) } }
AVAssetWriter对HDR元数据的格式要求严格,必须传递原始字典结构,这是解决报错的关键。
内容的提问来源于stack exchange,提问作者Deepak Sharma
相关产品推荐
相关产品推荐

