如何将AudioBuffer及UnsafeMutablePointer转换为Data/NSData?
嘿,这两个转换操作其实都挺 straightforward 的,我给你详细拆解一下:
1. 将UnsafeMutablePointer转换为Data
你已经拿到了u8ptr这个指针,接下来只需要补充内存块的字节长度(这个很关键,不然Data不知道要读取多少数据),就可以直接初始化Data了。
假设你已经通过buffer.mDataByteSize拿到了内存块的长度,代码示例如下:
let u8ptr: UnsafeMutablePointer<UInt8> = buffer.mData!.assumingMemoryBound(to: UInt8.self) let bufferSize = Int(buffer.mDataByteSize) // 替换成你的实际字节长度 let data = Data(bytes: u8ptr, count: bufferSize)
如果你想让Data直接接管原内存的所有权(避免手动管理内存),可以用bytesNoCopy初始化方法,但一定要注意内存管理规则,比如原buffer是否会自行释放内存:
// 仅当你确定原内存不需要其他地方管理时使用 let data = Data(bytesNoCopy: u8ptr, count: bufferSize, deallocator: .free) // 如果原内存由其他对象负责释放,用.none // let data = Data(bytesNoCopy: u8ptr, count: bufferSize, deallocator: .none)
2. 将AudioBuffer转换为Data/NSData
AudioBuffer本身就提供了mData(原始内存指针)和mDataByteSize(字节长度),转换起来更直接,完全不需要额外的指针绑定操作。
转成Data:
func convertAudioBufferToData(_ audioBuffer: AudioBuffer) -> Data? { guard let rawPtr = audioBuffer.mData else { return nil // 如果mData为空,返回nil避免崩溃 } return Data(bytes: rawPtr, count: Int(audioBuffer.mDataByteSize)) }
转成NSData:
因为Data和NSData可以无缝桥接,你可以直接把上面得到的Data转成NSData,也可以直接用NSData的初始化方法:
func convertAudioBufferToNSData(_ audioBuffer: AudioBuffer) -> NSData? { guard let rawPtr = audioBuffer.mData else { return nil } return NSData(bytes: rawPtr, length: Int(audioBuffer.mDataByteSize)) }
小提醒:
上面的方法都是拷贝原内存的数据,所以原AudioBuffer释放后,转换得到的Data/NSData依然是安全可用的。如果追求性能想避免拷贝,可以考虑用bytesNoCopy的方式,但一定要确保原内存的生命周期覆盖新数据的使用周期,防止野指针崩溃。
内容的提问来源于stack exchange,提问作者BXV
相关产品推荐
相关产品推荐

