1

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, &currentFrame);

420P で実行されますが、ピクセル バッファーの kYUVSPixelformat と一致しません。また、YUV420 を受け入れないことも理解しています。

どんなに小さなことでも、私が苦労するのを助けるかもしれないので、私は本当に助けていただければ幸いです. :)

4

2 に答える 2

1

入力フレームに何もデコードしないため、これは確かに完全なコード サンプルではありません。あなたがそうするなら、それは正しいように見えます。

また、実際には、出力画像を塗りつぶしたり、AVFrame を割り当てたりする必要さえありません。

于 2009-11-04T00:16:47.657 に答える
0

YUV420P は平面フォーマットです。したがって、AVFrame.data[0]すべての話ではありません。私は間違いを見ます

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

平面フォーマットの場合、データ ブロックを からAVFrame.data[0]まで読み取る必要があります。AVFrame.data[3]

于 2010-06-15T21:22:51.387 に答える