首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

完整的DirectShow擒获音视频的demo(源码)

2013-03-17 
完整的DirectShow捕获音视频的demo(源码)近段时间由于工作上的需要,大概看了下DirectShow,写了个小的demo,

完整的DirectShow捕获音视频的demo(源码)

完整的DirectShow擒获音视频的demo(源码)      

近段时间由于工作上的需要,大概看了下DirectShow,写了个小的demo,方便理解。以后在深入的学习下DirectShow。贴出代码。

对音频所做的处理如下图:

完整的DirectShow擒获音视频的demo(源码)


1. common.h文件

#include "CaptureVideo.h"#include "CaptureAudio.h"#include "resource.h"#define ID_COMBOBOX  10000#define ID_COMBOBOX2 10001#define ID_TIMER     10002CaptureVideo g_CaptureVideo;CaptureAudio g_CaptureAudio;HWND hwndCombo1;HWND hwndCombo2;BSTR bstrDeviceName;HICON g_hIconLarge;HICON g_hIconSmall;int g_nTimerCount = 0;BOOL CALLBACK WndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);VOID CALLBACK TimerGetPicture(HWND hDlg, UINT message, UINT iTimerID, DWORD dwTimer);VOID SetWindowPosCenter(HWND hDlg);int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){g_hIconLarge = static_cast<HICON>(LoadImage(hInstance, TEXT("IDI_ICON1"), IMAGE_ICON,  //set large icoGetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CXICON), 0));g_hIconSmall = static_cast<HICON>(LoadImage(hInstance, TEXT("IDI_ICON1"), IMAGE_ICON,   //set small icoGetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CXSMICON), 0));    MSG msg;HWND hDlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,WndProc);    ShowWindow(hDlg,iCmdShow);UpdateWindow(hDlg);    while (GetMessage (&msg, NULL, 0, 0))    {        TranslateMessage (&msg);        DispatchMessage (&msg);    }CoUninitialize();// ExitDestroyIcon(g_hIconLarge);DestroyIcon(g_hIconSmall);    return msg.wParam;}BOOL CALLBACK WndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){int nGetComboxCount = 0;int iGetCurSel = 0;DWORD dwBaseUnits;switch(message){case WM_INITDIALOG:        {SendMessage(hDlg,WM_SETICON,FALSE,reinterpret_cast<LPARAM>(g_hIconSmall));SendMessage(hDlg,WM_SETICON,TRUE,reinterpret_cast<LPARAM>(g_hIconLarge));//////////////////////////////////////////////////////////////////////////SetWindowPosCenter(hDlg); //set Dialog at window center//////////////////////////////////////////////////////////////////////////g_CaptureVideo.m_App = hDlg;g_CaptureAudio.m_App = hDlg;dwBaseUnits = GetDialogBaseUnits(); hwndCombo1 = CreateWindow(TEXT("COMBOBOX"), TEXT(""), CBS_DROPDOWN | WS_CHILD | WS_VISIBLE, (6 * LOWORD(dwBaseUnits)) / 4, (2 * HIWORD(dwBaseUnits)) / 8, (100 * LOWORD(dwBaseUnits)) / 4, (50 * HIWORD(dwBaseUnits)) / 8, hDlg, (HMENU)ID_COMBOBOX, NULL, NULL);   hwndCombo2 = CreateWindow(TEXT("COMBOBOX"), TEXT(""), CBS_DROPDOWN | WS_CHILD | WS_VISIBLE, (110 * LOWORD(dwBaseUnits)) / 4, (2 * HIWORD(dwBaseUnits)) / 8, (100 * LOWORD(dwBaseUnits)) / 4, (50 * HIWORD(dwBaseUnits)) / 8, hDlg, (HMENU)ID_COMBOBOX2, NULL, NULL);   //Videog_CaptureVideo.EnumAllDevices(hwndCombo1); //Enum All CameranGetComboxCount = ComboBox_GetCount(hwndCombo1);if (nGetComboxCount == 0)ComboBox_Enable(hwndCombo1,FALSE);elseComboBox_SetCurSel(hwndCombo1,0);if(g_CaptureVideo.m_nCaptureDeviceNumber == 0){Msg(hDlg,TEXT("没有摄像头设备"));EnableWindow(GetDlgItem(hDlg,IDC_PREVIWE),FALSE);}EnableWindow(GetDlgItem(hDlg,IDONESHOT),FALSE);// Audiog_CaptureAudio.EnumAllDevices(hwndCombo2);nGetComboxCount = ComboBox_GetCount(hwndCombo2);if (nGetComboxCount == 0)ComboBox_Enable(hwndCombo2,FALSE);elseComboBox_SetCurSel(hwndCombo2,0);if(g_CaptureAudio.m_nCaptureDeviceNumber == 0){Msg(hDlg,TEXT("没有音频设备"));EnableWindow(GetDlgItem(hDlg,IDC_PREVIWE),FALSE);}        }return TRUE;case WM_DESTROY:        {g_CaptureVideo.CloseInterface();PostQuitMessage(0);        }break;case WM_COMMAND:switch (LOWORD(wParam)){case IDCANCEL:            {                PostQuitMessage(0);            }           break;case IDONESHOT:            {                //g_CaptureVideo.GrabOneFrame(TRUE);SetTimer(hDlg,ID_TIMER,150,TimerGetPicture);            }break;case IDC_PREVIWE:{//VideoiGetCurSel = ComboBox_GetCurSel(hwndCombo1);g_CaptureVideo.OpenDevice(iGetCurSel,20,30,430,400);EnableWindow(GetDlgItem(hDlg,IDONESHOT),TRUE);//AudioiGetCurSel = ComboBox_GetCurSel(hwndCombo2);bstrDeviceName = SysAllocString(g_CaptureAudio.m_pCapDeviceName[iGetCurSel]);g_CaptureAudio.OpenDevice(bstrDeviceName);}break;default: break;}case WM_MOVE:g_CaptureVideo.m_pVideoWindow->NotifyOwnerMessage((OAHWND)hDlg, message, wParam, lParam);break;}return (FALSE);}VOID CALLBACK TimerGetPicture(HWND hDlg, UINT message, UINT iTimerID, DWORD dwTimer){if(g_nTimerCount < 25){g_CaptureVideo.GrabOneFrame(TRUE);g_nTimerCount++;}else{KillTimer(hDlg,ID_TIMER);g_nTimerCount = 0;}}VOID SetWindowPosCenter(HWND hDlg){int cxWindow,cyWindow;  //window Screen width and heightRECT hDlgRect;          //Dialog Rectint cxDialog,cyDialog;  //Dialog Screen width and heightint cxSetPos,cySetPos;GetWindowRect(hDlg,&hDlgRect);//cxDialog = hDlgRect.right - hDlgRect.left;cyDialog = hDlgRect.bottom - hDlgRect.top;//cxWindow = GetSystemMetrics(SM_CXSCREEN);cyWindow = GetSystemMetrics(SM_CYSCREEN);//cxSetPos = (cxWindow-cxDialog)/2;cySetPos = (cyWindow-cyDialog)/2;SetWindowPos(hDlg,NULL,cxSetPos,cySetPos,0,0,SWP_NOSIZE);}


3楼ggggsssskkkk昨天 14:26
DirectShow捕获有现成的例子源码,根本不用自己写
Re: wangqiulin123456昨天 14:32
回复ggggsssskkkkn也对,不过作为自己学习,还是有点帮助,以后再看看进阶知识,提升下。
2楼ggggsssskkkk昨天 14:25
捕获没什么技术含量,要压缩成h.264格式后用RTP传出去才有点看头儿
1楼wqliceman昨天 11:09
不错

热点排行