1

私はWindowsMediaFoundationを使用して、Webカメラをいじっています。ウェブカメラからデータサンプルを正常に取得し、形式がRGB24であることを確認できました。ここで、1つのフレームをビットマップとして保存したいと思います。ウェブカメラからサンプルを読み取るために使用しているコードの小さなスニペットを以下に示します。

IMFSample *pSample = NULL;

hr = pReader->ReadSample(
   MF_SOURCE_READER_ANY_STREAM,    // Stream index.
   0,                              // Flags.
   &streamIndex,                   // Receives the actual stream index. 
   &flags,                         // Receives status flags.
   &llTimeStamp,                   // Receives the time stamp.
   &pSample                        // Receives the sample or NULL.
 );

では、pSampleにIMFSampleを設定したら、それをビットマップとして保存するにはどうすればよいですか?

4

1 に答える 1

1

以下は、IMFSampleからビットマップを保存するために使用したコードスニペットです。私はたくさんのショートカットを取りましたが、私のウェブカメラはデフォルトでRGB24ストリームと640 x 480ピクセルのバッファを返すようになっているので、この方法でしかうまくいかないと確信しています。 pDataで心配してください。

   hr = pReader->ReadSample(
    MF_SOURCE_READER_ANY_STREAM,    // Stream index.
    0,                              // Flags.
    &streamIndex,                   // Receives the actual stream index. 
    &flags,                         // Receives status flags.
    &llTimeStamp,                   // Receives the time stamp.
    &pSample                        // Receives the sample or NULL.
    );

wprintf(L"Stream %d (%I64d)\n", streamIndex, llTimeStamp);

HANDLE file;
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER fileInfo;
DWORD write = 0;

file = CreateFile(L"sample.bmp",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);  //Sets up the new bmp to be written to

fileHeader.bfType = 19778;                                                                    //Sets our type to BM or bmp
fileHeader.bfSize = sizeof(fileHeader.bfOffBits) + sizeof(RGBTRIPLE);                                                //Sets the size equal to the size of the header struct
fileHeader.bfReserved1 = 0;                                                                    //sets the reserves to 0
fileHeader.bfReserved2 = 0;
fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);                    //Sets offbits equal to the size of file and info header

fileInfo.biSize = sizeof(BITMAPINFOHEADER);
fileInfo.biWidth = 640;
fileInfo.biHeight = 480;
fileInfo.biPlanes = 1;
fileInfo.biBitCount = 24;
fileInfo.biCompression = BI_RGB;
fileInfo.biSizeImage = 640 * 480 * (24/8);
fileInfo.biXPelsPerMeter = 2400;
fileInfo.biYPelsPerMeter = 2400;
fileInfo.biClrImportant = 0;
fileInfo.biClrUsed = 0;

WriteFile(file,&fileHeader,sizeof(fileHeader),&write,NULL);
WriteFile(file,&fileInfo,sizeof(fileInfo),&write,NULL);

IMFMediaBuffer *mediaBuffer = NULL;
    BYTE *pData = NULL;

pSample->ConvertToContiguousBuffer(&mediaBuffer);

hr = mediaBuffer->Lock(&pData, NULL, NULL);

WriteFile(file, pData, fileInfo.biSizeImage, &write, NULL);

CloseHandle(file);

mediaBuffer->Unlock();

ここに少し議論を入れました。

于 2012-04-19T11:10:24.043 に答える