青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 67  文章 - 171  trackbacks - 0
<2013年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(10)

隨筆分類

隨筆檔案

連接資料

最新隨筆

搜索

  •  

最新隨筆

最新評論

哎呀 今天借了王明的 程序員成長攻略一書,發現里頭好多錯誤的。 不過自己還是看出了 后來看看網上的 哎呀別人寫的好多了。就轉下來把!



 

3.2使用視頻捕獲

3.2.1創建捕獲窗體

 

下面的例子通過使用capCreateCaptureWindow函數來創建一個捕獲窗體

hWndC = capCreateCaptureWindow (

    (LPSTR) "My Capture Window",       // 如果是Pop-up窗口的窗口名稱

    WS_CHILD | WS_VISIBLE,          // 窗口類型

    0, 0, 160, 120,                      // 窗口位置和尺寸

    (HWND) hwndParent,

    (int) nID /* child ID */);

 

 

 

3.2.2連接到一個捕獲驅動器

 

下面舉例,如何通過捕獲窗口的句柄hWndC連接到MS VIDEO驅動程序上,同時還演示了如何斷開連接。使用capDriverDisconnect

fOK = SendMessage (hWndC, WM_CAP_DRIVER_CONNECT, 0, 0L);

// 或者使用宏連接:

 

 

// fOK = capDriverConnect(hWndC, 0);

 

 

 

 

 

// 關閉連接

capDriverDisconnect (hWndC);

 

 

 

3.2.3列舉安裝的捕獲驅動程序

 

使用capGetDriverDescription 函數來獲得系統已經安裝的所有捕獲驅動程序的名稱和版本。

char szDeviceName[80];

char szDeviceVersion[80];

for (wIndex = 0; wIndex < 10; wIndex++)

{

    if (capGetDriverDescription (wIndex, szDeviceName,

        sizeof (szDeviceName), szDeviceVersion,

        sizeof (szDeviceVersion))

    {

        // 加入名字到一個已經安裝的設備列表中

 

 

        // 讓用戶選擇一個使用。

    }

}

 

 

 

 

 

 

3.2.4獲得捕獲驅動器的性能參數

 

       WM_CAP_DRIVER_GET_CAPS消息可以返回捕獲驅動程序以及其硬件的性能參數。這些信息存放在一個CAPDRIVERCAPS的數據結構中。當你的應用程序的捕獲窗口連接到一個新的捕獲驅動器后,都會刷新這個CAPDRIVERCAPS數據結構。下面將使用capDriverGetCaps宏來獲得捕獲設備的性能參數。

CAPDRIVERCAPS CapDrvCaps;

SendMessage (hWndC, WM_CAP_DRIVER_GET_CAPS,

    sizeof (CAPDRIVERCAPS), (LONG) (LPVOID) &CapDrvCaps);

// 或者,使用宏來獲得驅動器的新能參數

 

 

// capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS));

 

 

 

 

 

3.2.5獲得捕獲窗口狀態(Status)

 

下面例子使用SetWindowPos函數區設置捕獲窗口的尺寸,這個尺寸的大小是基于輸入的視頻流大小的。輸入視頻流的尺寸大小由capGetStatus宏來獲得,獲得信息放在一個CAPSTATUS的數據結構體中。

 

 

 

CAPSTATUS CapStatus;

capGetStatus(hWndC, &CapStatus, sizeof (CAPSTATUS));

SetWindowPos(hWndC, NULL, 0, 0, CapStatus.uiImageWidth,

             CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);

3.2.6顯示對話框區設置視頻屬性

 

       每個捕獲驅動器都可以提高3個以上的不同對話框來控制數字視頻的特性和捕獲處理。下面的例子示范如何顯示這些對話框。在顯示每個對話框前,該例會調用capDriverGetCaps宏并且檢查返回的CAPDRIVERCAPS對象來查看是否可以能夠顯示特定的對話框。

 

 

 

CAPDRIVERCAPS CapDrvCaps;

capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS)); 

// 視頻源對話框

 

 

if (CapDriverCaps.fHasDlgVideoSource)

    capDlgVideoSource(hWndC); 

// 視頻格式對話框

 

 

