나는 YUVJ420P
에 FFMPEG AVFrame
을 가지고 있는데 CVPixelBufferRef
으로 바꾸고 싶습니다. CVPixelBufferCreateWithBytes
으로 바꾸고 싶습니다. 그 이유는 AVFoundation을 사용하여 프레임을 표시/인코딩하는 것입니다. YUVJ420P의 FFMPEG AVFrame을 AVFoundation cVPixelBufferRef로 변환하는 방법은 무엇입니까?
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
선택하고 AVFrame 세 평면
Y480
Cb240
Cr240
의 데이터를 갖고 있기 때문에이를 변환 시도. 그리고 제가 조사한 바에 따르면이 선택은
kCVPixelFormatType
과 일치합니다. biplanar 됨으로써 나는 그것을
Y480
과
CbCr480
Interleaved를 포함하는 버퍼로 변환해야합니다.
는 I 2 개면과 버퍼를 만들려고 : 제 비행기
frame->data[0]
,frame->data[1]
frame->data[2]
및 인터리빙을 제 2 평면 상. 나에게 맞는에서 시작할 수 있습니다 문서에 대한 포인터"Invalid function parameter. For example, out of range or the wrong type."
내가 모든 이미지 처리에 대한 전문 지식이없는, 그래서 :
그러나, 나는 CVPixelBufferCreateWithBytes
에서 반환 오류 -6661 (invalid a)
받고 있어요 이 문제에 대한 접근 방식이 인정됩니다. 내 C 스킬이 라인의 상단도 아니므로 아마도 여기에서 기본적인 실수를 저지르고있을 것입니다.
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)
프레임은 원시 데이터 FFMPEG 디코딩에서 AVFrame
입니다.
'cvPixelBufferSample'은 CVPixelBufferRef입니까? 그렇다면'CVPixelBufferCreateWithBytes()'의 마지막 매개 변수는 대신 새로운 픽셀 버퍼에 대한 포인터가 참조에 의해 리턴 될 수 있도록'& cvPixelBufferSample'이 될 필요가 있습니다. –