GVCaptureDlg.cpp
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:27k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. //
  20. //xiezhouwei 2005-08-15 添加配置pin函数
  21. #include "stdafx.h"
  22. #include "GVCapture.h"
  23. #include "GVCaptureDlg.h"
  24. #include "utilities.h"
  25. #include "afxdlgs.h"
  26. #include "VideoEncParams.h"
  27. #include "SetV9Dlg.h"
  28. #include ".gvcapturedlg.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. CVideoEncParams g_VideoEncodingParams;
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CAboutDlg dialog used for App About
  37. class CAboutDlg : public CDialog
  38. {
  39. public:
  40. CAboutDlg();
  41. // Dialog Data
  42. //{{AFX_DATA(CAboutDlg)
  43. enum { IDD = IDD_ABOUTBOX };
  44. //}}AFX_DATA
  45. // ClassWizard generated virtual function overrides
  46. //{{AFX_VIRTUAL(CAboutDlg)
  47. protected:
  48. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  49. //}}AFX_VIRTUAL
  50. // Implementation
  51. protected:
  52. //{{AFX_MSG(CAboutDlg)
  53. //}}AFX_MSG
  54. DECLARE_MESSAGE_MAP()
  55. };
  56. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  57. {
  58. //{{AFX_DATA_INIT(CAboutDlg)
  59. //}}AFX_DATA_INIT
  60. }
  61. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  62. {
  63. CDialog::DoDataExchange(pDX);
  64. //{{AFX_DATA_MAP(CAboutDlg)
  65. //}}AFX_DATA_MAP
  66. }
  67. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  68. //{{AFX_MSG_MAP(CAboutDlg)
  69. // No message handlers
  70. //}}AFX_MSG_MAP
  71. END_MESSAGE_MAP()
  72. /////////////////////////////////////////////////////////////////////////////
  73. // CGVCaptureDlg dialog
  74. CGVCaptureDlg::CGVCaptureDlg(CWnd* pParent /*=NULL*/)
  75. : CDialog(CGVCaptureDlg::IDD, pParent)
  76. {
  77. //{{AFX_DATA_INIT(CGVCaptureDlg)
  78. mstrSavePath = _T("");
  79. //}}AFX_DATA_INIT
  80. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  81. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  82. m_grfCapture.Initialize();
  83. m_dwEscape = 0;
  84. m_bPause = FALSE;
  85. mpTemAudioAMT = NULL;
  86. ZeroMemory(mszAVIFilePath,sizeof(mszAVIFilePath));
  87. }
  88. void CGVCaptureDlg::DoDataExchange(CDataExchange* pDX)
  89. {
  90.     CDialog::DoDataExchange(pDX);
  91.     //{{AFX_DATA_MAP(CGVCaptureDlg)
  92.     DDX_Control(pDX, IDC_CHK_OVERLAY, mchkNeedOverlay);
  93.     DDX_Control(pDX, IDC_CHK_SAVE, mbtnSaveFile);
  94.     DDX_Control(pDX, IDC_CHK_ONLY_AUDIO, m_chkOnlyAudio);
  95.     DDX_Control(pDX, IDC_CHK_PREVIEW, m_chkPreview);
  96.     DDX_Control(pDX, IDC_CMB_VIDEO_COMPRESSOR, m_comboxVideoEncoder);
  97.     DDX_Control(pDX, IDC_CMB_VIDEO_CAPTURE, m_comboxVideoCap);
  98.     DDX_Control(pDX, IDC_CMB_AUDIO_CAPTURE, m_comboxAudioCap);
  99.     DDX_Control(pDX, IDC_CMB_AUDIO_COMPRESSOR, m_comboxAudioEncoder);
  100.     DDX_Text(pDX, IDC_EDIT_SAVEPATH, mstrSavePath);
  101.     //}}AFX_DATA_MAP
  102.     DDX_Control(pDX, IDC_CHK_CROSSBAR, m_bChkCrossBar);
  103. }
  104. BEGIN_MESSAGE_MAP(CGVCaptureDlg, CDialog)
  105. //{{AFX_MSG_MAP(CGVCaptureDlg)
  106. ON_WM_SYSCOMMAND()
  107. ON_WM_PAINT()
  108. ON_WM_ERASEBKGND()
  109. ON_WM_QUERYDRAGICON()
  110. ON_BN_CLICKED(IDC_BTN_VIDEOCAP_CONFIG, OnBtnVideocapConfig)
  111. ON_BN_CLICKED(IDC_BTN_VIDEO_COMPRESSOR_CONFIG, OnBtnVideoCompressorConfig)
  112. ON_BN_CLICKED(IDC_BTN_AUDIO_COMPRESSOR_CONFIG, OnBtnAudioCompressorConfig)
  113. ON_BN_CLICKED(IDC_BTN_BEGIN_CAP, OnBtnBeginCap)
  114. ON_BN_CLICKED(IDC_BTN_PAUSE_CAP, OnBtnPauseCap)
  115. ON_BN_CLICKED(IDC_BTN_STOP_CAP, OnBtnStopCap)
  116. ON_BN_CLICKED(IDC_CHK_PREVIEW, OnChkPreview)
  117. ON_WM_TIMER()
  118. ON_WM_CLOSE()
  119. ON_CBN_SELCHANGE(IDC_CMB_AUDIO_COMPRESSOR, OnSelchangeCmbAudioCompressor)
  120.     ON_CBN_SELCHANGE(IDC_CMB_VIDEO_CAPTURE, OnSelchangeCmbVideoCapture)
  121.     ON_CBN_SELCHANGE(IDC_CMB_AUDIO_CAPTURE, OnCbnSelchangeCmbAudioCapture)
  122. ON_CBN_SELCHANGE(IDC_CMB_VIDEO_COMPRESSOR, OnSelchangeCmbVideoCompressor)
  123. ON_BN_CLICKED(IDC_CHK_ONLY_AUDIO, OnCheckOnlyAudio)
  124. ON_BN_CLICKED(IDC_BTN_SYSCOF, OnBtnSyscof)
  125. ON_BN_CLICKED(IDC_BTN_VIDEOCAP_INI_CONFIG, OnBtnVideocapIniConfig)
  126. ON_BN_CLICKED(IDC_CHK_SAVE, OnChkSave)
  127. ON_BN_CLICKED(IDC_BTN_SETOVERLAY, OnBtnSetoverlay)
  128. ON_BN_CLICKED(IDC_CHK_OVERLAY, OnChkOverlay)
  129. ON_BN_CLICKED(IDC_CHK_CROSSBAR, OnBnClickedChkCrossbar)
  130. //}}AFX_MSG_MAP
  131.     ON_BN_CLICKED(IDC_BTN_AUDIO_CAP_CONFIG, OnBnClickedBtnAudioCapConfig)
  132. END_MESSAGE_MAP()
  133. /////////////////////////////////////////////////////////////////////////////
  134. // CGVCaptureDlg message handlers
  135. BOOL CGVCaptureDlg::OnInitDialog()
  136. {
  137. CDialog::OnInitDialog();
  138. // Add "About..." menu item to system menu.
  139. // IDM_ABOUTBOX must be in the system command range.
  140. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  141. ASSERT(IDM_ABOUTBOX < 0xF000);
  142. CMenu* pSysMenu = GetSystemMenu(FALSE);
  143. if (pSysMenu != NULL)
  144. {
  145. CString strAboutMenu;
  146. strAboutMenu.LoadString(IDS_ABOUTBOX);
  147. if (!strAboutMenu.IsEmpty())
  148. {
  149. pSysMenu->AppendMenu(MF_SEPARATOR);
  150. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  151. }
  152. }
  153. // Set the icon for this dialog.  The framework does this automatically
  154. //  when the application's main window is not a dialog
  155. SetIcon(m_hIcon, TRUE); // Set big icon
  156. SetIcon(m_hIcon, FALSE); // Set small icon
  157. //mbtnSaveFile.SetCheck(BST_CHECKED);
  158. m_grfCapture.EnumVideoCapDevices(m_strArrayVideoCapDevice);
  159. for(int i = 0; i < m_strArrayVideoCapDevice.GetSize(); i++)
  160.         m_comboxVideoCap.AddString(m_strArrayVideoCapDevice.GetAt(i));
  161.     //mbtnSaveFile.SetCheck(BST_CHECKED);
  162.     m_grfCapture.EnumAudioCapDevices(m_strArrayAudioCapDevice);
  163.     for(int i = 0; i < m_strArrayAudioCapDevice.GetSize(); i++)
  164.         m_comboxAudioCap.AddString(m_strArrayAudioCapDevice.GetAt(i));
  165. m_grfCapture.EnumVideoEncoders(m_strArrayVideoEncoders);
  166. for(i = 0; i < m_strArrayVideoEncoders.GetSize(); i++)
  167. m_comboxVideoEncoder.AddString(m_strArrayVideoEncoders.GetAt(i));
  168. m_comboxVideoEncoder.AddString("MicroSoft Media 9 DMO");
  169. m_grfCapture.EnumAudioEncoders(m_strArrayAudioEncoders);
  170. for(i = 0; i < m_strArrayAudioEncoders.GetSize(); i++)
  171. m_comboxAudioEncoder.AddString(m_strArrayAudioEncoders.GetAt(i));
  172. //得到文件中的设置数据
  173. LoadFilterConfig();
  174. CString strCurSel;
  175. if (0 != m_strCurVideoEncoder.GetBuffer(0)[0])
  176. {
  177. m_comboxVideoEncoder.SelectString(-1, m_strCurVideoEncoder);
  178. if ("MicroSoft Media 9 DMO" == m_strCurVideoEncoder)
  179. {
  180. g_VideoEncodingParams.DefaultParams();
  181. }
  182. if(FAILED(m_grfCapture.CreateVideoEncoderFilterByName((TCHAR*)((LPCTSTR)m_strCurVideoEncoder))))
  183. AfxMessageBox("Cant Create filter!!");
  184. }
  185. else
  186. {
  187. m_comboxVideoEncoder.SetCurSel(0);
  188. if((i = m_comboxVideoEncoder.GetCurSel()) != CB_ERR)
  189. {
  190. m_comboxVideoEncoder.GetLBText(i, strCurSel);
  191. m_strCurVideoEncoder = strCurSel;
  192. if ("MicroSoft Media 9 DMO" == m_strCurVideoEncoder)
  193. {
  194. g_VideoEncodingParams.DefaultParams();
  195. }
  196. if(FAILED(m_grfCapture.CreateVideoEncoderFilterByName((TCHAR*)((LPCTSTR)strCurSel))))
  197. AfxMessageBox("Cant Create filter!!");
  198. }
  199. }
  200.     if (0 != m_strCurVideoCapDevice.GetBuffer(0)[0])
  201.     {
  202.         m_comboxVideoCap.SelectString(-1, m_strCurVideoCapDevice.GetBuffer(0));
  203.         if(FAILED(m_grfCapture.CreateVideoCapDeviceFilterByName((TCHAR*)((LPCTSTR)m_strCurVideoCapDevice))))
  204.             AfxMessageBox("Cant Create filter!!");
  205.     }
  206.     else
  207.     {
  208.         m_comboxVideoCap.SetCurSel(0);
  209.         strCurSel.Empty();
  210.         if((i = m_comboxVideoCap.GetCurSel()) != CB_ERR)
  211.         {
  212.             m_comboxVideoCap.GetLBText(i, strCurSel);
  213.             m_strCurVideoCapDevice = strCurSel;
  214.             if(FAILED(m_grfCapture.CreateVideoCapDeviceFilterByName((TCHAR*)((LPCTSTR)strCurSel))))
  215.                 AfxMessageBox("Cant Create video capture device filter!!");
  216.         }
  217.     }
  218.     if (0 != m_strCurAudioCapDevice.GetBuffer(0)[0])
  219.     {
  220.         m_comboxAudioCap.SelectString(-1, m_strCurAudioCapDevice.GetBuffer(0));
  221.         if(FAILED(m_grfCapture.CreateAudioCapDeviceFilterByName((TCHAR*)((LPCTSTR)m_strCurAudioCapDevice))))
  222.             AfxMessageBox("Cant Create audio capture device filter!!");
  223.     }
  224.     else
  225.     {
  226.         m_comboxAudioCap.SetCurSel(0);
  227.         strCurSel.Empty();
  228.         if((i = m_comboxAudioCap.GetCurSel()) != CB_ERR)
  229.         {
  230.             m_comboxAudioCap.GetLBText(i, strCurSel);
  231.             m_strCurAudioCapDevice = strCurSel;
  232.             if(FAILED(m_grfCapture.CreateAudioCapDeviceFilterByName((TCHAR*)((LPCTSTR)strCurSel))))
  233.                 AfxMessageBox("Cant Create audio capture device filter!!");
  234.         }
  235.     }
  236. if (0 != m_strCurAudioEncoder.GetBuffer(0)[0])
  237. {
  238. m_comboxAudioEncoder.SelectString(-1, m_strCurAudioEncoder.GetBuffer(0));
  239. if(FAILED(m_grfCapture.CreateAudioEncoderFilterByName((TCHAR*)((LPCTSTR)m_strCurAudioEncoder))))
  240. AfxMessageBox("Cant Create filter!!");
  241. }
  242. else
  243. {
  244. m_comboxAudioEncoder.SetCurSel(0);
  245. strCurSel.Empty();
  246. if((i = m_comboxAudioEncoder.GetCurSel()) != CB_ERR)
  247. {
  248. m_comboxAudioEncoder.GetLBText(i, strCurSel);
  249. m_strCurAudioEncoder = strCurSel;
  250. if(FAILED(m_grfCapture.CreateAudioEncoderFilterByName((TCHAR*)((LPCTSTR)strCurSel))))
  251. AfxMessageBox("Cant Create filter!!");
  252. }
  253. }
  254. m_grfCapture.SetCurMediaType(mpTemAudioAMT);
  255. mchkNeedOverlay.SetCheck(BST_UNCHECKED);
  256. OnChkOverlay();
  257. m_bChkCrossBar.SetCheck(BST_UNCHECKED);
  258. m_grfCapture.SetOwner(GetDlgItem(IDC_STATIC_PREVIEW)->GetSafeHwnd());
  259. GetDlgItem(IDC_STATIC_PREVIEW)->ModifyStyle(0, WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
  260. m_chkPreview.SetCheck(BST_CHECKED);
  261. if(m_strArrayVideoCapDevice.GetSize() == 0)
  262. {
  263. m_chkOnlyAudio.SetCheck(BST_CHECKED);
  264. m_comboxVideoCap.EnableWindow(FALSE);
  265. m_comboxVideoEncoder.EnableWindow(FALSE);
  266. m_chkOnlyAudio.EnableWindow(FALSE);
  267. }
  268. m_chkOnlyAudio.SetCheck(BST_UNCHECKED);
  269. return TRUE;  // return TRUE  unless you set the focus to a control
  270. }
  271. void CGVCaptureDlg::OnSysCommand(UINT nID, LPARAM lParam)
  272. {
  273. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  274. {
  275. CAboutDlg dlgAbout;
  276. dlgAbout.DoModal();
  277. }
  278. else
  279. {
  280. CDialog::OnSysCommand(nID, lParam);
  281. }
  282. }
  283. // If you add a minimize button to your dialog, you will need the code below
  284. //  to draw the icon.  For MFC applications using the document/view model,
  285. //  this is automatically done for you by the framework.
  286. void CGVCaptureDlg::OnPaint() 
  287. {
  288. if (IsIconic())
  289. {
  290. CPaintDC dc(this); // device context for painting
  291. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  292. // Center icon in client rectangle
  293. int cxIcon = GetSystemMetrics(SM_CXICON);
  294. int cyIcon = GetSystemMetrics(SM_CYICON);
  295. CRect rect;
  296. GetClientRect(&rect);
  297. int x = (rect.Width() - cxIcon + 1) / 2;
  298. int y = (rect.Height() - cyIcon + 1) / 2;
  299. // Draw the icon
  300. dc.DrawIcon(x, y, m_hIcon);
  301. }
  302. else
  303. {
  304. CDialog::OnPaint();
  305. }
  306. }
  307. // The system calls this to obtain the cursor to display while the user drags
  308. //  the minimized window.
  309. HCURSOR CGVCaptureDlg::OnQueryDragIcon()
  310. {
  311. return (HCURSOR) m_hIcon;
  312. }
  313. void CGVCaptureDlg::OnBtnVideocapConfig() 
  314. {
  315. if (0 == GetSafeHwnd())
  316. {
  317. MessageBox("父窗口句柄不能为空","错误");
  318. }
  319. if(FAILED(m_grfCapture.ConfigVideoCapDeviceByName(this->GetSafeHwnd())))
  320. AfxMessageBox("Cant set property for this filter!!");
  321. }
  322. void CGVCaptureDlg::OnBtnVideoCompressorConfig() 
  323. {
  324. if (0 == GetSafeHwnd())
  325. {
  326. MessageBox("父窗口句柄不能为空","错误");
  327. }
  328. if ("MicroSoft Media 9 DMO" == m_strCurVideoEncoder)
  329. {
  330. CSetV9Dlg dlg;
  331. if(IDOK == dlg.DoModal())
  332. {
  333. if(FAILED(m_grfCapture.ConfigVideoEncoderByName(this->GetSafeHwnd())))
  334. AfxMessageBox("Cant set property for this filter!!");
  335. }
  336. return;
  337. }
  338. if(FAILED(m_grfCapture.ConfigVideoEncoderByName(this->GetSafeHwnd())))
  339. AfxMessageBox("Cant set property for this filter!!");
  340. }
  341. void CGVCaptureDlg::OnBnClickedBtnAudioCapConfig()
  342. {
  343.     if (0 == GetSafeHwnd())
  344.     {
  345.         MessageBox("父窗口句柄不能为空","错误");
  346.     }
  347.     if(FAILED(m_grfCapture.ConfigAudioCapDeviceByName(this->GetSafeHwnd())))
  348.         AfxMessageBox("Cant set property for this filter!!");
  349. }
  350. void CGVCaptureDlg::OnBtnAudioCompressorConfig() 
  351. {
  352. if (0 == GetSafeHwnd())
  353. {
  354. MessageBox("父窗口句柄不能为空","错误");
  355. }
  356. if(FAILED(m_grfCapture.ConfigAudioEncoderByName(this->GetSafeHwnd())))
  357. AfxMessageBox("Cant set property for this filter!!");
  358. }
  359. //xiezhouwei 05-08-17 添加设置字幕按钮
  360. void CGVCaptureDlg::OnBtnSetoverlay() 
  361. {
  362. if (FAILED(m_grfCapture.ConfigVideoOverlay(GetSafeHwnd())))
  363. {
  364. AfxMessageBox("Cant set property for this filter!!");
  365. }
  366. }
  367. void CGVCaptureDlg::OnChkOverlay() 
  368. {
  369. if (BST_UNCHECKED == mchkNeedOverlay.GetCheck())
  370. {
  371. m_grfCapture.ReleaseUideoOverlay();
  372. GetDlgItem(IDC_BTN_SETOVERLAY)->EnableWindow(FALSE);
  373. }
  374. if (BST_CHECKED == mchkNeedOverlay.GetCheck())
  375. {
  376. if (FAILED(m_grfCapture.CreateUideoOverlay()))
  377. {
  378. m_grfCapture.ReleaseUideoOverlay();
  379. MessageBox("字幕组件加载失败","注意");
  380. mchkNeedOverlay.SetCheck(BST_UNCHECKED);
  381. return ;
  382. }
  383. GetDlgItem(IDC_BTN_SETOVERLAY)->EnableWindow(TRUE);
  384. }
  385. }
  386. //系统设置框
  387. void CGVCaptureDlg::OnBtnSyscof() 
  388. {
  389. if(FAILED(m_grfCapture.ConfigSysCfg(this->GetSafeHwnd())))
  390. AfxMessageBox("Cant set System for this filter!!");
  391. }
  392. void CGVCaptureDlg::OnBtnBeginCap() 
  393. {
  394. if(SUCCEEDED(m_grfCapture.Run()))
  395. {
  396. GetDlgItem(IDC_BTN_VIDEO_COMPRESSOR_CONFIG)->EnableWindow(FALSE);
  397. GetDlgItem(IDC_BTN_AUDIO_COMPRESSOR_CONFIG)->EnableWindow(FALSE);
  398. m_bChkCrossBar.EnableWindow(FALSE);
  399. m_chkOnlyAudio.EnableWindow(FALSE);
  400. mchkNeedOverlay.EnableWindow(FALSE);
  401. GetDlgItem(IDC_BTN_SETOVERLAY)->EnableWindow(FALSE);
  402. mbtnSaveFile.EnableWindow(FALSE);
  403. m_comboxVideoEncoder.EnableWindow(FALSE);
  404. m_comboxVideoCap.EnableWindow(FALSE);
  405. m_comboxAudioEncoder.EnableWindow(FALSE);
  406. m_dwTimer = SetTimer(100, 1000, NULL);
  407. }
  408. m_bPause = FALSE;
  409. }
  410. void CGVCaptureDlg::OnBtnPauseCap() 
  411. {
  412. m_grfCapture.Pause();
  413. m_bPause = TRUE;
  414. }
  415. void CGVCaptureDlg::OnBtnStopCap() 
  416. {
  417. KillTimer(m_dwTimer);
  418. m_bPause = FALSE;
  419. m_dwEscape = 0;
  420. TCHAR strTime[10];
  421. wsprintf(strTime, "00:00:00");
  422. SetDlgItemText(IDC_STATIC_TIMETOCAP, strTime);
  423. SetDlgItemText(IDC_STATIC_BITRATE, "0.0");
  424. if (SUCCEEDED(m_grfCapture.Stop()))
  425. {
  426. GetDlgItem(IDC_BTN_SYSCOF)->EnableWindow();
  427. GetDlgItem(IDC_BTN_VIDEOCAP_INI_CONFIG)->EnableWindow();
  428. GetDlgItem(IDC_BTN_VIDEOCAP_CONFIG)->EnableWindow();
  429. GetDlgItem(IDC_BTN_VIDEO_COMPRESSOR_CONFIG)->EnableWindow();
  430. GetDlgItem(IDC_BTN_AUDIO_COMPRESSOR_CONFIG)->EnableWindow();
  431. m_bChkCrossBar.EnableWindow();
  432. m_chkOnlyAudio.EnableWindow();
  433. mchkNeedOverlay.EnableWindow();
  434. if (BST_CHECKED == mchkNeedOverlay.GetCheck())
  435. {
  436. GetDlgItem(IDC_BTN_SETOVERLAY)->EnableWindow();
  437. }
  438. mbtnSaveFile.EnableWindow();
  439. if(FALSE == m_grfCapture.IsOnlyAudio())
  440. {
  441. m_comboxVideoEncoder.EnableWindow();
  442. m_comboxVideoCap.EnableWindow();
  443. }
  444. m_comboxAudioEncoder.EnableWindow();
  445. }
  446. }
  447. void CGVCaptureDlg::OnChkPreview() 
  448. {
  449. m_grfCapture.SetPreview(!m_grfCapture.IsPreview());
  450. }
  451. void CGVCaptureDlg::OnTimer(UINT nIDEvent) 
  452. {
  453. if(m_bPause)
  454. return;
  455. m_dwEscape ++;
  456. // change time display
  457. int h = m_dwEscape/3600;
  458. int m = (m_dwEscape%3600)/60;
  459. int s = (m_dwEscape%3600)%60;
  460. TCHAR strH[3], strM[3], strS[3];
  461. if(h < 10)
  462. wsprintf(strH, "0%d", h);
  463. else
  464. wsprintf(strH, "%d", h);
  465. if(m < 10)
  466. wsprintf(strM, "0%d", m);
  467. else
  468. wsprintf(strM, "%d", m);
  469. if(s < 10)
  470. wsprintf(strS, "0%d", s);
  471. else
  472. wsprintf(strS, "%d", s);
  473. TCHAR strTime[10];
  474. wsprintf(strTime, "%s:%s:%s", strH, strM ,strS);
  475. SetDlgItemText(IDC_STATIC_TIMETOCAP, strTime);
  476. TCHAR strDataRata[20];
  477. sprintf(strDataRata, "%f", m_grfCapture.GetCompressRata());
  478. SetDlgItemText(IDC_STATIC_BITRATE, strDataRata);
  479. CDialog::OnTimer(nIDEvent);
  480. }
  481. void CGVCaptureDlg::OnClose() 
  482. {
  483. OnBtnStopCap();
  484. CDialog::OnClose();
  485. SaveFilterConfig();
  486. }
  487. void CGVCaptureDlg::OnCbnSelchangeCmbAudioCapture()
  488. {
  489.     CString strCurSel;
  490.     m_comboxAudioCap.GetLBText(m_comboxAudioCap.GetCurSel(), strCurSel);
  491.     if(m_strCurAudioCapDevice == strCurSel)
  492.         return;
  493.     m_strCurAudioCapDevice = strCurSel;
  494.     if(FAILED(m_grfCapture.CreateAudioCapDeviceFilterByName((TCHAR*)((LPCTSTR)strCurSel))))
  495.         AfxMessageBox("Cant Create filter!!");
  496. }
  497. void CGVCaptureDlg::OnSelchangeCmbAudioCompressor() 
  498. {
  499. CString strCurSel;
  500. m_comboxAudioEncoder.GetLBText(m_comboxAudioEncoder.GetCurSel(), strCurSel);
  501. if(m_strCurAudioEncoder == strCurSel ||((LPCTSTR)strCurSel)[0] == 0)
  502. {
  503. AfxMessageBox("当前读出字符串为空");
  504. return;
  505. }
  506. m_strCurAudioEncoder = strCurSel;
  507. if(FAILED(m_grfCapture.CreateAudioEncoderFilterByName((TCHAR*)((LPCTSTR)strCurSel))))
  508. AfxMessageBox("Cant Create filter!!");
  509. }
  510. void CGVCaptureDlg::OnSelchangeCmbVideoCapture() 
  511. {
  512. CString strCurSel;
  513. m_comboxVideoCap.GetLBText(m_comboxVideoCap.GetCurSel(), strCurSel);
  514. if(m_strCurVideoCapDevice == strCurSel)
  515. return;
  516. m_strCurVideoCapDevice = strCurSel;
  517. if(FAILED(m_grfCapture.CreateVideoCapDeviceFilterByName((TCHAR*)((LPCTSTR)strCurSel))))
  518. AfxMessageBox("Cant Create filter!!");
  519. }
  520. void CGVCaptureDlg::OnSelchangeCmbVideoCompressor() 
  521. {
  522. CString strCurSel;
  523. m_comboxVideoEncoder.GetLBText(m_comboxVideoEncoder.GetCurSel(), strCurSel);
  524. if(m_strCurVideoEncoder == strCurSel || ((LPCTSTR)strCurSel)[0] == 0)
  525. {
  526. AfxMessageBox("当前读出字符串为空");
  527. return;
  528. }
  529. m_strCurVideoEncoder = strCurSel;
  530. if ("MicroSoft Media 9 DMO" == m_strCurVideoEncoder)
  531. {
  532. g_VideoEncodingParams.DefaultParams();
  533. }
  534. if(FAILED(m_grfCapture.CreateVideoEncoderFilterByName((TCHAR*)((LPCTSTR)strCurSel))))
  535. AfxMessageBox("Cant Create filter!!");
  536. }
  537. void CGVCaptureDlg::OnNotifyStop()
  538. {
  539. OnBtnStopCap();
  540. }
  541. void CGVCaptureDlg::OnNotifyPlay()
  542. {
  543. OnBtnBeginCap();
  544. }
  545. void CGVCaptureDlg::OnCheckOnlyAudio() 
  546. {
  547. m_grfCapture.SetOnlyAudio(!m_grfCapture.IsOnlyAudio());
  548. if(m_grfCapture.IsOnlyAudio())
  549. {
  550. m_comboxVideoCap.EnableWindow(FALSE);
  551. m_comboxVideoEncoder.EnableWindow(FALSE);
  552. }
  553. else
  554. {
  555. m_comboxVideoCap.EnableWindow(TRUE);
  556. m_comboxVideoEncoder.EnableWindow(TRUE);
  557. }
  558. }
  559. bool CGVCaptureDlg::SaveFilterConfig()
  560. {
  561. char lszTotalPath[DEF_TEMP_LENGTH];
  562. int result = 0;
  563. FILE* lpFp = NULL;
  564. GetTotalPath("ConfigFilter.dat", lszTotalPath);
  565.     lpFp = fopen(lszTotalPath, "wb");
  566.     //写m_strCurAudioCapDevice
  567.     int liLen = strlen(m_strCurAudioCapDevice.GetBuffer(0));
  568.     result = fwrite(&liLen, sizeof(int), 1,lpFp);
  569.     if (1 != result)
  570.     {
  571.         fclose(lpFp);
  572.         return false;
  573.     }
  574.     result = fwrite(m_strCurAudioCapDevice.GetBuffer(0), sizeof(char), liLen,lpFp);
  575.     if (liLen != result)
  576.     {
  577.         fclose(lpFp);
  578.         return false;
  579.     }
  580. //写m_strCurAudioEncoder
  581. liLen = strlen(m_strCurAudioEncoder.GetBuffer(0));
  582. result = fwrite(&liLen, sizeof(int), 1,lpFp);
  583. if (1 != result)
  584. {
  585. fclose(lpFp);
  586. return false;
  587. }
  588. result = fwrite(m_strCurAudioEncoder.GetBuffer(0), sizeof(char), liLen,lpFp);
  589. if (liLen != result)
  590. {
  591. fclose(lpFp);
  592. return false;
  593. }
  594. //写m_strCurVideoCapDevice
  595. liLen = strlen(m_strCurVideoCapDevice.GetBuffer(0));
  596. result = fwrite(&liLen, sizeof(int), 1,lpFp);
  597. if (1 != result)
  598. {
  599. fclose(lpFp);
  600. return false;
  601. }
  602. result = fwrite(m_strCurVideoCapDevice.GetBuffer(0), sizeof(char), liLen,lpFp);
  603. if (liLen != result)
  604. {
  605. fclose(lpFp);
  606. return false;
  607. }
  608. //写m_strCurVideoEncoder
  609. liLen = strlen(m_strCurVideoEncoder.GetBuffer(0));
  610. result = fwrite(&liLen, sizeof(int), 1,lpFp);
  611. if (1 != result)
  612. {
  613. fclose(lpFp);
  614. return false;
  615. }
  616. result = fwrite(m_strCurVideoEncoder.GetBuffer(0), sizeof(char), liLen,lpFp);
  617. if (liLen != result)
  618. {
  619. fclose(lpFp);
  620. return false;
  621. }
  622. //写媒体类型
  623. AM_MEDIA_TYPE* lpCurAudioAMT = NULL;
  624. int ii = sizeof(AM_MEDIA_TYPE) + sizeof(WAVEFORMATEX);
  625. int iii = sizeof(AM_MEDIA_TYPE);
  626. if (!m_grfCapture.GetCurMediaType(&lpCurAudioAMT))
  627. {//如果没有,还必须将一个表示媒体类型为零的写入
  628. liLen = 0;
  629. fwrite(&liLen, sizeof(int), 1, lpFp);
  630. }
  631. //如果媒体格式不是音频则退出,这是一个保护机制。
  632. if (NULL != lpCurAudioAMT)
  633. {
  634. if (FORMAT_WaveFormatEx != lpCurAudioAMT->formattype)
  635. {
  636. fclose(lpFp);
  637. return false;
  638. }
  639. liLen = sizeof(AM_MEDIA_TYPE) + lpCurAudioAMT->cbFormat;
  640. result = fwrite(&liLen, sizeof(int), 1,lpFp);
  641. if (1 != result)
  642. {
  643. fclose(lpFp);
  644. return false;
  645. }
  646. result = fwrite(lpCurAudioAMT, liLen, 1,lpFp);
  647. if (1 != result)
  648. {
  649. fclose(lpFp);
  650. return false;
  651. }
  652. HeapFree(GetProcessHeap(), 0, lpCurAudioAMT);
  653. lpCurAudioAMT = NULL;
  654. }
  655. fclose(lpFp);
  656. return true;
  657. }
  658. bool CGVCaptureDlg::LoadFilterConfig()
  659. {
  660. char lszTotalPath[DEF_TEMP_LENGTH];
  661. int result = 0;
  662. FILE* lpFp = NULL;
  663. GetTotalPath("ConfigFilter.dat", lszTotalPath);
  664. lpFp = fopen(lszTotalPath, "rb");
  665. if (!lpFp)
  666. {
  667. return false;
  668.     }
  669.     //读m_strCurAudioCapDevice
  670.     int liLen = 0;
  671.     result = fread(&liLen, sizeof(int), 1,lpFp);
  672.     if (1 != result)
  673.     {
  674.         AfxMessageBox("读取配置文件出错");
  675.         fclose(lpFp);
  676.         DeleteFile(lszTotalPath);
  677.         return false;
  678.     }
  679.     if (liLen)
  680.     {
  681.         result = fread(m_strCurAudioCapDevice.GetBuffer(liLen), sizeof(char), liLen,lpFp);
  682.         if (liLen != result)
  683.         {
  684.             m_strCurAudioCapDevice.ReleaseBuffer(liLen);
  685.             AfxMessageBox("读取配置文件出错");
  686.             fclose(lpFp);
  687.             DeleteFile(lszTotalPath);
  688.             return false;
  689.         }
  690.         m_strCurAudioCapDevice.ReleaseBuffer(liLen);
  691.     }
  692. //读m_strCurAudioEncoder
  693. liLen = 0;
  694. result = fread(&liLen, sizeof(int), 1,lpFp);
  695. if (1 != result)
  696. {
  697. AfxMessageBox("读取配置文件出错");
  698. fclose(lpFp);
  699. DeleteFile(lszTotalPath);
  700. return false;
  701. }
  702. if (liLen)
  703. {
  704. result = fread(m_strCurAudioEncoder.GetBuffer(liLen), sizeof(char), liLen,lpFp);
  705. if (liLen != result)
  706. {
  707. m_strCurAudioEncoder.ReleaseBuffer(liLen);
  708. AfxMessageBox("读取配置文件出错");
  709. fclose(lpFp);
  710. DeleteFile(lszTotalPath);
  711. return false;
  712. }
  713. m_strCurAudioEncoder.ReleaseBuffer(liLen);
  714. }
  715. //读m_strCurVideoCapDevice
  716. liLen = 0;
  717. result = fread(&liLen, sizeof(int), 1,lpFp);
  718. if (1 != result)
  719. {
  720. AfxMessageBox("读取配置文件出错");
  721. fclose(lpFp);
  722. DeleteFile(lszTotalPath);
  723. return false;
  724. }
  725. if (liLen)
  726. {
  727. result = fread(m_strCurVideoCapDevice.GetBuffer(liLen), sizeof(char), liLen,lpFp);
  728. if (liLen != result)
  729. {
  730. m_strCurVideoCapDevice.ReleaseBuffer(liLen);
  731. AfxMessageBox("读取配置文件出错");
  732. fclose(lpFp);
  733. DeleteFile(lszTotalPath);
  734. return false;
  735. }
  736. m_strCurVideoCapDevice.ReleaseBuffer(liLen);
  737. }
  738. //读m_strCurVideoEncoder
  739. liLen = 0;
  740. result = fread(&liLen, sizeof(int), 1,lpFp);
  741. if (1 != result)
  742. {
  743. AfxMessageBox("读取配置文件出错");
  744. fclose(lpFp);
  745. DeleteFile(lszTotalPath);
  746. return false;
  747. }
  748. if (liLen)
  749. {
  750. result = fread(m_strCurVideoEncoder.GetBuffer(liLen), sizeof(char), liLen,lpFp);
  751. if (liLen != result)
  752. {
  753. m_strCurVideoEncoder.ReleaseBuffer(liLen);
  754. AfxMessageBox("读取配置文件出错");
  755. fclose(lpFp);
  756. DeleteFile(lszTotalPath);
  757. return false;
  758. }
  759. m_strCurVideoEncoder.ReleaseBuffer(liLen);
  760. }
  761. //读媒体类型
  762. liLen = 0;
  763. result = fread(&liLen, sizeof(int), 1,lpFp);
  764. if (1 != result)
  765. {
  766. AfxMessageBox("读取配置文件出错");
  767. fclose(lpFp);
  768. DeleteFile(lszTotalPath);
  769. return false;
  770. }
  771. if (liLen)//必须加,如果不加,则读出零个字节时就会返回false,此时应返回true,因为
  772. //只是代表没有。
  773. {
  774. //Arthur:解决m_pCurAudioAMT尽管有值为零,但是却还是分配了空间,只要有值时才给
  775. //mpTemAudioAMT分配空间就可。
  776. mpTemAudioAMT = (AM_MEDIA_TYPE *)HeapAlloc(GetProcessHeap(), 
  777. HEAP_NO_SERIALIZE|HEAP_ZERO_MEMORY, 
  778. sizeof(AM_MEDIA_TYPE) + sizeof(WAVEFORMATEX));
  779. result = fread(mpTemAudioAMT, liLen, 1,lpFp);
  780. if (1 != result)
  781. {
  782. HeapFree(GetProcessHeap(), 0, mpTemAudioAMT);
  783. mpTemAudioAMT = NULL;
  784. AfxMessageBox("读取配置文件出错");
  785. fclose(lpFp);
  786. DeleteFile(lszTotalPath);
  787. return false;
  788. }
  789. mpTemAudioAMT->pbFormat = (LPBYTE)(mpTemAudioAMT + 1);
  790. //如果媒体格式不是音频则退出,这是一个保护机制。
  791. if (FORMAT_WaveFormatEx != mpTemAudioAMT->formattype)
  792. {
  793. AfxMessageBox("读取配置文件出错");
  794. fclose(lpFp);
  795. DeleteFile(lszTotalPath);
  796. return false;
  797. }
  798. }
  799. fclose(lpFp);
  800. return true;
  801. }
  802. //求得完整路径
  803. bool CGVCaptureDlg::GetTotalPath(char *aszFileName, char *aszTotalPath)
  804. {
  805. GetModuleFileName(NULL, aszTotalPath, MAX_PATH);
  806. int liLengthPath = strlen(aszTotalPath);
  807. while (aszTotalPath[liLengthPath - 1] != '\')
  808. {
  809. --liLengthPath;
  810. }
  811. if (liLengthPath > 0)
  812. {
  813. aszTotalPath[liLengthPath] = '';
  814. if (NULL != aszFileName)
  815. {
  816. strcat(aszTotalPath, aszFileName);
  817. }
  818. return true;
  819. }
  820. return false;
  821. }
  822. //xiezhouwei 2005-08-15 添加配置pin函数
  823. void CGVCaptureDlg::OnBtnVideocapIniConfig() 
  824. {
  825. // TODO: Add your control notification handler code here
  826. m_grfCapture.ShowPinSetting(m_hWnd);
  827. return;
  828. }
  829. void CGVCaptureDlg::OnChkSave() 
  830. {
  831. char lszPath[MAX_PATH] = {0};
  832. UpdateData();
  833. if (BST_CHECKED == mbtnSaveFile.GetCheck())
  834. {
  835. GetTotalPath(NULL, lszPath);
  836. CFileDialog loFileDlg(FALSE, "avi" , NULL, OFN_EXPLORER|OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
  837. "AVI Files (*.avi)|*.avi|All Files (*.*)|*.*||", NULL);
  838. loFileDlg.m_ofn.lStructSize = sizeof(loFileDlg.m_ofn);
  839. if (IDOK  == loFileDlg.DoModal())
  840. {
  841. ZeroMemory(mszAVIFilePath, sizeof(mszAVIFilePath));
  842. strcpy(mszAVIFilePath, loFileDlg.GetPathName().GetBuffer(0));
  843. mstrSavePath = mszAVIFilePath;
  844. m_grfCapture.SetAVIFile(mszAVIFilePath);
  845. if ('' == mszAVIFilePath[0])
  846. {
  847. mbtnSaveFile.SetCheck(BST_UNCHECKED);
  848. }
  849. }
  850. }
  851. else
  852. {
  853. mstrSavePath.Empty();
  854. }
  855. UpdateData(false);
  856. }
  857. BOOL CGVCaptureDlg::OnEraseBkgnd(CDC* pDC)
  858. {
  859. // Intercept background erasing for the movie window, since the
  860. // video renderer will keep the screen painted.  Without this code,
  861. // your video window might get painted over with gray (the default
  862. // background brush) when it is obscured by another window and redrawn.
  863. CRect rc;
  864. // Get the bounding rectangle for the movie screen
  865. //m_VideoWindow.GetWindowRect(&rc);
  866. GetDlgItem(IDC_STATIC_PREVIEW)->GetWindowRect(&rc);
  867. ScreenToClient(&rc);
  868. // Exclude the clipping region occupied by our movie screen
  869. pDC->ExcludeClipRect(&rc);
  870. GetDlgItem(IDC_STATIC_PREVIEW)->GetWindowRect(&rc);
  871. ScreenToClient(&rc);
  872. pDC->ExcludeClipRect(&rc);
  873. // Erase the remainder of the dialog as usual
  874. return CDialog::OnEraseBkgnd(pDC);
  875. }
  876. //用户选择是否需要CrossBar输入
  877. void CGVCaptureDlg::OnBnClickedChkCrossbar()
  878. {
  879. if (BST_CHECKED == m_bChkCrossBar.GetCheck())
  880. {
  881. m_grfCapture.SetCrossBar(TRUE);
  882. return;
  883. }
  884. m_grfCapture.SetCrossBar(FALSE);
  885. }