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_frame
av_frame->linesize[0] == -1920
linesize[1]
linesize[2]
BGR24
ラインサイズが負になるのはなぜですか? それは何かを意味していますか、それともどういうわけか台無しにされていますか?