2009-09-21 2 views
1

저는 코코아에서 다른 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, &currentFrame); 

을,하지만 pixe에 대한 kYUVSPixelformat와 일치 나던 : 코어 이미지와 함께 사용 내가 버퍼로, 그리고 이해로 YUV420 동의하지 않습니다.

아무리 작은 도움을 받아도 도움이 될 것입니다. :)

+0

AVFrame.data[3]까지 AVFrame.data[0]에서 데이터 블록을 읽을 것인가? –

답변

1

이것은 입력 프레임으로 아무것도 디코딩하지 않으므로 완전한 코드 샘플은 아닙니다. 그렇게한다면 올바른 것으로 보입니다.

출력 사진을 채울 필요가 없으며 AVFrame을 할당 할 수도 있습니다.

0

YUV420P는 평면 형식입니다. 따라서 AVFrame.data[0]은 전체 이야기가 아닙니다. 내가 평면 형식에 대한

int ret = CVPixelBufferCreateWithBytes(0, outWidth, outHeight, kYUVSPixelFormat, outFrame->data[0], outFrame->linesize[0], 0, 0, 0, &currentFrame); 

에서 실수를 참조하면 충돌 하나입니다 단계