if (CapDriverCaps.fHasDlgVideoFormat)

{

    capDlgVideoFormat(hWndC);

   // 是否由新的圖像尺寸?Are there new image dimensions?

 

 

    capGetStatus(hWndC, &CapStatus, sizeof (CAPSTATUS));

   // 如果有,發送通知給父窗口,告訴它尺寸改變了

 

 

// 視頻顯示對話框

 

 

if (CapDriverCaps.fHasDlgVideoDisplay)

    capDlgVideoDisplay(hWndC);

 

 

 

3.2.7獲得和設定視頻格式

 

BITMAPINFO數據結構體可以實現長度可調節地去適應標準壓縮的數據格式。因為它的長度可以變,所以在每次獲得當前視頻格式前,都必須去查詢這個結構的長度以及分配的內存大小。該例子使用了capGetVideoFormatSize宏去獲得緩存區大小,使用capGetVideoFormat宏區獲得當前視頻格式。

 

 

 

LPBITMAPINFO lpbi;

DWORD dwSize;

 

 

 

dwSize = capGetVideoFormatSize(hWndC);

lpbi = GlobalAllocPtr (GHND, dwSize);

capGetVideoFormat(hWndC, lpbi, dwSize);

 

 

 

// 訪問視頻格式,并且釋放分配的內存。

 

 

 

 

 

應用程序使用capSetVideoFormat(WM_CAP_SET_VIDEOFORMAT),把一個BITMAPINFO結構發送給捕獲窗口,顯示修改。因為視頻格式由設備指定的,你的應用程序可以去檢查獲得的返回值,來知道這個視頻格式是不是公開的。

 

 

 

3.2.8預覽視頻

       下面使用capPreviewRate宏來設置預覽模式的幀頻率為66毫秒/幀,使用capPreview宏在捕獲窗口預覽圖像。

 

 

 

capPreviewRate(hWndC, 66);      // 速度,微秒

 

 

capPreview(hWndC, TRUE);       // 開始預覽

 

 

 

 

 

capPreview(hWnd, FALSE);        // 屏蔽預覽

 

 

 

3.2.9允許視頻覆蓋(Overlay)

 

下面使用capDriverGetCaps宏去檢測這個捕獲驅動是否支持覆蓋(Overlay)模式,如果支持,就允許視頻覆蓋模式;

 

 

 

CAPDRIVERCAPS CapDrvCaps;

capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS));

if (CapDrvCaps.fHasOverlay)

    capOverlay(hWndC, TRUE);

 

 

 

 

3.2.10捕獲文件命名

 

    下例使用capFileSetCaptureFile宏來指定一個要命名的文件名(mycap.avi),使用capFileAlloc宏去預分配5MB的文件。

 

 

 

char szCaptureFile[] = "MYCAP.AVI";

capFileSetCaptureFile( hWndC, szCaptureFile);

capFileAlloc( hWndC, (1024L * 1024L * 5));

 

3.2.11格式化音頻捕獲

 

下例使用capSetAudioFormat來設置音頻格式為11-KHz PCM 8-bit,立體聲。

 

 

 

WAVEFORMATEX wfex;

wfex.wFormatTag = WAVE_FORMAT_PCM;

wfex.nChannels = 2;                     // 使用立體聲

wfex.nSamplesPerSec = 11025;

wfex.nAvgBytesPerSec = 22050;

wfex.nBlockAlign = 2;

wfex.wBitsPerSample = 8;

wfex.cbSize = 0;

capSetAudioFormat(hWndC, &wfex, sizeof(WAVEFORMATEX));

 

 

 

3.2.12改變視頻捕獲設置

 

       下例使用capCaptureGetSetupcapCaptureSetSetup宏來改變捕獲速度,從默認值(15/)10/秒。

 

 

 

CAPTUREPARMS CaptureParms;

float FramesPerSec = 10.0;

capCaptureGetSetup(hWndC, &CaptureParms, sizeof(CAPTUREPARMS));

CaptureParms.dwRequestMicroSecPerFrame = (DWORD) (1.0e6 /

    FramesPerSec);

capCaptureSetSetup(hWndC, &CaptureParms, sizeof (CAPTUREPARMS));

 

 

 

