Cocoa でさまざまな ffmpeg ライブラリを使用する方法を学習しようとしています。また、Core Video を使用してフレームを表示しようとしています。CVコールバックが機能するようになったようで、後でCore Imageで描画するCVImageBufferRefに入れようとするフレームを取得します。
問題は、PIX_FMT_YUYV422 を libswscale で動作させようとしているところですが、ピクセル形式を PIX_FMT_YUV420P 以外に変更するとすぐに、EXC_BAD_ACCESS でクラッシュします。
YUV420P を使用している限り、プログラムは実行されますが、正しく表示されません。ピクセル形式がサポートされていないのではないかと疑ったので、PIX_FMT_YUYV422 を試してみました。
以前に実行して、PIX_FMT_RGB24 で PPM ファイルを正常に書き込んだことがあります。なんらかの理由でクラッシュしてしまい、何が問題なのかわかりません。
私はここで少し頭を悩ませていますが、それが私が学ぶことを好む方法です. :)
AVFrames を割り当てる方法は次のとおりです。
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);
次に、次のように swscale で実行しようとします。
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);
最後に、Core Image で使用するピクセル バッファーに書き込もうとします。
int ret = CVPixelBufferCreateWithBytes(0, outWidth, outHeight, kYUVSPixelFormat, outFrame->data[0], outFrame->linesize[0], 0, 0, 0, ¤tFrame);
420P で実行されますが、ピクセル バッファーの kYUVSPixelformat と一致しません。また、YUV420 を受け入れないことも理解しています。
どんなに小さなことでも、私が苦労するのを助けるかもしれないので、私は本当に助けていただければ幸いです. :)