線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1380
推到 Plurk!
推到 Facebook!

關於 SampleGrabberCallback 的問題

缺席
poaivy
中階會員


發表:40
回覆:78
積分:53
註冊:2004-08-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-09 01:13:02 IP:128.95.xxx.xxx 未訂閱
各位大大 當我在使用該函式的時候 發現每次存檔都會變成事32b的格式 附上SampleGrabberCallback .h
extern AM_MEDIA_TYPE g_StillMediaType;
class SampleGrabberCallback : public ISampleGrabberCB
{
public:
    // Fake referance counting.
    STDMETHODIMP_(ULONG) AddRef() { return 1; }
    STDMETHODIMP_(ULONG) Release() { return 2; }        STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject)
    {
        if (NULL == ppvObject) return E_POINTER;
        if (riid == __uuidof(IUnknown))
        {
            *ppvObject = static_cast(this);
             return S_OK;
        }
        if (riid == __uuidof(ISampleGrabberCB))
        {
            *ppvObject = static_cast(this);
             return S_OK;
        }
        return E_NOTIMPL;
    }        STDMETHODIMP SampleCB(double Time, IMediaSample *pSample)
    {
        return E_NOTIMPL;
    }        STDMETHODIMP BufferCB(double Time, BYTE *pBuffer, long BufferLen)
    {
        if ((g_StillMediaType.majortype != MEDIATYPE_Video) ||
            (g_StillMediaType.formattype != FORMAT_VideoInfo) ||
            (g_StillMediaType.cbFormat < sizeof(VIDEOINFOHEADER)) ||
            (g_StillMediaType.pbFormat == NULL))
        {
            return VFW_E_INVALIDMEDIATYPE;
        }
       
        HANDLE hf = CreateFile("c.bmp", GENERIC_WRITE,
          FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);
        if (hf == INVALID_HANDLE_VALUE)
        {
            return E_FAIL;
        }            long cbBitmapInfoSize = g_StillMediaType.cbFormat - SIZE_PREHEADER;
        VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)g_StillMediaType.pbFormat;                    // 建立 BMP 檔頭
        BITMAPFILEHEADER bfh;
        ZeroMemory(&bfh, sizeof(bfh));
        bfh.bfType = 'BM';  // Little-endian for "MB".
        bfh.bfSize = sizeof( bfh )   BufferLen   cbBitmapInfoSize;
        bfh.bfOffBits = sizeof( BITMAPFILEHEADER )   cbBitmapInfoSize;
        
        // 寫入標頭檔
        DWORD dwWritten = 0;
        WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );                    // 寫入 該 Frame 相關的 Bitmap Infomation Header
                // HEADER 傳回 Video Header 中的 BITMAPINFOHEADER 位址
        WriteFile(hf, HEADER(pVideoHeader), cbBitmapInfoSize, &dwWritten, NULL);                    // 寫入 frame 資料
     
        WriteFile( hf, pBuffer, BufferLen, &dwWritten, NULL );
        CloseHandle( hf );
        return S_OK;        }
};
然而我在進入CALLBACK之前有先看過 if(g_StillMediaType.subtype==MEDIASUBTYPE_RGB8){ShowMessage("RGB8");} 但是當進入SampleGrabberCallback後再查詢一次就變成RGB32了@@ 有無辦法可以改存也是存成RGB8的形式呢?
系統時間:2024-04-30 0:43:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!