3.2.13捕獲數據

 

       下例使用capCaptureSequence宏開始視頻捕獲,使用capFileSaveAs宏從捕獲文件拷貝數據到其他文件NEWFILE.AVI中。

 

 

 

char szNewName[] = "NEWFILE.AVI";

// Set up the capture operation.

capCaptureSequence(hWndC);

// Capture.

capFileSaveAs(hWndC, szNewName);

 

 

 

3.2.14加入信息塊

 

如果你想添加其他信息(除了音視頻),你可以建一個信息塊并把它們插入到一個捕獲文件中去。信息塊可以包含這個方面的內容。比如版權信息,視頻源的ID,外部顯示的時間信息。下面的例子保存外部時間信息SMPTE()到一個信息塊中,并加入使用capFileSetInfoChunk宏加入到捕獲文件中。

 

 

 

// This example assumes the application controls

 

 

// the video source for preroll and postroll.

CAPINFOCHUNK cic;

// .

// .

// .

cic.fccInfoID = infotypeSMPTE_TIME;

cic.lpData = "00:20:30:12";

cic.cbData = strlen (cic.lpData) + 1;

capFileSetInfoChunk (hwndC, &cic);

 

 

 

3.2.15在程序中加入回調函數

應用程序可以注冊捕獲窗口的回調函數,這樣就可以把下面的情況通知給應用程序:

l         狀態變化了

l         錯誤發生了

l         視頻和音頻的緩沖區的數據可以使用了

l         在捕獲期間,應用程序將yield

下面的例子將創建一個捕獲窗口并在應用的消息循環中,注狀態、錯誤、視頻流、幀的回調函數。

 

 

 

case WM_CREATE:

{

    char    achDeviceName[80] ;

    char    achDeviceVersion[100] ;

    char    achBuffer[100] ;

    WORD    wDriverCount = 0 ;

    WORD    wIndex ;

    WORD    wError ;

    HMENU   hMenu ;

 

    // 使用capCreateCaptureWindow宏創建一個捕獲窗體.

 

 

    ghWndCap = capCreateCaptureWindow((LPSTR)"Capture Window",

        WS_CHILD | WS_VISIBLE, 0, 0, 160, 120, (HWND) hWnd, (int) 0);

 

    // 使用capSetCallbackOnError宏注冊錯誤回調函數

 

 

     capSetCallbackOnError(ghWndCap, fpErrorCallback);

 

    // 使用capSetCallbackOnStatus宏注冊狀態回調函數

 

 

    capSetCallbackOnStatus(ghWndCap, fpStatusCallback);

 

    //使用capSetCallbackOnVideoStream宏注冊視頻流回調函數

    capSetCallbackOnVideoStream(ghWndCap, fpVideoCallback);

 

    //使用capSetCallbackOnFrame宏注冊幀回調函數

    capSetCallbackOnFrame(ghWndCap, fpFrameCallback);

 

    // 連接到一個捕獲驅動器上

 

 

 

 

 

    break;

}

case WM_CLOSE:

{

//使用capSetCallbackOnFrame宏關閉幀回調函數

// 類似可調用其他存在的回調函數。

 

 

 

 

 

    capSetCallbackOnFrame(hWndC, NULL);

 break;

}

 

 

 

 

 

 

 

3.2.16創建一個狀態回調函數

 

下面的例子是一個簡單的狀態回調函數,使用capSetCallbackOnStatus宏來注冊這個回調函數。

// StatusCallbackProc: 狀態回調函數

 

 

// hWnd:            捕獲窗體句柄

 

 

// nID:              當前狀態的狀態碼

 

 

// lpStatusText:       當前狀態的文本字符

//

LRESULT PASCAL StatusCallbackProc(HWND hWnd, int nID,

    LPSTR lpStatusText)

{

    if (!ghWndMain)

        return FALSE;

 

    if (nID == 0) {           // 清除舊的狀態信息

        SetWindowText(ghWndMain, (LPSTR) gachAppName);

        return (LRESULT) TRUE;

    }

    // 顯示狀態ID和狀態文本..

 

 

    wsprintf(gachBuffer, "Status# %d: %s", nID, lpStatusText);

 

    SetWindowText(ghWndMain, (LPSTR)gachBuffer);

    return (LRESULT) TRUE;

}

 

