Извлечение данных из CMSampleBuffer для создания глубокой копии

Я пытаюсь создать копию CMSampleBuffer, возвращенную captureOutput в AVCaptureVideoDataOutputSampleBufferDelegate.

Поскольку CMSampleBuffers поступают из предварительно выделенного пула (15) буферов, если я добавлю ссылку на них, они не могут быть восстановлены. Это приводит к удалению всех оставшихся кадров.

Для поддержания оптимальной производительности некоторые примеры буферов напрямую ссылаются на пулы памяти, которые могут потребоваться для повторного использования системой устройства и другими входами захвата. Это часто имеет место для несжатого захвата устройства, когда блоки памяти копируются как можно меньше. Если несколько буферов семплов ссылаются на такие пулы памяти слишком долго, входные данные больше не смогут копировать новые семплы в память, и эти семплы будут отброшены.

Если ваше приложение вызывает отбрасывание сэмплов, слишком долго сохраняя предоставленные объекты CMSampleBufferRef, но ему требуется доступ к данным сэмпла в течение длительного периода времени, рассмотрите возможность копирования данных в новый буфер и последующего освобождения буфера сэмпла (если он был ранее сохранен), так что память, на которую он ссылается, может быть повторно использована.

Очевидно, что я должен скопировать CMSampleBuffer, но CMSampleBufferCreateCopy () создаст только поверхностную копию. Таким образом, я пришел к выводу, что я должен использовать CMSampleBufferCreate (). Я заполнил 12! параметры, которые нужны конструктору, но столкнулись с проблемой, что мои CMSampleBuffers не содержат blockBuffer (не совсем уверен, что это такое, но это кажется важным).

Этот вопрос задавался несколько раз, но не получил ответа.

Глубокая копия CMImageBuffer или CVImageBuffer а такжеСоздайте копию CMSampleBuffer в Swift 2.0

Один из возможных ответов: «Я наконец-то понял, как использовать это для создания глубокого клона. Все методы копирования повторно использовали данные в куче, которая хранилась, блокировали AVCaptureSession. Поэтому мне пришлось извлечь данные в объект NSMutableData, а затем создал новый образец буфера. "кредит Роба на SO, Однако я не знаю, как сделать это правильно.

Если ты заинтересован,этот это выходprint(sampleBuffer), Нет никакого упоминания о blockBuffer, иначе CMSampleBufferGetDataBuffer возвращает ноль. Существует imageBuffer, но создание «копии» с помощью CMSampleBufferCreateForImageBuffer, похоже, также не освобождает CMSampleBuffer.

РЕДАКТИРОВАТЬ: так как этот вопрос был опубликован, я пытался еще больше способов копирования памяти.

Я сделал то же самое, что пользовательKametrixom пытался.это моя попытка использовать ту же идею: сначала скопировать CVPixelBuffer, а затем использовать CMSampleBufferCreateForImageBuffer для создания буфера окончательного примера. Однако это приводит к одной из двух ошибок:

EXC_BAD_ACCESS в инструкции memcpy. AKA - это ошибка от попытки доступа за пределы памяти приложения.Или память будет успешно скопирована, ноCMSampleBufferCreateReadyWithImageBuffer() произойдет сбой с кодом результата -12743, который «Указывает, что формат данного носителя не соответствует данному описанию формата. Например, описание формата в сочетании с CVImageBuffer, который завершается ошибкой CMVideoFormatDescriptionMatchesImageBuffer.»

Вы можете видеть, что и Kametrixom, и я использовалиCMSampleBufferGetFormatDescription(sampleBuffer) попытаться скопировать описание формата исходного буфера. Таким образом, я не уверен, почему формат данного носителя не соответствует данному описанию формата.

Ответы на вопрос(4)

Ваш ответ на вопрос