저는 코코아에서 다른 ffmpeg 라이브러리를 사용하는 방법을 배우려고합니다. 코어 비디오의 도움으로 프레임을 표시하려고합니다. CV 콜백이 작동하는 것처럼 보입니다. 그리고 나중에 Core Image로 그릴 CVImageBufferRef에 넣으려고하는 프레임을 가져옵니다.libswscale에서 PIX_FMT_YUYV422 받기
문제는 libswscale에서 작동하도록 PIX_FMT_YUYV422를 얻으려고하고 있지만 픽셀 형식을 PIX_FMT_YUV420P가 아닌 다른 것으로 변경하자마자 EXC_BAD_ACCESS와 충돌합니다.
YUV420P를 사용하는 한 프로그램이 제대로 실행되지 않지만 프로그램이 실행됩니다. 픽셀 형식이 지원되지 않으므로 PIX_FMT_YUYV422를 사용하고 싶습니다.
저는 이전에 PIX_FMT_RGB24와 함께 PPM 파일을 작성하고 성공적으로 작성했습니다. 웬일인지 지금 그것은 단지 나에게 부서진다. 그리고 나는 틀린 무엇이 아닐지 모른다.
나는 여기에 내 머리를 조금 넘긴다. 그러나 그것이 내가 배우는 것을 선호하는 방법이다. 내가 지금처럼 swscale을 통해 그것을 실행하려고 그런
inFrame = avcodec_alloc_frame();
outFrame = avcodec_alloc_frame();
int frameBytes = avpicture_get_size(PIX_FMT_YUYV422, cdcCtx->width, cdcCtx->height);
uint8_t *frameBuffer = malloc(frameBytes);
avpicture_fill((AVPicture *)outFrame, frameBuffer, PIX_FMT_YUYV422, cdcCtx->width, cdcCtx->height);
: : : 여기
내가 AVFrames를 할당하는 방법은
static struct SwsContext *convertContext;
if (convertContext == NULL) {
int w = cdcCtx->width;
int h = cdcCtx->height;
convertContext = sws_getContext(w, h, cdcCtx->pix_fmt, outWidth, outHeight, PIX_FMT_YUYV422, SWS_BICUBIC, NULL, NULL, NULL);
if (convertContext == NULL) {
NSLog(@"Cannot initialize the conversion context!");
return NO;
}
}
sws_scale(convertContext, inFrame->data, inFrame->linesize, 0, outHeight, outFrame->data, outFrame->linesize);
을 마지막으로 나는의 픽셀 버퍼에 기록하려고 가 실행 420P로
int ret = CVPixelBufferCreateWithBytes(0, outWidth, outHeight, kYUVSPixelFormat, outFrame->data[0], outFrame->linesize[0], 0, 0, 0, ¤tFrame);
을,하지만 pixe에 대한 kYUVSPixelformat와 일치 나던 : 코어 이미지와 함께 사용 내가 버퍼로, 그리고 이해로 YUV420 동의하지 않습니다.
아무리 작은 도움을 받아도 도움이 될 것입니다. :)
AVFrame.data[3]
까지AVFrame.data[0]
에서 데이터 블록을 읽을 것인가? –