Ho un FFMPEG AVFrame
in YUVJ420P
e voglio convertirlo in un CVPixelBufferRef
con CVPixelBufferCreateWithBytes
. La ragione per cui voglio farlo è usare AVFoundation per mostrare/codificare i frame.Come convertire un AVFrame FFMPEG in YUVJ420P in AVFoundation cVPixelBufferRef?
Ho selezionato kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
e provato convertendolo in quanto l'AVFrame ha dati in tre piani Y480
Cb240
Cr240
. E secondo quello che ho cercato questo corrisponde allo kCVPixelFormatType
selezionato. Essendo biplanare ho bisogno di convertirlo in un buffer che contiene Y480
e CbCr480
Interlacciato.
ho cercato di creare un buffer di 2 piani:
frame->data[0]
sul primo piano,frame->data[1]
eframe->data[2]
interleaved sul secondo piano.
Tuttavia, sto ottenendo l'errore di ritorno -6661 (invalid a)
da CVPixelBufferCreateWithBytes
:
"Invalid function parameter. For example, out of range or the wrong type."
Non ho competenze in materia di elaborazione delle immagini a tutti, quindi tutti i puntatori a documentazione che può farmi iniziare a destra l'approccio a questo problema è apprezzato. Anche le mie capacità C non sono al vertice, quindi forse sto facendo un errore di base qui.
uint8_t **buffer = malloc(2*sizeof(int *));
buffer[0] = frame->data[0];
buffer[1] = malloc(frame->linesize[0]*sizeof(int));
for(int i = 0; i<frame->linesize[0]; i++){
if(i%2){
buffer[1][i]=frame->data[1][i/2];
}else{
buffer[1][i]=frame->data[2][i/2];
}
}
int ret = CVPixelBufferCreateWithBytes(NULL, frame->width, frame->height, kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, buffer, frame->linesize[0], NULL, 0, NULL, cvPixelBufferSample)
Il telaio è il AVFrame
con il rawData da FFMPEG decodifica.
È 'cvPixelBufferSample' a CVPixelBufferRef? In tal caso, l'ultimo parametro in 'CVPixelBufferCreateWithBytes()' dovrebbe essere '& cvPixelBufferSample' per consentire al puntatore del nuovo buffer di pixel di essere restituito per riferimento. –