3.2.17創建一個錯誤的回調函數

 

下面例子是一個簡單的錯誤回調函數。通過capSetCallbackOnError宏來注冊回調。

// ErrorCallbackProc:    錯誤回調函數

 

 

// hWnd:              捕獲窗口句柄

 

 

// nErrID:              錯誤代碼

 

 

// lpErrorText:          關于錯誤的文本信息

//

LRESULT PASCAL ErrorCallbackProc(HWND hWnd, int nErrID,

    LPSTR lpErrorText)

{

 

    if (!ghWndMain)

        return FALSE;

 

    if (nErrID == 0)            // Starting a new major function.

        return TRUE;          // 清除舊的錯誤

 

    // 顯示錯誤ID和錯誤文本信息

 

 

    wsprintf(gachBuffer, "Error# %d", nErrID);

 

    MessageBox(hWnd, lpErrorText, gachBuffer,

               MB_OK | MB_ICONEXCLAMATION);

 

    return (LRESULT) TRUE;

}

 

 

 

3.2.18創建一個幀回調函數

 

下面是一個簡單的幀回調函數。通過capSetCallbackFrame宏來注冊回調函數。

 

 

 

// FrameCallbackProc:   幀回調函數

 

 

// hWnd:              捕獲窗體句柄

 

 

// lpVHdr:             指向一個包含幀信息的數據結構體

//

LRESULT PASCAL FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)

{

    if (!ghWndMain)

        return FALSE;

 

    wsprintf(gachBuffer, "Preview frame# %ld ", gdwFrameNum++);

    SetWindowText(ghWndMain, (LPSTR)gachBuffer);

    return (LRESULT) TRUE ;

}

 


posted on 2008-07-06 17:17 cpsprogramer 閱讀(2727) 評論(1)  編輯 收藏 引用 所屬分類: VC++

