Теперь этот метод передает образцы как CMSampleBuffer, который, согласно документации Apple CM, будет содержать ноль или более образцов мультимедиа (в моем случае аудио) и CMBlockBuffer, то есть
[...] объект CFType, который представляет собой непрерывный диапазон смещений данных [...] в возможно несмежной области памяти.
ОК. Итак, это так. как-то сбивает с толку. Я не носитель языка и изо всех сил пытаюсь понять, что это значит. Зачем мне это нужно для доступа к моим образцам? Разве они не хранятся как массив необработанных двоичных данных (поэтому однородный и непрерывный)? Я предполагаю, что это связано с тем, как Core Media управляет базовой памятью, но я не могу этого понять.
Кроме того, доступ к последней партии семплов осуществляется через этот метод CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer, который ожидает небезопасный изменяемый указатель на AudioBufferList и один на необязательный CMBlockBuffer. Первый будет заполнен указателями на второй, и тогда я смогу (или не смогу) получить доступ к сэмплам через myAudioBufferList.mBuffers.mData, который может быть нулевым.
Пример кода из фрагментов кода разработчиков 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
}
}
Подробнее здесь: https://stackoverflow.com/questions/757 ... amplebuffe
Мобильная версия