Extraer datos de un CMSampleBuffer para crear una copia profunda

Estoy tratando de crear una copia de un CMSampleBuffer devuelto por captureOutput en un AVCaptureVideoDataOutputSampleBufferDelegate.

Como los CMSampleBuffers provienen de un grupo preasignado de (15) buffers, si adjunto una referencia a ellos, no se pueden recuperar. Esto hace que se eliminen todos los marcos restantes.

Para mantener un rendimiento óptimo, algunas memorias intermedias de muestra hacen referencia directa a grupos de memoria que pueden necesitar ser reutilizados por el sistema del dispositivo y otras entradas de captura. Este suele ser el caso de la captura nativa del dispositivo sin comprimir, donde los bloques de memoria se copian lo menos posible. Si varias memorias intermedias de muestras hacen referencia a dichos grupos de memoria durante demasiado tiempo, las entradas ya no podrán copiar nuevas muestras en la memoria y esas muestras se descartarán.

Si su aplicación está causando que las muestras se caigan al retener los objetos CMSampleBufferRef proporcionados durante demasiado tiempo, pero necesita acceso a los datos de la muestra durante un largo período de tiempo, considere copiar los datos en un nuevo búfer y luego liberar el búfer de muestra (si fue retenido previamente) para que la memoria a la que hace referencia pueda reutilizarse.

Obviamente debo copiar el CMSampleBuffer pero CMSampleBufferCreateCopy () solo creará una copia superficial. Por lo tanto, concluyo que debo usar CMSampleBufferCreate (). Completé los 12! parámetros que el constructor necesita pero se topó con el problema de que mis CMSampleBuffers no contienen un bloqueador de bloques (no estoy completamente seguro de qué es eso, pero parece importante).

Esta pregunta se ha hecho varias veces pero no se ha respondido.

Copia profunda de CMImageBuffer o CVImageBuffer yCree una copia de CMSampleBuffer en Swift 2.0

Una posible respuesta es "Finalmente descubrí cómo usar esto para crear un clon profundo. Todos los métodos de copia reutilizaron los datos en el montón que bloqueaba el AVCaptureSession. Así que tuve que extraer los datos en un objeto NSMutableData y luego creó un nuevo buffer de muestra ".crédito a Rob en SO. Sin embargo, no sé cómo hacer esto correctamente.

Si estás interesado,esta es la salida deprint(sampleBuffer). No se menciona blockBuffer, también conocido como CMSampleBufferGetDataBuffer devuelve nil. Hay un imageBuffer, pero crear una "copia" usando CMSampleBufferCreateForImageBuffer tampoco parece liberar el CMSampleBuffer.

EDITAR: desde que se publicó esta pregunta, he intentado aún más formas de copiar la memoria.

Hice lo mismo que el usuarioKametrixom intentó.Esta es mi intento con la misma idea, primero copiar el CVPixelBuffer y luego usar CMSampleBufferCreateForImageBuffer para crear el búfer de muestra final. Sin embargo, esto da como resultado uno de dos errores:

Un EXC_BAD_ACCESS en la instrucción memcpy. También conocido como un defecto de intentar acceder fuera de la memoria de la aplicación.O bien, la memoria se copiará correctamente pero elCMSampleBufferCreateReadyWithImageBuffer() fallará con el código de resultado -12743 que "indica que el formato de los medios dados no coincide con la descripción de formato dada. Por ejemplo, una descripción de formato emparejada con un CVImageBuffer que falla CMVideoFormatDescriptionMatchesImageBuffer".

Puedes ver que tanto Kametrixom como yo usamosCMSampleBufferGetFormatDescription(sampleBuffer) para intentar copiar la descripción del formato del búfer de origen. Por lo tanto, no estoy seguro de por qué el formato de los medios dados no coincide con la descripción del formato dado.

Respuestas a la pregunta(4)

Su respuesta a la pregunta