2

libav (MSVC 用にビルドされた 2.7) を使用して、dshow を使用してカメラを開きます。

input_format = av_find_input_format("dshow");
avformat_open_input(format_context, "video=Integrated Camera", input_format, 0);

ビデオストリームを開くと、それはフォーマットの「生のビデオ」(その によるlong_name)ですAV_PIX_FMT_BGR24。フレームが必要なAV_PIX_FMT_RGB24ので、次のように SwsContext を作成します。

sws_context = sws_getContext(codec_context->width, codec_context->height, codec_context->pix_fmt, 
                             codec_context->width, codec_context->height, AV_PIX_FMT_RGB24,
                             SWS_BICUBIC, 0, 0, 0);
av_picture = new AVPicture();
avpicture_alloc(av_picture, AV_PIX_FMT_RGB24, codec_context->width, codec_context->height);

次に、ループ タイマーを使用してフレームを読み取り、AVFrame にデコードします。AVFrame は、sws_scale に渡されます。

while(av_read_frame(format_context, &packet) >= 0)
{
  if(packet.stream_index == stream_index)
  {
    av_frame = 0;
    av_frame = av_frame_alloc();

    avcodec_decode_video2(codec_context, av_frame, &frame_finished, &packet);
    if(frame_finished)
    {
      sws_scale(sws_context, (const uint8_t * const *)av_frame->data, av_frame->linesize,
                0, codec_context->height, av_picture->data, av_picture->linesize);
      av_free_packet(&packet);
      return;
    }
  }
  av_free_packet(&packet);
}

この時点の後av_picture、アプリケーションで使用しますが、sws_scaleハングしてクラッシュします。何も入っていないすべてのデータを見ると、 のラインサイズsws_scale除いて奇妙に見えます。(とは の予想どおり 0 です)。私のフレームの幅は 640 なので、1920 を期待しますが、負の符号は非常に奇妙に思えます。サインをひっくり返してみましたが、役に立ちません。毎回クラッシュするわけではないことに注意してください (一部の実行では、最初に数フレーム通過します)。av_frameav_frame->linesize[0] == -1920linesize[1]linesize[2]BGR24

ラインサイズが負になるのはなぜですか? それは何かを意味していますか、それともどういうわけか台無しにされていますか?

4

1 に答える 1