因此,我正在努力学习核心媒体的基础知识,因为我需要在我的应用程序中处理实时音频样本.现在,我知道我需要配置一个AVCaptureSession
设置,一个是用于获取样本的AVCaptureDevice
,一个是处理来自设备的输入并通过captureOutput(...)
方法"通知"AN AVCaptureAudioDataSampleBufferDelegate
的AVCaptureDataOutput
.
现在,这一个方法作为一个CMSampleBuffer
对象传递给样本,根据Apple的CM文档,它将包含零个或多个媒体(在我的例子中是音频)样本和一个CMBlockBuffer
,即
[.]表示数据偏移量的连续范围的CFType对象[...]跨越可能不连续的存储区域.
好的,这有点令人困惑.我不是以英语为母语的人,我很难理解这是什么意思.为什么我需要这个来访问我的样本?它们不是存储为原始二进制数据的数组(因此是同类的和连续的)吗?我猜这与Core Media如何管理底层内存有关,但我搞不清楚.
此外,最后一批样本通过这个CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer
方法访问,该方法需要一个指向AudioBufferList
的不安全可变指针和指向可选CMBlockBuffer
的一个指针.第一个将填充指向后者的指针,然后我可能(也可能不)能够通过myAudioBufferList.mBuffers.mData
访问样本,可能是nil
.
来自Apple开发人员的示例代码代码片段如下:
public func captureOutput(_ output: AVCaptureOutput,
didOutput sampleBuffer: CMSampleBuffer,
from connection: AVCaptureConnection) {
var audioBufferList = AudioBufferList()
var blockBuffer: CMBlockBuffer?
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
sampleBuffer,
bufferListSizeNeededOut: nil,
bufferListOut: &audioBufferList,
bufferListSize: MemoryLayout.stride(ofValue: audioBufferList),
blockBufferAllocator: nil,
blockBufferMemoryAllocator: nil,
flags: kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment,
blockBufferOut: &blockBuffer)
guard let data = audioBufferList.mBuffers.mData else {
return
}
}
这背后的内存模型(或管道)是什么?我真的很感谢你的帮助.