FeedBack:
# re: VFW視頻問題 2008-07-09 11:25 小七
收下了  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲另类在线视频| 久久久久久久久久久一区| 欧美日韩国产在线观看| 久久在线91| 女人香蕉久久**毛片精品| 久久视频在线视频| 老色鬼精品视频在线观看播放| 久久se精品一区二区| 久久激情视频| 免费久久久一本精品久久区| 能在线观看的日韩av| 欧美精品在线一区二区| 欧美视频成人| 国产视频久久久久久久| 亚洲国产mv| 国产精品99久久久久久宅男| 亚洲欧美区自拍先锋| 久久久国产精品一区二区三区| 麻豆视频一区二区| 亚洲精品一区二区三区婷婷月| 日韩视频免费看| 久久精品99国产精品| 欧美另类视频在线| 国产一区二区在线观看免费| 亚洲国产精品嫩草影院| 亚洲欧美日韩人成在线播放| 欧美成年视频| 亚洲女同同性videoxma| 久久夜色精品国产亚洲aⅴ| 欧美剧在线观看| 韩国精品主播一区二区在线观看| aa成人免费视频| 卡通动漫国产精品| 一区二区精品国产| 国产亚洲激情| 亚洲欧美另类国产| 免费视频一区| 国产欧美一区在线| 一区二区三区视频在线播放| 久久青青草综合| 一本色道久久加勒比精品| 久久综合给合| 国产一区二区三区在线观看免费视频 | 欧美日韩免费观看一区=区三区| 国产欧美日韩亚洲精品| 亚洲午夜精品久久| 亚洲美女中出| 欧美久久久久免费| 亚洲精品乱码久久久久久| 久久久久久亚洲精品不卡4k岛国| 一区二区三区精品在线| 欧美日韩hd| 一本久久综合亚洲鲁鲁五月天| 欧美xx69| 免费短视频成人日韩| 亚洲国产综合在线| 欧美高清视频在线| 蜜桃av久久久亚洲精品| 国产综合视频| 久久精品国产久精国产思思| 一区二区三区国产在线| 国产精品jizz在线观看美国 | 亚洲成人在线视频播放 | 亚洲人体一区| 欧美黑人在线播放| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲欧洲精品天堂一级| 欧美激情在线有限公司| 欧美大片一区二区| 在线午夜精品自拍| 亚洲视频精品| 国产亚洲一级| 欧美日韩一区二区三区高清| 欧美日韩综合另类| 在线综合亚洲| 亚洲与欧洲av电影| 国产日韩欧美黄色| 男人插女人欧美| 欧美日韩国产成人在线免费| 亚洲永久视频| 久久国产欧美精品| 亚洲精品一区二| 亚洲视频视频在线| 一区二区在线观看av| 亚洲国产日韩一区| 国产精品观看| 欧美成人精品福利| 国产精品久久久久一区二区三区共| 久久国产高清| 欧美精选在线| 免费久久久一本精品久久区| 欧美日韩午夜激情| 免费亚洲一区| 国产精品一卡二| 亚洲七七久久综合桃花剧情介绍| 国产精品日本一区二区| 欧美肥婆在线| 国产欧美一二三区| 亚洲全部视频| 伊人久久婷婷| 亚洲一区二区三区色| 亚洲精品一区二区三区四区高清 | 国产精品久久福利| 久久综合九色九九| 国产精品青草久久| 亚洲国产高潮在线观看| 国内精品久久国产| 中文国产成人精品久久一| 亚洲国产日日夜夜| 欧美在线二区| 欧美一级日韩一级| 欧美日韩一区二区三区在线看| 可以看av的网站久久看| 国产精品久久久999| 亚洲电影免费在线观看| 国内精品嫩模av私拍在线观看| 中文精品99久久国产香蕉| 99精品国产在热久久| 麻豆精品一区二区av白丝在线| 欧美在线观看视频在线| 国产精品v片在线观看不卡| 亚洲国产三级在线| 亚洲人线精品午夜| 老司机午夜精品| 你懂的视频欧美| 在线看欧美日韩| 久久久久久久波多野高潮日日| 性一交一乱一区二区洋洋av| 国产精品久久久久久妇女6080| 亚洲美女视频网| 亚洲视频中文| 国产精品久久久久77777| 亚洲天堂网在线观看| 亚洲综合大片69999| 国产欧美日韩亚州综合| 久久综合久久综合九色| 久久成人一区二区| 国产免费成人av| 亚洲一区网站| 欧美在线视频免费| 国产一区二区三区奇米久涩| 欧美在线网站| 欧美不卡在线视频| 亚洲欧洲另类| 欧美日韩午夜激情| 亚洲一区二区三区精品在线| 久久激情网站| 亚洲国产精品精华液网站| 欧美国产精品| 一区二区三区四区国产精品| 午夜精品一区二区三区在线视 | 91久久精品美女高潮| 一区二区久久久久| 欧美午夜精品久久久久久超碰| 亚洲一区免费| 麻豆精品在线播放| 99精品视频免费全部在线| 欧美日韩中文字幕在线| 亚洲一区二三| 免费视频一区| 亚洲伊人伊色伊影伊综合网| 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品yjizz| 久久国产精品一区二区三区| 亚洲电影网站| 欧美一区二区三区免费观看| 亚洲成人中文| 欧美午夜电影在线| 久久九九国产精品| 日韩午夜av在线| 久久夜精品va视频免费观看| 日韩亚洲欧美成人| 国产精品午夜电影| 欧美sm视频| 欧美一区二区观看视频| 亚洲精品一二区| 久久综合久久久久88| 亚洲午夜精品一区二区| 亚洲电影av| 国产欧美日韩精品丝袜高跟鞋| 蜜臀久久99精品久久久画质超高清| 国产精品99久久久久久久女警| 欧美成ee人免费视频| 久久精品论坛| 午夜伦理片一区| 亚洲私拍自拍| 亚洲免费成人| 亚洲国产婷婷香蕉久久久久久99| 国产精品网站在线观看| 欧美日韩国产精品专区| 久久久久久久性| 香蕉久久夜色精品国产| 一区二区三区精密机械公司 | 亚洲国产成人精品久久| 欧美一区2区视频在线观看 | 欧美一区二区三区在线看| 国产精品www.| 欧美大片一区二区三区| 欧美一区二区三区精品| 亚洲国产你懂的|