Основы Core Media, понимание CMSampleBuffer, CMBlockBuffer и CMSampleBufferGetAudioBufferListWithRetainedBlockBufferIOS

Программируем под IOS
Ответить
Anonymous
 Основы Core Media, понимание CMSampleBuffer, CMBlockBuffer и CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer

Сообщение Anonymous »

Итак, я пытаюсь изучить основы Core Media, поскольку мне нужно обрабатывать образцы аудио в реальном времени в моем приложении. На данный момент я знаю, что мне нужно настроить AVCaptureSession, установив AVCaptureDevice, используемый для получения образцов, и AVCaptureDataOutput, который обрабатывает ввод с устройства и «уведомляет» AVCaptureAudioDataSampleBufferDelegate через метод captureOutput(...).
Теперь этот метод передает образцы как 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»