You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:50:53