DirectShowNet 使用摄像头录像+录音

http://www.cnblogs.com/endv/p/6052511.html

   1 // ------------------------------------------------------------------
   2 // CaptureTest.cs
   3 // Sample application to show the DirectX.Capture class library.
   4 //
   5 // History:
   6 //    2003-Jan-25        BL        - created
   7 //
   8 // Copyright (c) 2003 Brian Low
   9 // ------------------------------------------------------------------
  10 
  11 using DirectShowLib;
  12 using DirectX.Capture;
  13 using System;
  14 using System.Diagnostics;
  15 using System.Drawing;
  16 using System.Runtime.InteropServices;
  17 using System.Text;
  18 using System.Windows.Forms;
  19 
  20 namespace CaptureTest
  21 {
  22     public class CaptureTest : System.Windows.Forms.Form
  23     {
  24         /// 
  25         /// 应用程序的主要入口点 
  26         /// 
  27         [STAThread]
  28         static void Main()
  29         {
  30             AppDomain currentDomain = AppDomain.CurrentDomain;
  31             Application.Run(new CaptureTest());
  32             GC.Collect();
  33             GC.WaitForPendingFinalizers();
  34         }
  35 
  36         // kernel32.dll是Windows9x/Me中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,
  37         // 当Windows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域
  38         [DllImport("kernel32.dll")]
  39         static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName);
  40 
  41         [DllImport("kernel32.dll")]
  42         static extern uint WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);
  43 
  44         const int WM_GRAPHNOTIFY = 0x8000 + 1;
  45         private long iDroppedBefore = 0;
  46         private DateTime dtBefore;
  47         private IMediaEventEx mediaEvent = null;
  48         private int CaptureResult;
  49         private 捕获 capture = null;
  50         private Filters filters = new Filters();
  51         private Size m_FrameSize; // Reading the value from capture.Framesize derenders the graph
  52 
  53         public CaptureTest()
  54         {
  55             InitializeComponent(); // 所需的窗体设计器支持
  56 
  57             LoadDevices();//负载设备
  58 
  59             if (capture != null)
  60             {
  61                 LoadDeviceSettings();//加载设备设置
  62                 LoadCompressors();//加载压缩机
  63             }
  64 
  65             // 更新主菜单中的许多有趣的工作,这个示例发生在这里
  66             try { updateMenu(); } catch { }
  67 
  68             // 由于压缩机设置不在菜单上,不需要再做 updatemenu 。
  69             // 已后要做的 updatemenu 由于其中一个调用重置这些。
  70 
  71             if (capture != null)
  72             {
  73                 LoadCompressorSettings();//加载压缩机设置
  74             }
  75         }
  76 
  77 
  78         #region 加载
  79         //加载设备
  80         protected void LoadDevices()
  81         {
  82             int x;
  83             int iVideoDeviceIndex = -1;
  84             int iAudioDeviceIndex = -1;
  85             StringBuilder sbOut = new StringBuilder(500);
  86 
  87             string sConfigFile = Application.LocalUserAppDataPath + "\\..\\Config.ini";
  88 
  89             GetPrivateProfileString("Devices", "VideoDevice", "", sbOut, 500, sConfigFile);
  90 
  91             if (sbOut.Length > 0)
  92             {
  93                 for (x = 0; x < filters.VideoInputDevices.Count; x++)
  94                 {
  95                     if (filters.VideoInputDevices[x].Name == sbOut.ToString())
  96                     {
  97                         iVideoDeviceIndex = x;
  98                         break;
  99                     }
 100                 }
 101             }
 102 
 103             GetPrivateProfileString("Devices", "AudioDevice", "", sbOut, 500, sConfigFile);
 104 
 105 
 106             if (sbOut.Length > 0)
 107             {
 108                 for (x = 0; x < filters.AudioInputDevices.Count; x++)
 109                 {
 110                     if (filters.AudioInputDevices[x].Name == sbOut.ToString())
 111                     {
 112                         iAudioDeviceIndex = x;
 113                         break;
 114                     }
 115                 }
 116             }
 117 
 118             if ((iVideoDeviceIndex >= 0) || (iAudioDeviceIndex >= 0))
 119             {
 120                 Filter i, j;
 121 
 122                 if (iVideoDeviceIndex >= 0)
 123                     i = filters.VideoInputDevices[iVideoDeviceIndex];
 124                 else
 125                     i = null;
 126 
 127                 if (iAudioDeviceIndex >= 0)
 128                     j = filters.AudioInputDevices[iAudioDeviceIndex];
 129                 else
 130                     j = null;
 131 
 132                 capture = new 捕获(i, j);
 133 
 134                 capture.CaptureComplete += new EventHandler(OnCaptureComplete);
 135 
 136                 if (iVideoDeviceIndex >= 0)
 137                 {
 138                     GetPrivateProfileString("Devices", "VideoSource", "", sbOut, 500, sConfigFile);
 139 
 140                     for (x = 0; x < capture.VideoSources.Count; x++)
 141                     {
 142                         if (capture.VideoSources[x].Name == sbOut.ToString())
 143                         {
 144                             capture.VideoSource = capture.VideoSources[x];
 145                             break;
 146                         }
 147                     }
 148                 }
 149 
 150                 if (iAudioDeviceIndex >= 0)
 151                 {
 152                     GetPrivateProfileString("Devices", "AudioSource", "", sbOut, 500, sConfigFile);
 153 
 154                     for (x = 0; x < capture.AudioSources.Count; x++)
 155                     {
 156                         if (capture.AudioSources[x].Name == sbOut.ToString())
 157                         {
 158                             capture.AudioSource = capture.AudioSources[x];
 159                             break;
 160                         }
 161                     }
 162                 }
 163             }
 164         }
 165 
 166         //加载设备设置
 167         protected void LoadDeviceSettings()
 168         {
 169             StringBuilder sbOut = new StringBuilder(500);
 170             string sConfigFile = Application.LocalUserAppDataPath + "\\..\\Config.ini";
 171 
 172             if (capture.VideoDevice != null)
 173             {
 174                 GetPrivateProfileString("DeviceSettings", "FrameRate", "", sbOut, 500, sConfigFile);
 175                 if (sbOut.Length > 0)
 176                     capture.FrameRate = Convert.ToDouble(sbOut.ToString());
 177 
 178                 GetPrivateProfileString("DeviceSettings", "VideoWidth", "", sbOut, 500, sConfigFile);
 179                 if (sbOut.Length > 0)
 180                 {
 181                     Size size = new Size(Convert.ToInt32(sbOut.ToString()), 0);
 182 
 183                     GetPrivateProfileString("DeviceSettings", "VideoHeight", "", sbOut, 500, sConfigFile);
 184                     if (sbOut.Length > 0)
 185                     {
 186                         size.Height = Convert.ToInt32(sbOut.ToString());
 187                         capture.FrameSize = size;
 188                     }
 189                 }
 190             }
 191 
 192             if (capture.AudioDevice != null)
 193             {
 194                 GetPrivateProfileString("DeviceSettings", "AudioChannel", "", sbOut, 500, sConfigFile);
 195                 if (sbOut.Length > 0)
 196                 {
 197                     capture.AudioChannels = Convert.ToInt16(sbOut.ToString());
 198                 }
 199 
 200                 GetPrivateProfileString("DeviceSettings", "AudioRate", "", sbOut, 500, sConfigFile);
 201                 if (sbOut.Length > 0)
 202                 {
 203                     capture.AudioSamplingRate = Convert.ToInt32(sbOut.ToString());
 204                 }
 205 
 206                 GetPrivateProfileString("DeviceSettings", "AudioSize", "", sbOut, 500, sConfigFile);
 207                 if (sbOut.Length > 0)
 208                 {
 209                     capture.AudioSampleSize = Convert.ToInt16(sbOut.ToString());
 210                 }
 211 
 212                 GetPrivateProfileString("DeviceSettings", "AudioChannel", "", sbOut, 500, sConfigFile);
 213                 if (sbOut.Length > 0)
 214                 {
 215                     capture.AudioChannels = Convert.ToInt16(sbOut.ToString());
 216                 }
 217             }
 218 
 219         }
 220         //加载压缩机
 221         protected void LoadCompressors()
 222         {
 223             int x;
 224             StringBuilder sbOut = new StringBuilder(500);
 225             string sConfigFile = Application.LocalUserAppDataPath + "\\..\\Config.ini";
 226 
 227             if (capture.VideoDevice != null)
 228             {
 229                 GetPrivateProfileString("Compressor", "VideoCompressor", "", sbOut, 500, sConfigFile);
 230 
 231                 if (sbOut.Length > 0)
 232                 {
 233                     for (x = 0; x < filters.VideoCompressors.Count; x++)
 234                     {
 235                         if (filters.VideoCompressors[x].Name == sbOut.ToString())
 236                         {
 237                             capture.VideoCompressor = filters.VideoCompressors[x];
 238                             break;
 239                         }
 240                     }
 241                 }
 242             }
 243 
 244             if (capture.AudioDevice != null)
 245             {
 246                 GetPrivateProfileString("Compressor", "AudioCompressor", "", sbOut, 500, sConfigFile);
 247 
 248                 for (x = 0; x < filters.AudioCompressors.Count; x++)
 249                 {
 250                     if (filters.AudioCompressors[x].Name == sbOut.ToString())
 251                     {
 252                         capture.AudioCompressor = filters.AudioCompressors[x];
 253                         break;
 254                     }
 255                 }
 256             }
 257         }
 258         //加载压缩机设置
 259         protected void LoadCompressorSettings()
 260         {
 261             StringBuilder sbOut = new StringBuilder(500);
 262             string sConfigFile = Application.LocalUserAppDataPath + "\\..\\Config.ini";
 263 
 264             if (capture.VideoCompressor != null)
 265             {
 266                 try
 267                 {
 268                     VideoCompressorCaps i = capture.VideoCompressorCaps;
 269 
 270                     GetPrivateProfileString("Compressor", "KeyFrameRate", "", sbOut, 500, sConfigFile);
 271                     if (sbOut.Length > 0)
 272                         i.KeyFrameRate = Convert.ToInt32(sbOut.ToString());
 273 
 274                     GetPrivateProfileString("Compressor", "PFrames", "", sbOut, 500, sConfigFile);
 275                     if (sbOut.Length > 0)
 276                         i.PFramesPerKeyFrame = Convert.ToInt32(sbOut.ToString());
 277 
 278                     GetPrivateProfileString("Compressor", "WindowSize", "", sbOut, 500, sConfigFile);
 279                     if (sbOut.Length > 0)
 280                         i.WindowSize = Convert.ToInt64(sbOut.ToString());
 281 
 282                     GetPrivateProfileString("Compressor", "Quality", "", sbOut, 500, sConfigFile);
 283                     if (sbOut.Length > 0)
 284                         i.Quality = Convert.ToInt32(sbOut.ToString());
 285                 }
 286                 catch { }
 287             }
 288         }
 289 
 290         //保存默认设置  "\\..\\Config.ini"
 291         protected void SaveDefaults()
 292         {
 293             string sConfigFile = Application.LocalUserAppDataPath + "\\..\\Config.ini";
 294 
 295             if (capture != null)
 296             {
 297                 if (capture.VideoDevice != null)
 298                 {
 299                     WritePrivateProfileString("Devices", "VideoDevice", capture.VideoDevice.Name, sConfigFile);
 300                     WritePrivateProfileString("DeviceSettings", "FrameRate", capture.FrameRate.ToString(), sConfigFile);
 301                     WritePrivateProfileString("DeviceSettings", "VideoWidth", capture.FrameSize.Width.ToString(), sConfigFile);
 302                     WritePrivateProfileString("DeviceSettings", "VideoHeight", capture.FrameSize.Height.ToString(), sConfigFile);
 303                 }
 304                 else
 305                 {
 306                     WritePrivateProfileString("Devices", "VideoDevice", "", sConfigFile);
 307                     WritePrivateProfileString("DeviceSettings", "FrameRate", "", sConfigFile);
 308                     WritePrivateProfileString("DeviceSettings", "VideoWidth", "", sConfigFile);
 309                     WritePrivateProfileString("DeviceSettings", "VideoHeight", "", sConfigFile);
 310                 }
 311                 if (capture.AudioDevice != null)
 312                 {
 313                     WritePrivateProfileString("Devices", "AudioDevice", capture.AudioDevice.Name, sConfigFile);
 314                     WritePrivateProfileString("DeviceSettings", "AudioChannel", capture.AudioChannels.ToString(), sConfigFile);
 315                     WritePrivateProfileString("DeviceSettings", "AudioRate", capture.AudioSamplingRate.ToString(), sConfigFile);
 316                     WritePrivateProfileString("DeviceSettings", "AudioSize", capture.AudioSampleSize.ToString(), sConfigFile);
 317                 }
 318                 else
 319                 {
 320                     WritePrivateProfileString("Devices", "AudioDevice", "", sConfigFile);
 321                     WritePrivateProfileString("DeviceSettings", "AudioChannel", "", sConfigFile);
 322                     WritePrivateProfileString("DeviceSettings", "AudioRate", "", sConfigFile);
 323                     WritePrivateProfileString("DeviceSettings", "AudioSize", "", sConfigFile);
 324                 }
 325                 if (capture.VideoCompressor != null)
 326                 {
 327                     WritePrivateProfileString("Compressor", "VideoCompressor", capture.VideoCompressor.Name, sConfigFile);
 328 
 329                     CompressionCaps i = CompressionCaps.None;
 330 
 331                     try
 332                     {
 333                         i = capture.VideoCompressorCaps.GetCaps;
 334                     }
 335                     catch { }
 336 
 337                     if ((i & CompressionCaps.CanKeyFrame) > 0)
 338                         WritePrivateProfileString("Compressor", "KeyFrameRate", capture.VideoCompressorCaps.KeyFrameRate.ToString(), sConfigFile);
 339 
 340                     if ((i & CompressionCaps.CanBFrame) > 0)
 341                         WritePrivateProfileString("Compressor", "PFrames", capture.VideoCompressorCaps.PFramesPerKeyFrame.ToString(), sConfigFile);
 342 
 343                     if ((i & CompressionCaps.CanWindow) > 0)
 344                         WritePrivateProfileString("Compressor", "WindowSize", capture.VideoCompressorCaps.WindowSize.ToString(), sConfigFile);
 345 
 346                     if ((i & CompressionCaps.CanQuality) > 0)
 347                         WritePrivateProfileString("Compressor", "Quality", capture.VideoCompressorCaps.Quality.ToString(), sConfigFile);
 348 
 349                 }
 350                 else
 351                 {
 352                     WritePrivateProfileString("Compressor", "VideoCompressor", "", sConfigFile);
 353                     WritePrivateProfileString("Compressor", "KeyFrameRate", "", sConfigFile);
 354                     WritePrivateProfileString("Compressor", "PFrames", "", sConfigFile);
 355                     WritePrivateProfileString("Compressor", "WindowSize", "", sConfigFile);
 356                     WritePrivateProfileString("Compressor", "Quality", "", sConfigFile);
 357                 }
 358                 if (capture.AudioCompressor != null)
 359                 {
 360                     WritePrivateProfileString("Compressor", "AudioCompressor", capture.AudioCompressor.Name, sConfigFile);
 361                 }
 362                 else
 363                 {
 364                     WritePrivateProfileString("Compressor", "AudioCompressor", "", sConfigFile);
 365                 }
 366                 if (capture.VideoSource != null)
 367                 {
 368                     WritePrivateProfileString("Devices", "VideoSource", capture.VideoSource.Name, sConfigFile);
 369                 }
 370                 else
 371                 {
 372                     WritePrivateProfileString("Devices", "VideoSource", "", sConfigFile);
 373                 }
 374                 if (capture.AudioSource != null)
 375                 {
 376                     WritePrivateProfileString("Devices", "AudioSource", capture.AudioSource.Name, sConfigFile);
 377                 }
 378                 else
 379                 {
 380                     WritePrivateProfileString("Devices", "AudioSource", "", sConfigFile);
 381                 }
 382 
 383 #if DEBUG
 384                 foreach (PropertyPage p in capture.PropertyPages)
 385                 {
 386                     if (p.SupportsPersisting)
 387                     {
 388                         // Doesn't seem to work right
 389                         Debug.WriteLine(p.Name);
 390                     }
 391                 }
 392 #endif
 393             }
 394         }
 395 
 396 
 397         //更新主菜单中的许多有趣的工作,这个示例发生在这里
 398         private void updateMenu()
 399         {
 400             MenuItem m;
 401             Filter f;
 402             Source s;
 403             Source current;//当前
 404             PropertyPage p;
 405             Control oldPreviewWindow = null;
 406 
 407             // 正确的长宽比 Correct aspect ratio
 408             if ((capture != null) && (capture.VideoDevice != null))
 409             {
 410                 //帧大小
 411                 m_FrameSize = capture.FrameSize;
 412                 VideoWindowResize();
 413             }
 414 
 415             // Give our window handle to the NotifyWindow so we'll get called about
 416             // events of interest
 417             if (capture != null)
 418             {
 419                 mediaEvent = capture.MediaEventEx;
 420                 int hr = mediaEvent.SetNotifyWindow(this.Handle, WM_GRAPHNOTIFY, IntPtr.Zero);
 421             }
 422 
 423             btnCue.Enabled = capture != null;
 424             btnStart.Enabled = capture != null;
 425 
 426             // Disable preview to avoid additional flashes (optional)
 427             if (capture != null)
 428             {
 429                 oldPreviewWindow = capture.PreviewWindow;
 430                 capture.PreviewWindow = null;
 431             }
 432 
 433             // Load video devices
 434             Filter videoDevice = null;
 435             if (capture != null)
 436                 videoDevice = capture.VideoDevice;
 437             mnuVideoDevices.MenuItems.Clear();
 438             m = new MenuItem("(None)", new EventHandler(mnuVideoDevices_Click));
 439             m.Checked = (videoDevice == null);
 440             mnuVideoDevices.MenuItems.Add(m);
 441             for (int c = 0; c < filters.VideoInputDevices.Count; c++)
 442             {
 443                 f = filters.VideoInputDevices[c];
 444                 m = new MenuItem(f.Name, new EventHandler(mnuVideoDevices_Click));
 445                 m.Checked = (videoDevice == f);
 446                 mnuVideoDevices.MenuItems.Add(m);
 447             }
 448             mnuVideoDevices.Enabled = (filters.VideoInputDevices.Count > 0);
 449 
 450             // Load audio devices
 451             Filter audioDevice = null;
 452             if (capture != null)
 453                 audioDevice = capture.AudioDevice;
 454             mnuAudioDevices.MenuItems.Clear();
 455             m = new MenuItem("(None)", new EventHandler(mnuAudioDevices_Click));
 456             m.Checked = (audioDevice == null);
 457             mnuAudioDevices.MenuItems.Add(m);
 458             for (int c = 0; c < filters.AudioInputDevices.Count; c++)
 459             {
 460                 f = filters.AudioInputDevices[c];
 461                 m = new MenuItem(f.Name, new EventHandler(mnuAudioDevices_Click));
 462                 m.Checked = (audioDevice == f);
 463                 mnuAudioDevices.MenuItems.Add(m);
 464             }
 465             mnuAudioDevices.Enabled = (filters.AudioInputDevices.Count > 0);
 466 
 467 
 468             // Load video compressors
 469             try
 470             {
 471                 mnuVideoCompressors.MenuItems.Clear();
 472                 m = new MenuItem("(None)", new EventHandler(mnuVideoCompressors_Click));
 473                 m.Checked = (capture.VideoCompressor == null);
 474                 mnuVideoCompressors.MenuItems.Add(m);
 475                 for (int c = 0; c < filters.VideoCompressors.Count; c++)
 476                 {
 477                     f = filters.VideoCompressors[c];
 478                     m = new MenuItem(f.Name, new EventHandler(mnuVideoCompressors_Click));
 479                     m.Checked = (capture.VideoCompressor == f);
 480                     mnuVideoCompressors.MenuItems.Add(m);
 481                 }
 482                 mnuVideoCompressors.Enabled = ((capture.VideoDevice != null) && (filters.VideoCompressors.Count > 0));
 483             }
 484             catch { mnuVideoCompressors.Enabled = false; }
 485 
 486             try
 487             {
 488                 // Only enable the video compression menu option if the compressor
 489                 // supports at least one setting 如果选择菜单视频压缩压缩至少一个端口设置。允许
 490                 mnuCompressionProps.Enabled = (capture.VideoCompressorCaps.GetCaps &
 491                     (CompressionCaps.CanBFrame |
 492                     CompressionCaps.CanKeyFrame |
 493                     CompressionCaps.CanQuality |
 494                     CompressionCaps.CanWindow)) > 0;
 495             }
 496             catch
 497             {
 498                 mnuCompressionProps.Enabled = false;
 499             }
 500 
 501             // Load audio 压缩机(compressors)
 502             try
 503             {
 504                 mnuAudioCompressors.MenuItems.Clear();
 505                 m = new MenuItem("(None)", new EventHandler(mnuAudioCompressors_Click));
 506                 m.Checked = (capture.AudioCompressor == null);
 507                 mnuAudioCompressors.MenuItems.Add(m);
 508                 for (int c = 0; c < filters.AudioCompressors.Count; c++)
 509                 {
 510                     f = filters.AudioCompressors[c];
 511                     m = new MenuItem(f.Name, new EventHandler(mnuAudioCompressors_Click));
 512                     m.Checked = (capture.AudioCompressor == f);
 513                     mnuAudioCompressors.MenuItems.Add(m);
 514                 }
 515                 mnuAudioCompressors.Enabled = ((capture.AudioDevice != null) && (filters.AudioCompressors.Count > 0));
 516             }
 517             catch { mnuAudioCompressors.Enabled = false; }
 518 
 519             // Load video sources
 520             try
 521             {
 522                 mnuVideoSources.MenuItems.Clear();
 523                 current = capture.VideoSource;
 524                 for (int c = 0; c < capture.VideoSources.Count; c++)
 525                 {
 526                     s = capture.VideoSources[c];
 527                     m = new MenuItem(s.Name, new EventHandler(mnuVideoSources_Click));
 528                     m.Checked = (current == s);
 529                     mnuVideoSources.MenuItems.Add(m);
 530                 }
 531                 mnuVideoSources.Enabled = (capture.VideoSources.Count > 0);
 532             }
 533             catch { mnuVideoSources.Enabled = false; }
 534 
 535             // Load audio sources
 536             try
 537             {
 538                 mnuAudioSources.MenuItems.Clear();
 539                 current = capture.AudioSource;
 540                 for (int c = 0; c < capture.AudioSources.Count; c++)
 541                 {
 542                     s = capture.AudioSources[c];
 543                     m = new MenuItem(s.Name, new EventHandler(mnuAudioSources_Click));
 544                     m.Checked = (current == s);
 545                     mnuAudioSources.MenuItems.Add(m);
 546                 }
 547                 mnuAudioSources.Enabled = (capture.AudioSources.Count > 0);
 548             }
 549             catch { mnuAudioSources.Enabled = false; }
 550 
 551             // Load frame rates
 552             try
 553             {
 554                 mnuFrameRates.MenuItems.Clear();
 555                 int frameRate = (int)(capture.FrameRate * 1000);
 556                 m = new MenuItem("15 fps", new EventHandler(mnuFrameRates_Click));
 557                 m.Checked = (frameRate == 15000);
 558                 mnuFrameRates.MenuItems.Add(m);
 559                 m = new MenuItem("24 fps (Film)", new EventHandler(mnuFrameRates_Click));
 560                 m.Checked = (frameRate == 24000);
 561                 mnuFrameRates.MenuItems.Add(m);
 562                 m = new MenuItem("25 fps (PAL)", new EventHandler(mnuFrameRates_Click));
 563                 m.Checked = (frameRate == 25000);
 564                 mnuFrameRates.MenuItems.Add(m);
 565                 m = new MenuItem("29.997 fps (NTSC)", new EventHandler(mnuFrameRates_Click));
 566                 m.Checked = (frameRate == 29997) || (frameRate == 29970);
 567                 mnuFrameRates.MenuItems.Add(m);
 568                 m = new MenuItem("30 fps (~NTSC)", new EventHandler(mnuFrameRates_Click));
 569                 m.Checked = (frameRate == 30000);
 570                 mnuFrameRates.MenuItems.Add(m);
 571                 m = new MenuItem("59.994 fps (2xNTSC)", new EventHandler(mnuFrameRates_Click));
 572                 m.Checked = (frameRate == 59994);
 573                 mnuFrameRates.MenuItems.Add(m);
 574                 mnuFrameRates.Enabled = true;
 575             }
 576             catch { mnuFrameRates.Enabled = false; }
 577 
 578             // Load frame sizes
 579             try
 580             {
 581                 mnuFrameSizes.MenuItems.Clear();
 582                 Size frameSize = capture.FrameSize;
 583                 m = new MenuItem("160 x 120", new EventHandler(mnuFrameSizes_Click));
 584                 m.Checked = (frameSize == new Size(160, 120));
 585                 mnuFrameSizes.MenuItems.Add(m);
 586                 m = new MenuItem("320 x 240", new EventHandler(mnuFrameSizes_Click));
 587                 m.Checked = (frameSize == new Size(320, 240));
 588                 mnuFrameSizes.MenuItems.Add(m);
 589                 m = new MenuItem("640 x 480", new EventHandler(mnuFrameSizes_Click));
 590                 m.Checked = (frameSize == new Size(640, 480));
 591                 mnuFrameSizes.MenuItems.Add(m);
 592                 m = new MenuItem("1024 x 768", new EventHandler(mnuFrameSizes_Click));
 593                 m.Checked = (frameSize == new Size(1024, 768));
 594                 mnuFrameSizes.MenuItems.Add(m);
 595                 mnuFrameSizes.Enabled = true;
 596             }
 597             catch { mnuFrameSizes.Enabled = false; }
 598 
 599             // Load audio channels
 600             try
 601             {
 602                 mnuAudioChannels.MenuItems.Clear();
 603                 short audioChannels = capture.AudioChannels;
 604                 m = new MenuItem("单声道 Mono", new EventHandler(mnuAudioChannels_Click));
 605                 m.Checked = (audioChannels == 1);
 606                 mnuAudioChannels.MenuItems.Add(m);
 607                 m = new MenuItem("立体声 Stereo", new EventHandler(mnuAudioChannels_Click));
 608                 m.Checked = (audioChannels == 2);
 609                 mnuAudioChannels.MenuItems.Add(m);
 610                 mnuAudioChannels.Enabled = true;
 611             }
 612             catch { mnuAudioChannels.Enabled = false; }
 613 
 614             // Load音频采样率 Load audio sampling rate
 615             try
 616             {
 617                 mnuAudioSamplingRate.MenuItems.Clear();
 618                 int samplingRate = capture.AudioSamplingRate;
 619                 m = new MenuItem("8 kHz", new EventHandler(mnuAudioSamplingRate_Click));
 620                 m.Checked = (samplingRate == 8000);
 621                 mnuAudioSamplingRate.MenuItems.Add(m);
 622                 m = new MenuItem("11.025 kHz", new EventHandler(mnuAudioSamplingRate_Click));
 623                 m.Checked = (capture.AudioSamplingRate == 11025);
 624                 mnuAudioSamplingRate.MenuItems.Add(m);
 625                 m = new MenuItem("22.05 kHz", new EventHandler(mnuAudioSamplingRate_Click));
 626                 m.Checked = (capture.AudioSamplingRate == 22050);
 627                 mnuAudioSamplingRate.MenuItems.Add(m);
 628                 m = new MenuItem("44.1 kHz", new EventHandler(mnuAudioSamplingRate_Click));
 629                 m.Checked = (capture.AudioSamplingRate == 44100);
 630                 mnuAudioSamplingRate.MenuItems.Add(m);
 631                 mnuAudioSamplingRate.Enabled = true;
 632             }
 633             catch { mnuAudioSamplingRate.Enabled = false; }
 634 
 635             // 加载音频样本大小 Load audio sample sizes
 636             try
 637             {
 638                 mnuAudioSampleSizes.MenuItems.Clear();
 639                 short sampleSize = capture.AudioSampleSize;
 640                 m = new MenuItem("8 bit", new EventHandler(mnuAudioSampleSizes_Click));
 641                 m.Checked = (sampleSize == 8);
 642                 mnuAudioSampleSizes.MenuItems.Add(m);
 643                 m = new MenuItem("16 bit", new EventHandler(mnuAudioSampleSizes_Click));
 644                 m.Checked = (sampleSize == 16);
 645                 mnuAudioSampleSizes.MenuItems.Add(m);
 646                 mnuAudioSampleSizes.Enabled = true;
 647             }
 648             catch { mnuAudioSampleSizes.Enabled = false; }
 649 
 650             // 加载属性页 Load property pages
 651             try
 652             {
 653                 mnuPropertyPages.MenuItems.Clear();
 654                 for (int c = 0; c < capture.PropertyPages.Count; c++)
 655                 {
 656                     p = capture.PropertyPages[c];
 657                     m = new MenuItem(p.Name + "...", new EventHandler(mnuPropertyPages_Click));
 658                     mnuPropertyPages.MenuItems.Add(m);
 659                 }
 660                 mnuPropertyPages.Enabled = (capture.PropertyPages.Count > 0);
 661             }
 662             catch { mnuPropertyPages.Enabled = false; }
 663 
 664             // Load TV Tuner channels
 665             try
 666             {
 667                 mnuChannel.MenuItems.Clear();
 668                 int channel = capture.Tuner.Channel;
 669                 for (int c = 1; c <= 31; c++)
 670                 {
 671                     m = new MenuItem(c.ToString(), new EventHandler(mnuChannel_Click));
 672                     m.Checked = (channel == c);
 673                     mnuChannel.MenuItems.Add(m);
 674                 }
 675                 mnuChannel.Enabled = true;
 676             }
 677             catch { mnuChannel.Enabled = false; }
 678 
 679             // Load TV Tuner input types
 680             try
 681             {
 682                 mnuInputType.MenuItems.Clear();
 683                 m = new MenuItem(DirectX.Capture.TunerInputType.Cable.ToString(), new EventHandler(mnuInputType_Click));
 684                 m.Checked = (capture.Tuner.InputType == DirectX.Capture.TunerInputType.Cable);
 685                 mnuInputType.MenuItems.Add(m);
 686                 m = new MenuItem(DirectX.Capture.TunerInputType.Antenna.ToString(), new EventHandler(mnuInputType_Click));
 687                 m.Checked = (capture.Tuner.InputType == DirectX.Capture.TunerInputType.Antenna);
 688                 mnuInputType.MenuItems.Add(m);
 689                 mnuInputType.Enabled = true;
 690             }
 691             catch { mnuInputType.Enabled = false; }
 692 
 693             // Enable/disable caps
 694             mnuVideoCaps.Enabled = ((capture != null) && (capture.VideoCaps != null));
 695             mnuAudioCaps.Enabled = ((capture != null) && (capture.AudioCaps != null));
 696 
 697             // Check Preview menu option
 698             mnuPreview.Checked = (oldPreviewWindow != null);
 699             mnuPreview.Enabled = (capture != null);
 700 
 701             // Reenable preview if it was enabled before
 702             if (capture != null)
 703                 capture.PreviewWindow = oldPreviewWindow;
 704         }
 705         #endregion 加载
 706 
 707         #region 方法
 708 
 709         private void Stop()
 710         {
 711             try
 712             {
 713                 ShowDropped();
 714                 capture.Stop();
 715                 btnCue.Enabled = true;
 716                 btnStart.Enabled = true;
 717                 btnStop.Enabled = false;
 718                 txtFilename.Enabled = true;
 719                 btnStart.Select();
 720             }
 721             catch (Exception ex)
 722             {
 723                 MessageBox.Show(ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 724             }
 725         }
 726 
 727         private void VideoWindowResize()
 728         {
 729             if ((capture != null) && (m_FrameSize.Width > 0))
 730             {
 731                 Size ns;
 732 
 733                 int iMaxHeight = Math.Min(m_FrameSize.Height, groupBox1.Height - 9); //不要践踏我们的分组框的边界 Don't trample the borders
 734                 int iMaxWidth = Math.Min(m_FrameSize.Width, groupBox1.Width - 4);   // of our GroupBox
 735 
 736                 int t2 = (iMaxWidth * m_FrameSize.Height) / m_FrameSize.Width;
 737 
 738                 // Which proportion do we need to limit?
 739                 if (t2 > iMaxHeight)
 740                 {
 741                     int t1 = (iMaxHeight * m_FrameSize.Width) / m_FrameSize.Height;
 742                     ns = new Size(t1, iMaxHeight);
 743                 }
 744                 else
 745                 {
 746                     ns = new Size(iMaxWidth, t2);
 747                 }
 748                 panelVideo.Size = ns;
 749             }
 750         }
 751 
 752         // 更新 捕获/下降/时间字段的查询捕获装置 
 753         //Update the Capture/Dropped/Duration fields by quering the capture device
 754         private void ShowDropped()
 755         {
 756             TimeSpan duDuration;
 757             long iCurDropped = capture.DroppedVideoFrames;
 758             long iCaptured = capture.CapturedVideoFrames;
 759 
 760             if (iCurDropped >= 0)
 761                 txtDroppedFrames.Text = (iCurDropped - iDroppedBefore).ToString();
 762 
 763             if (iCaptured > 0)
 764                 txtCapturedFrames.Text = iCaptured.ToString();
 765 
 766             duDuration = DateTime.Now - dtBefore;
 767             txtDuration.Text = duDuration.ToString();
 768         }
 769 
 770         #endregion 方法
 771 
 772         #region 菜单事件
 773 
 774 
 775         private void mnuVideoDevices_Click(object sender, System.EventArgs e)
 776         {
 777             try
 778             {
 779                 // 由于视频和音频设备只能通过创建一个新的捕获对象来改变,因此获取当前的设备和处理捕获对象。
 780                 // Get current devices and dispose of capture object
 781                 // because the video and audio device can only be changed
 782                 // by creating a new Capture object.
 783                 Filter videoDevice = null;
 784                 Filter audioDevice = null;
 785                 if (capture != null)
 786                 {
 787                     videoDevice = capture.VideoDevice;
 788                     audioDevice = capture.AudioDevice;
 789                     capture.Dispose();
 790                     capture = null;
 791                 }
 792 
 793                 // Get new video device
 794                 MenuItem m = sender as MenuItem;
 795                 videoDevice = (m.Index > 0 ? filters.VideoInputDevices[m.Index - 1] : null);
 796 
 797                 // Create capture object
 798                 if ((videoDevice != null) || (audioDevice != null))
 799                 {
 800                     capture = new 捕获(videoDevice, audioDevice);
 801                     capture.CaptureComplete += new EventHandler(OnCaptureComplete);
 802                 }
 803 
 804                 // Update the menu
 805                 updateMenu();
 806             }
 807             catch (Exception ex)
 808             {
 809                 MessageBox.Show("视频设备不支持.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 810             }
 811         }
 812 
 813         private void mnuAudioDevices_Click(object sender, System.EventArgs e)
 814         {
 815             try
 816             {
 817                 // Get current devices and dispose of capture object
 818                 // because the video and audio device can only be changed
 819                 // by creating a new Capture object.
 820                 Filter videoDevice = null;
 821                 Filter audioDevice = null;
 822                 Filter videoCompressor = null;
 823                 if (capture != null)
 824                 {
 825                     videoDevice = capture.VideoDevice;
 826                     audioDevice = capture.AudioDevice;
 827                     videoCompressor = capture.VideoCompressor;
 828                     capture.Dispose();
 829                     capture = null;
 830                 }
 831 
 832                 // Get new audio device
 833                 MenuItem m = sender as MenuItem;
 834                 audioDevice = (m.Index > 0 ? filters.AudioInputDevices[m.Index - 1] : null);
 835 
 836                 // Create capture object
 837                 if ((videoDevice != null) || (audioDevice != null))
 838                 {
 839                     capture = new 捕获(videoDevice, audioDevice);
 840                     capture.CaptureComplete += new EventHandler(OnCaptureComplete);
 841                 }
 842 
 843                 capture.VideoCompressor = videoCompressor;
 844 
 845                 // Update the menu
 846                 updateMenu();
 847             }
 848             catch (Exception ex)
 849             {
 850                 MessageBox.Show("音频设备不支持.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 851             }
 852         }
 853 
 854         private void mnuVideoCompressors_Click(object sender, System.EventArgs e)
 855         {
 856             try
 857             {
 858                 // Change the video compressor
 859                 // We subtract 1 from m.Index beacuse the first item is (None)
 860                 MenuItem m = sender as MenuItem;
 861                 capture.VideoCompressor = (m.Index > 0 ? filters.VideoCompressors[m.Index - 1] : null);
 862                 updateMenu();
 863             }
 864             catch (Exception ex)
 865             {
 866                 MessageBox.Show("视频压缩不支持.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 867             }
 868 
 869         }
 870 
 871         private void mnuAudioCompressors_Click(object sender, System.EventArgs e)
 872         {
 873             try
 874             {
 875                 // Change the audio compressor
 876                 // We subtract 1 from m.Index beacuse the first item is (None)
 877                 MenuItem m = sender as MenuItem;
 878                 capture.AudioCompressor = (m.Index > 0 ? filters.AudioCompressors[m.Index - 1] : null);
 879                 updateMenu();
 880             }
 881             catch (Exception ex)
 882             {
 883                 MessageBox.Show("音频压缩不支持.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 884             }
 885         }
 886 
 887         private void mnuVideoSources_Click(object sender, System.EventArgs e)
 888         {
 889             try
 890             {
 891                 // Choose the video source
 892                 // If the device only has one source, this menu item will be disabled
 893                 MenuItem m = sender as MenuItem;
 894                 capture.VideoSource = capture.VideoSources[m.Index];
 895                 updateMenu();
 896             }
 897             catch (Exception ex)
 898             {
 899                 MessageBox.Show("无法设置视频源。请提交错误报告.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 900             }
 901         }
 902 
 903         private void mnuAudioSources_Click(object sender, System.EventArgs e)
 904         {
 905             try
 906             {
 907                 // Choose the audio source
 908                 // If the device only has one source, this menu item will be disabled
 909                 MenuItem m = sender as MenuItem;
 910                 capture.AudioSource = capture.AudioSources[m.Index];
 911                 updateMenu();
 912             }
 913             catch (Exception ex)
 914             {
 915                 MessageBox.Show("无法设置音频源。请提交错误报告.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 916             }
 917         }
 918 
 919 
 920         private void mnuExit_Click(object sender, System.EventArgs e)
 921         {
 922             if (capture != null)
 923                 capture.Stop();
 924             Application.Exit();
 925         }
 926 
 927         private void mnuFrameSizes_Click(object sender, System.EventArgs e)
 928         {
 929             try
 930             {
 931                 // Disable preview to avoid additional flashes (optional)
 932                 bool preview = (capture.PreviewWindow != null);
 933                 capture.PreviewWindow = null;
 934 
 935                 // Update the frame size
 936                 MenuItem m = sender as MenuItem;
 937                 string[] s = m.Text.Split('x');
 938                 Size size = new Size(int.Parse(s[0]), int.Parse(s[1]));
 939                 capture.FrameSize = size;
 940 
 941                 // Update the menu
 942                 updateMenu();
 943 
 944                 // Restore previous preview setting
 945                 capture.PreviewWindow = (preview ? panelVideo : null);
 946             }
 947             catch (Exception ex)
 948             {
 949                 MessageBox.Show("帧大小不支持.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 950             }
 951         }
 952 
 953         private void mnuFrameRates_Click(object sender, System.EventArgs e)
 954         {
 955             try
 956             {
 957                 MenuItem m = sender as MenuItem;
 958                 string[] s = m.Text.Split(' ');
 959                 capture.FrameRate = double.Parse(s[0]);
 960                 updateMenu();
 961             }
 962             catch (Exception ex)
 963             {
 964                 MessageBox.Show("不支持的帧速率.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 965             }
 966         }
 967 
 968         private void mnuAudioChannels_Click(object sender, System.EventArgs e)
 969         {
 970             try
 971             {
 972                 MenuItem m = sender as MenuItem;
 973                 capture.AudioChannels = (short)Math.Pow(2, m.Index);
 974                 updateMenu();
 975             }
 976             catch (Exception ex)
 977             {
 978                 MessageBox.Show("不支持的音频信道数.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 979             }
 980         }
 981 
 982         private void mnuAudioSamplingRate_Click(object sender, System.EventArgs e)
 983         {
 984             try
 985             {
 986                 MenuItem m = sender as MenuItem;
 987                 string[] s = m.Text.Split(' ');
 988                 int samplingRate = (int)(double.Parse(s[0]) * 1000);
 989                 capture.AudioSamplingRate = samplingRate;
 990                 updateMenu();
 991             }
 992             catch (Exception ex)
 993             {
 994                 MessageBox.Show("不支持音频采样率.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 995             }
 996         }
 997 
 998         private void mnuAudioSampleSizes_Click(object sender, System.EventArgs e)
 999         {
1000             try
1001             {
1002                 MenuItem m = sender as MenuItem;
1003                 string[] s = m.Text.Split(' ');
1004                 short sampleSize = short.Parse(s[0]);
1005                 capture.AudioSampleSize = sampleSize;
1006                 updateMenu();
1007             }
1008             catch (Exception ex)
1009             {
1010                 MessageBox.Show("音频样本大小不支持.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
1011             }
1012         }
1013 
1014         private void mnuPreview_Click(object sender, System.EventArgs e)
1015         {
1016             try
1017             {
1018                 if (capture.PreviewWindow == null)
1019                 {
1020                     capture.PreviewWindow = panelVideo;
1021                     mnuPreview.Checked = true;
1022                 }
1023                 else
1024                 {
1025                     capture.PreviewWindow = null;
1026                     mnuPreview.Checked = false;
1027                 }
1028             }
1029             catch (Exception ex)
1030             {
1031                 MessageBox.Show("无法启用/禁用预览。请提交一个错误报告。\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
1032             }
1033         }
1034 
1035         private void mnuPropertyPages_Click(object sender, System.EventArgs e)
1036         {
1037             try
1038             {
1039                 MenuItem m = sender as MenuItem;
1040                 capture.PropertyPages[m.Index].Show(this);
1041                 updateMenu();
1042             }
1043             catch (Exception ex)
1044             {
1045                 MessageBox.Show("无法显示属性页。请提交一个错误报告.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
1046             }
1047         }
1048 
1049         private void mnuChannel_Click(object sender, System.EventArgs e)
1050         {
1051             try
1052             {
1053                 MenuItem m = sender as MenuItem;
1054                 capture.Tuner.Channel = m.Index + 1;
1055                 updateMenu();
1056             }
1057             catch (Exception ex)
1058             {
1059                 MessageBox.Show("无法更改通道。请提交一个错误报告.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
1060             }
1061         }
1062 
1063         private void mnuInputType_Click(object sender, System.EventArgs e)
1064         {
1065             try
1066             {
1067                 MenuItem m = sender as MenuItem;
1068                 capture.Tuner.InputType = (DirectX.Capture.TunerInputType)m.Index;
1069                 updateMenu();
1070             }
1071             catch (Exception ex)
1072             {
1073                 MessageBox.Show("无法更改调谐器输入类型。请提交一个错误报告.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
1074             }
1075         }
1076 
1077         private void mnuVideoCaps_Click(object sender, System.EventArgs e)
1078         {
1079             try
1080             {
1081                 string s;
1082                 s = String.Format(
1083                     "输入尺寸:\t\t{0} x {1}\n" +
1084                     "\n" +
1085                     "最小帧长度:\t\t{2} x {3}\n" +//最小帧长度
1086                     "最大帧长度:\t\t{4} x {5}\n" +//最大帧长度
1087                     "帧尺寸粒度 X:\t{6}\n" +//帧大小粒度
1088                     "帧尺寸粒度 Y:\t{7}\n" +
1089                     "\n" +
1090                     "最小帧速率:\t\t{8:0.000} fps\n" +//最小帧速率
1091                     "最大帧速率:\t\t{9:0.000} fps\n",
1092                     capture.VideoCaps.InputSize.Width, capture.VideoCaps.InputSize.Height,
1093                     capture.VideoCaps.MinFrameSize.Width, capture.VideoCaps.MinFrameSize.Height,
1094                     capture.VideoCaps.MaxFrameSize.Width, capture.VideoCaps.MaxFrameSize.Height,
1095                     capture.VideoCaps.FrameSizeGranularityX,
1096                     capture.VideoCaps.FrameSizeGranularityY,
1097                     capture.VideoCaps.MinFrameRate,
1098                     capture.VideoCaps.MaxFrameRate);
1099                 MessageBox.Show(s, "视频设备能力", MessageBoxButtons.OK, MessageBoxIcon.Information);
1100 
1101             }
1102             catch (Exception ex)
1103             {
1104                 MessageBox.Show("无法显示视频功能。请提交一个错误报告.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
1105             }
1106         }
1107 
1108         private void mnuAudioCaps_Click(object sender, System.EventArgs e)
1109         {
1110             try
1111             {
1112                 string s;
1113                 s = String.Format(
1114                     "Min Channels:\t\t{0}\n" +
1115                     "Max Channels:\t\t{1}\n" +
1116                     "Channels Granularity:\t{2}\n" +
1117                     "\n" +
1118                     "Min Sample Size:\t\t{3}\n" +
1119                     "Max Sample Size:\t\t{4}\n" +
1120                     "Sample Size Granularity:\t{5}\n" +
1121                     "\n" +
1122                     "Min Sampling Rate:\t\t{6}\n" +
1123                     "Max Sampling Rate:\t\t{7}\n" +
1124                     "Sampling Rate Granularity:\t{8}\n",
1125                     capture.AudioCaps.MinimumChannels,
1126                     capture.AudioCaps.MaximumChannels,
1127                     capture.AudioCaps.ChannelsGranularity,
1128                     capture.AudioCaps.MinimumSampleSize,
1129                     capture.AudioCaps.MaximumSampleSize,
1130                     capture.AudioCaps.SampleSizeGranularity,
1131                     capture.AudioCaps.MinimumSamplingRate,
1132                     capture.AudioCaps.MaximumSamplingRate,
1133                     capture.AudioCaps.SamplingRateGranularity);
1134                 MessageBox.Show(s, "音频设备能力", MessageBoxButtons.OK, MessageBoxIcon.Information);
1135 
1136             }
1137             catch (Exception ex)
1138             {
1139                 MessageBox.Show("Unable display audio capabilities. Please submit a bug report.\n\n" + ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
1140             }
1141         }
1142 
1143         // 单击“菜单”选项显示压缩机属性 On clicking the menu option to display Compressor Properties
1144         private void mnuCompressionProps_Click(object sender, System.EventArgs e)
1145         {
1146             // Prepare to show the form
1147             CompressionProps m = new CompressionProps();
1148 
1149             // Read what compression capabilities are available
1150             CompressionCaps i = capture.VideoCompressorCaps.GetCaps;
1151 
1152             bool bSet = (i & CompressionCaps.CanKeyFrame) > 0;
1153 
1154             // Enable the available keyframe controls
1155             m.txtKeyFrame.Enabled = bSet;
1156             m.labKeyFrame.Enabled = bSet;
1157             m.chkKeyFrame.Enabled = bSet;
1158 
1159             // copy in the default values
1160             if (bSet)
1161             {
1162                 long v = capture.VideoCompressorCaps.KeyFrameRate;
1163 
1164                 // Using default?
1165                 if (v < 0)
1166                 {
1167                     m.txtKeyFrame.Text = "";
1168                     m.chkKeyFrame.Checked = true;
1169                     m.txtKeyFrame.Enabled = false;
1170                 }
1171                 else
1172                 {
1173                     m.txtKeyFrame.Text = v.ToString();
1174                     m.chkKeyFrame.Checked = false;
1175                 }
1176             }
1177 
1178             bSet = (i & CompressionCaps.CanBFrame) > 0;
1179 
1180             // Enable the available PFrames controls
1181             m.txtPFrames.Enabled = bSet;
1182             m.labPFrames.Enabled = bSet;
1183             m.chkPFrames.Enabled = bSet;
1184             if (bSet)
1185             {
1186                 long v = capture.VideoCompressorCaps.PFramesPerKeyFrame;
1187 
1188                 // Using default?
1189                 if (v < 0)
1190                 {
1191                     m.txtPFrames.Text = "";
1192                     m.chkPFrames.Checked = true;
1193                     m.txtPFrames.Enabled = false;
1194                 }
1195                 else
1196                 {
1197                     m.txtPFrames.Text = v.ToString();
1198                     m.chkPFrames.Checked = false;
1199                 }
1200             }
1201 
1202             bSet = (i & CompressionCaps.CanWindow) > 0;
1203 
1204             // Enable the available WindowSize controls
1205             m.txtWindowSize.Enabled = bSet;
1206             m.labWindowSize.Enabled = bSet;
1207             m.chkWindowSize.Enabled = bSet;
1208             m.chkWindowSize.Checked = false;
1209 
1210             if (bSet)
1211             {
1212                 m.txtWindowSize.Text = capture.VideoCompressorCaps.WindowSize.ToString();
1213             }
1214 
1215             bSet = (i & CompressionCaps.CanQuality) > 0;
1216 
1217             // Enable the available Quality controls
1218             m.txtQuality.Enabled = bSet;
1219             m.trkQuality.Enabled = bSet;
1220             m.labQuality.Enabled = bSet;
1221             m.chkQuality.Enabled = bSet;
1222             if (bSet)
1223             {
1224                 long v = capture.VideoCompressorCaps.Quality;
1225 
1226                 // Using default?
1227                 if (v < 0)
1228                 {
1229                     m.txtQuality.Text = "";
1230                     m.chkQuality.Checked = true;
1231                     m.trkQuality.Value = 0;
1232                     m.trkQuality.Enabled = false;
1233                     m.txtQuality.Enabled = false;
1234                 }
1235                 else
1236                 {
1237                     m.txtQuality.Text = v.ToString();
1238                     m.chkQuality.Checked = false;
1239                     m.trkQuality.Value = capture.VideoCompressorCaps.Quality;
1240                 }
1241             }
1242 
1243             // Display the form
1244             DialogResult a = m.ShowDialog(this);
1245 
1246             // If the user clicked OK, set the values they specified
1247             if (DialogResult.OK == a)
1248             {
1249                 if ((i & CompressionCaps.CanKeyFrame) > 0)
1250                 {
1251                     int v;
1252                     if (m.chkKeyFrame.Checked)
1253                     {
1254                         // Use default
1255                         v = -1;
1256                     }
1257                     else
1258                     {
1259                         v = Convert.ToInt32(m.txtKeyFrame.Text);
1260                     }
1261                     capture.VideoCompressorCaps.KeyFrameRate = v;
1262                 }
1263 
1264                 if ((i & CompressionCaps.CanBFrame) > 0)
1265                 {
1266                     int v;
1267                     if (m.chkPFrames.Checked)
1268                     {
1269                         // Use default
1270                         v = -1;
1271                     }
1272                     else
1273                     {
1274                         v = Convert.ToInt32(m.txtPFrames.Text);
1275                     }
1276                     capture.VideoCompressorCaps.PFramesPerKeyFrame = v;
1277                 }
1278 
1279                 if ((i & CompressionCaps.CanWindow) > 0)
1280                 {
1281                     long v;
1282                     if (m.chkWindowSize.Checked)
1283                     {
1284                         // Use default
1285                         v = 1;
1286                     }
1287                     else
1288                     {
1289                         v = Convert.ToInt64(m.txtWindowSize.Text);
1290                     }
1291                     capture.VideoCompressorCaps.WindowSize = v;
1292                 }
1293 
1294                 if ((i & CompressionCaps.CanQuality) > 0)
1295                 {
1296                     int v;
1297 
1298                     if (m.chkQuality.Checked)
1299                     {
1300                         // Use default
1301                         v = -1;
1302                     }
1303                     else
1304                     {
1305                         v = Convert.ToInt32(m.txtQuality.Text);
1306                     }
1307                     capture.VideoCompressorCaps.Quality = v;
1308                 }
1309             }
1310         }
1311 
1312         #endregion 菜单事件
1313 
1314         #region 事件
1315 
1316 
1317         private void btnExit_Click(object sender, System.EventArgs e)
1318         {
1319             if (capture != null)
1320             {
1321                 capture.Stop();
1322                 SaveDefaults();
1323             }
1324             Application.Exit();
1325         }
1326 
1327         private void btnCue_Click(object sender, System.EventArgs e)
1328         {
1329             try
1330             {
1331                 if (capture == null)
1332                     throw new ApplicationException("请选择一个视频和/或音频设备.");
1333                 if (!capture.Cued)
1334                     capture.Filename = txtFilename.Text;
1335 
1336                 CaptureResult = 0;
1337                 txtDroppedFrames.Text = "0";
1338                 txtCapturedFrames.Text = "0";
1339                 txtDuration.Text = "";
1340                 txtFilename.Enabled = false;
1341 
1342                 capture.Cue();
1343                 capture.PreSize(Convert.ToInt64(txtPreSize.Text) * 1024000);
1344 
1345                 btnCue.Enabled = false;
1346                 btnStop.Enabled = true;
1347                 //“使用cue() 先于 start() 做的所有准备工作,
1348                 //需要做的事开始捕捉。现在,当您单击“开始”时,
1349                 //捕获的速度将比您刚刚单击“启动”开始的速度更快。
1350                 //使用cue()完全是可选的。使用cue()坏处是预览被禁用,直到捕获开始。
1351                 MessageBox.Show("Use Cue() before Start() to " +
1352                     "do all the preparation work that needs to be done to start a " +
1353                     "capture. Now, when you click Start the capture will begin faster " +
1354                     "than if you had just clicked Start. Using Cue() is completely " +
1355                     "optional. The downside to using Cue() is the preview is disabled until " +
1356                     "the capture begins.", "Ready to Capture", MessageBoxButtons.OK, MessageBoxIcon.Information);
1357                 btnStart.Select();
1358             }
1359             catch (Exception ex)
1360             {
1361                 MessageBox.Show(ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
1362             }
1363         }
1364 
1365         private void btnStart_Click(object sender, System.EventArgs e)
1366         {
1367             try
1368             {
1369                 if (capture == null)
1370                     throw new ApplicationException("请选择一个视频和/或音频设备。");
1371                 if (!capture.Cued)
1372                     capture.Filename = txtFilename.Text;
1373 
1374                 CaptureResult = 0;
1375                 iDroppedBefore = capture.DroppedVideoFrames;
1376                 dtBefore = DateTime.Now;
1377                 txtDroppedFrames.Text = "0";
1378                 txtCapturedFrames.Text = "0";
1379                 txtDuration.Text = "";
1380                 txtFilename.Enabled = false;
1381                 capture.Start();
1382                 tmrTime1.Enabled = true;
1383                 btnCue.Enabled = false;
1384                 btnStart.Enabled = false;
1385                 btnStop.Enabled = true;
1386                 btnStop.Select();
1387             }
1388             catch (Exception ex)
1389             {
1390                 MessageBox.Show(ex.Message + "\n\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
1391             }
1392         }
1393 
1394         private void btnStop_Click(object sender, System.EventArgs e)
1395         {
1396             Stop();
1397         }
1398 
1399 
1400         private void OnCaptureComplete(object sender, EventArgs e)
1401         {
1402             // 显示捕获捕获完成事件 Demonstrate the Capture.CaptureComplete event.
1403             tmrTime1.Enabled = false;
1404 
1405             // 如果窗口消息处理程序中止了我们… If the windows message handler aborted us...
1406             if (CaptureResult != 0)//捕获的结果
1407                 MessageBox.Show("Capture Error 0x" + CaptureResult.ToString("x"), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
1408         }
1409 
1410         // Update the Captured/Dropped fields while capturing
1411         private void tmrTime1_Tick(Object myObject, EventArgs myEventArgs)
1412         {
1413             if (CaptureResult == 0)
1414             {
1415                 ShowDropped();
1416             }
1417             else
1418             {
1419                 Stop();
1420             }
1421         }
1422 
1423 
1424         private void groupBox1_Resize(object sender, System.EventArgs e)
1425         {
1426             VideoWindowResize();
1427         }
1428 
1429         #endregion 事件
1430         // http://www.cnblogs.com/endv/p/6052511.html
1431 
1432         #region private
1433         private System.Windows.Forms.TextBox txtFilename;
1434         private System.Windows.Forms.Label label1;
1435         private System.Windows.Forms.Button btnStart;
1436         private System.Windows.Forms.Button btnStop;
1437         private System.Windows.Forms.Button btnExit;
1438         private System.Windows.Forms.MenuItem menuItem1;
1439         private System.Windows.Forms.MenuItem menuItem7;
1440         private System.Windows.Forms.MainMenu mainMenu;
1441         private System.Windows.Forms.MenuItem mnuExit;
1442         private System.Windows.Forms.MenuItem mnuDevices;
1443         private System.Windows.Forms.MenuItem mnuVideoDevices;
1444         private System.Windows.Forms.MenuItem mnuAudioDevices;
1445         private System.Windows.Forms.MenuItem mnuVideoCompressors;
1446         private System.Windows.Forms.MenuItem mnuAudioCompressors;
1447         private System.Windows.Forms.MenuItem mnuVideoSources;
1448         private System.Windows.Forms.MenuItem mnuAudioSources;
1449         private System.Windows.Forms.Panel panelVideo;
1450         private System.Windows.Forms.MenuItem menuItem4;
1451         private System.Windows.Forms.MenuItem mnuAudioChannels;
1452         private System.Windows.Forms.MenuItem mnuAudioSamplingRate;
1453         private System.Windows.Forms.MenuItem mnuAudioSampleSizes;
1454         private System.Windows.Forms.MenuItem menuItem5;
1455         private System.Windows.Forms.MenuItem mnuFrameSizes;
1456         private System.Windows.Forms.MenuItem mnuFrameRates;
1457         private System.Windows.Forms.Button btnCue;
1458         private System.Windows.Forms.MenuItem menuItem6;
1459         private System.Windows.Forms.MenuItem mnuPreview;
1460         private System.Windows.Forms.MenuItem menuItem8;
1461         private System.Windows.Forms.MenuItem mnuPropertyPages;
1462         private System.Windows.Forms.MenuItem mnuVideoCaps;
1463         private System.Windows.Forms.MenuItem mnuAudioCaps;
1464         private System.Windows.Forms.MenuItem mnuChannel;
1465         private System.Windows.Forms.MenuItem menuItem3;
1466         private System.Windows.Forms.MenuItem mnuInputType;
1467         private System.Windows.Forms.TextBox txtDroppedFrames;
1468         private System.Windows.Forms.Label label2;
1469         private System.Windows.Forms.Timer tmrTime1;
1470         private System.Windows.Forms.Label label3;
1471         private System.Windows.Forms.TextBox txtDuration;
1472         private System.Windows.Forms.Label label4;
1473         private System.Windows.Forms.TextBox txtCapturedFrames;
1474         private System.Windows.Forms.MenuItem mnuCompressionProps;
1475         private System.Windows.Forms.GroupBox groupBox1;
1476         private System.Windows.Forms.Label label5;
1477         private System.Windows.Forms.TextBox txtPreSize;
1478         private System.ComponentModel.IContainer components;
1479         #endregion private
1480 
1481         /// 
1482         /// Clean up any resources being used.
1483         /// 
1484         protected override void Dispose(bool disposing)
1485         {
1486             if (disposing)
1487             {
1488                 if (components != null)
1489                 {
1490                     components.Dispose();
1491                 }
1492             }
1493             base.Dispose(disposing);
1494         }
1495         // 媒体事件发送使用Windows消息 Media events are sent to use as windows messages
1496         protected override void WndProc(ref Message m)
1497         {
1498             switch (m.Msg)
1499             {
1500                 // If this is a windows media message
1501                 case WM_GRAPHNOTIFY:
1502                     EventCode eventCode;//捕获已中止?
1503                     IntPtr p1, p2;
1504                     int hr;
1505 
1506                     hr = mediaEvent.GetEvent(out eventCode, out p1, out p2, 0);
1507                     while (hr == 0)
1508                     {
1509                         // 处理事件 
1510                         // 捕获已中止 The capture has been aborted
1511                         if (eventCode == EventCode.ErrorAbort)
1512                         {
1513                             CaptureResult = p1.ToInt32();
1514                         }
1515 
1516                         // 释放参数  
1517                         mediaEvent.FreeEventParams(eventCode, p1, p2);
1518 
1519                         // 
1520                         // 检查附加事件 check for additional events
1521                         hr = mediaEvent.GetEvent(out eventCode, out p1, out p2, 0);
1522                     }
1523                     break;
1524 
1525                 // 所有其它的消息 All other messages
1526                 default:
1527                     // 未经处理的窗口消息 unhandled window message
1528                     base.WndProc(ref m);
1529                     break;
1530             }
1531         }
1532 
1533 
1534         #region Windows Form Designer generated code
1535         /// 
1536         /// Required method for Designer support - do not modify
1537         /// the contents of this method with the code editor.
1538         /// 
1539         private void InitializeComponent()
1540         { // http://www.cnblogs.com/endv/p/6052511.html
1541 
1542             this.components = new System.ComponentModel.Container();
1543             this.txtFilename = new System.Windows.Forms.TextBox();
1544             this.label1 = new System.Windows.Forms.Label();
1545             this.btnStart = new System.Windows.Forms.Button();
1546             this.btnStop = new System.Windows.Forms.Button();
1547             this.btnExit = new System.Windows.Forms.Button();
1548             this.mainMenu = new System.Windows.Forms.MainMenu(this.components);
1549             this.menuItem1 = new System.Windows.Forms.MenuItem();
1550             this.mnuExit = new System.Windows.Forms.MenuItem();
1551             this.mnuDevices = new System.Windows.Forms.MenuItem();
1552             this.mnuVideoDevices = new System.Windows.Forms.MenuItem();
1553             this.mnuAudioDevices = new System.Windows.Forms.MenuItem();
1554             this.menuItem4 = new System.Windows.Forms.MenuItem();
1555             this.mnuVideoCompressors = new System.Windows.Forms.MenuItem();
1556             this.mnuAudioCompressors = new System.Windows.Forms.MenuItem();
1557             this.menuItem7 = new System.Windows.Forms.MenuItem();
1558             this.mnuVideoSources = new System.Windows.Forms.MenuItem();
1559             this.mnuFrameSizes = new System.Windows.Forms.MenuItem();
1560             this.mnuFrameRates = new System.Windows.Forms.MenuItem();
1561             this.mnuVideoCaps = new System.Windows.Forms.MenuItem();
1562             this.menuItem5 = new System.Windows.Forms.MenuItem();
1563             this.mnuAudioSources = new System.Windows.Forms.MenuItem();
1564             this.mnuAudioChannels = new System.Windows.Forms.MenuItem();
1565             this.mnuAudioSamplingRate = new System.Windows.Forms.MenuItem();
1566             this.mnuAudioSampleSizes = new System.Windows.Forms.MenuItem();
1567             this.mnuAudioCaps = new System.Windows.Forms.MenuItem();
1568             this.menuItem3 = new System.Windows.Forms.MenuItem();
1569             this.mnuChannel = new System.Windows.Forms.MenuItem();
1570             this.mnuInputType = new System.Windows.Forms.MenuItem();
1571             this.menuItem6 = new System.Windows.Forms.MenuItem();
1572             this.mnuCompressionProps = new System.Windows.Forms.MenuItem();
1573             this.mnuPropertyPages = new System.Windows.Forms.MenuItem();
1574             this.menuItem8 = new System.Windows.Forms.MenuItem();
1575             this.mnuPreview = new System.Windows.Forms.MenuItem();
1576             this.panelVideo = new System.Windows.Forms.Panel();
1577             this.btnCue = new System.Windows.Forms.Button();
1578             this.txtDroppedFrames = new System.Windows.Forms.TextBox();
1579             this.label2 = new System.Windows.Forms.Label();
1580             this.tmrTime1 = new System.Windows.Forms.Timer(this.components);
1581             this.txtDuration = new System.Windows.Forms.TextBox();
1582             this.label3 = new System.Windows.Forms.Label();
1583             this.label4 = new System.Windows.Forms.Label();
1584             this.txtCapturedFrames = new System.Windows.Forms.TextBox();
1585             this.groupBox1 = new System.Windows.Forms.GroupBox();
1586             this.txtPreSize = new System.Windows.Forms.TextBox();
1587             this.label5 = new System.Windows.Forms.Label();
1588             this.groupBox1.SuspendLayout();
1589             this.SuspendLayout();
1590             // 
1591             // txtFilename
1592             // 
1593             this.txtFilename.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1594             this.txtFilename.Location = new System.Drawing.Point(239, 330);
1595             this.txtFilename.Name = "txtFilename";
1596             this.txtFilename.Size = new System.Drawing.Size(182, 21);
1597             this.txtFilename.TabIndex = 0;
1598             this.txtFilename.Text = "test.avi";
1599             // 
1600             // label1
1601             // 
1602             this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1603             this.label1.Location = new System.Drawing.Point(172, 330);
1604             this.label1.Name = "label1";
1605             this.label1.Size = new System.Drawing.Size(76, 17);
1606             this.label1.TabIndex = 1;
1607             this.label1.Text = "文件名:";
1608             // 
1609             // btnStart
1610             // 
1611             this.btnStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1612             this.btnStart.Location = new System.Drawing.Point(258, 364);
1613             this.btnStart.Name = "btnStart";
1614             this.btnStart.Size = new System.Drawing.Size(77, 26);
1615             this.btnStart.TabIndex = 2;
1616             this.btnStart.Text = "开始";
1617             this.btnStart.Click += new System.EventHandler(this.btnStart_Click);
1618             // 
1619             // btnStop
1620             // 
1621             this.btnStop.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1622             this.btnStop.Enabled = false;
1623             this.btnStop.Location = new System.Drawing.Point(344, 364);
1624             this.btnStop.Name = "btnStop";
1625             this.btnStop.Size = new System.Drawing.Size(77, 26);
1626             this.btnStop.TabIndex = 3;
1627             this.btnStop.Text = "停止";
1628             this.btnStop.Click += new System.EventHandler(this.btnStop_Click);
1629             // 
1630             // btnExit
1631             // 
1632             this.btnExit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1633             this.btnExit.Location = new System.Drawing.Point(440, 364);
1634             this.btnExit.Name = "btnExit";
1635             this.btnExit.Size = new System.Drawing.Size(87, 26);
1636             this.btnExit.TabIndex = 4;
1637             this.btnExit.Text = "退出";
1638             this.btnExit.Click += new System.EventHandler(this.btnExit_Click);
1639             // 
1640             // mainMenu
1641             // 
1642             this.mainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
1643             this.menuItem1,
1644             this.mnuDevices,
1645             this.menuItem7});
1646             // 
1647             // menuItem1
1648             // 
1649             this.menuItem1.Index = 0;
1650             this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
1651             this.mnuExit});
1652             this.menuItem1.Text = "文件";
1653             // 
1654             // mnuExit
1655             // 
1656             this.mnuExit.Index = 0;
1657             this.mnuExit.Text = "E&xit";
1658             this.mnuExit.Click += new System.EventHandler(this.mnuExit_Click);
1659             // 
1660             // mnuDevices
1661             // 
1662             this.mnuDevices.Index = 1;
1663             this.mnuDevices.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
1664             this.mnuVideoDevices,
1665             this.mnuAudioDevices,
1666             this.menuItem4,
1667             this.mnuVideoCompressors,
1668             this.mnuAudioCompressors});
1669             this.mnuDevices.Text = "设备";
1670             // 
1671             // mnuVideoDevices
1672             // 
1673             this.mnuVideoDevices.Index = 0;
1674             this.mnuVideoDevices.Text = "视频设备";
1675             // 
1676             // mnuAudioDevices
1677             // 
1678             this.mnuAudioDevices.Index = 1;
1679             this.mnuAudioDevices.Text = "音频设备";
1680             // 
1681             // menuItem4
1682             // 
1683             this.menuItem4.Index = 2;
1684             this.menuItem4.Text = "-";
1685             // 
1686             // mnuVideoCompressors
1687             // 
1688             this.mnuVideoCompressors.Index = 3;
1689             this.mnuVideoCompressors.Text = "视频压缩";
1690             // 
1691             // mnuAudioCompressors
1692             // 
1693             this.mnuAudioCompressors.Index = 4;
1694             this.mnuAudioCompressors.Text = "音频压缩";
1695             // 
1696             // menuItem7
1697             // 
1698             this.menuItem7.Index = 2;
1699             this.menuItem7.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
1700             this.mnuVideoSources,
1701             this.mnuFrameSizes,
1702             this.mnuFrameRates,
1703             this.mnuVideoCaps,
1704             this.menuItem5,
1705             this.mnuAudioSources,
1706             this.mnuAudioChannels,
1707             this.mnuAudioSamplingRate,
1708             this.mnuAudioSampleSizes,
1709             this.mnuAudioCaps,
1710             this.menuItem3,
1711             this.mnuChannel,
1712             this.mnuInputType,
1713             this.menuItem6,
1714             this.mnuCompressionProps,
1715             this.mnuPropertyPages,
1716             this.menuItem8,
1717             this.mnuPreview});
1718             this.menuItem7.Text = "选项";
1719             // 
1720             // mnuVideoSources
1721             // 
1722             this.mnuVideoSources.Index = 0;
1723             this.mnuVideoSources.Text = "视频源";
1724             // 
1725             // mnuFrameSizes
1726             // 
1727             this.mnuFrameSizes.Index = 1;
1728             this.mnuFrameSizes.Text = "视频帧的大小";
1729             // 
1730             // mnuFrameRates
1731             // 
1732             this.mnuFrameRates.Index = 2;
1733             this.mnuFrameRates.Text = "视频的帧速率";
1734             this.mnuFrameRates.Click += new System.EventHandler(this.mnuFrameRates_Click);
1735             // 
1736             // mnuVideoCaps
1737             // 
1738             this.mnuVideoCaps.Index = 3;
1739             this.mnuVideoCaps.Text = "视频特性";
1740             this.mnuVideoCaps.Click += new System.EventHandler(this.mnuVideoCaps_Click);
1741             // 
1742             // menuItem5
1743             // 
1744             this.menuItem5.Index = 4;
1745             this.menuItem5.Text = "-";
1746             // 
1747             // mnuAudioSources
1748             // 
1749             this.mnuAudioSources.Index = 5;
1750             this.mnuAudioSources.Text = "音频源";
1751             // 
1752             // mnuAudioChannels
1753             // 
1754             this.mnuAudioChannels.Index = 6;
1755             this.mnuAudioChannels.Text = "音频通道";
1756             // 
1757             // mnuAudioSamplingRate
1758             // 
1759             this.mnuAudioSamplingRate.Index = 7;
1760             this.mnuAudioSamplingRate.Text = "音频采样率";
1761             // 
1762             // mnuAudioSampleSizes
1763             // 
1764             this.mnuAudioSampleSizes.Index = 8;
1765             this.mnuAudioSampleSizes.Text = "音频样本大小";
1766             // 
1767             // mnuAudioCaps
1768             // 
1769             this.mnuAudioCaps.Index = 9;
1770             this.mnuAudioCaps.Text = "音频功能...";
1771             this.mnuAudioCaps.Click += new System.EventHandler(this.mnuAudioCaps_Click);
1772             // 
1773             // menuItem3
1774             // 
1775             this.menuItem3.Index = 10;
1776             this.menuItem3.Text = "-";
1777             // 
1778             // mnuChannel
1779             // 
1780             this.mnuChannel.Index = 11;
1781             this.mnuChannel.Text = "TV调谐器频道";
1782             // 
1783             // mnuInputType
1784             // 
1785             this.mnuInputType.Index = 12;
1786             this.mnuInputType.Text = "TV 调谐器输入类型";
1787             this.mnuInputType.Click += new System.EventHandler(this.mnuInputType_Click);
1788             // 
1789             // menuItem6
1790             // 
1791             this.menuItem6.Index = 13;
1792             this.menuItem6.Text = "-";
1793             // 
1794             // mnuCompressionProps
1795             // 
1796             this.mnuCompressionProps.Index = 14;
1797             this.mnuCompressionProps.Text = "压缩道具...";
1798             this.mnuCompressionProps.Click += new System.EventHandler(this.mnuCompressionProps_Click);
1799             // 
1800             // mnuPropertyPages
1801             // 
1802             this.mnuPropertyPages.Index = 15;
1803             this.mnuPropertyPages.Text = "属性页";
1804             // 
1805             // menuItem8
1806             // 
1807             this.menuItem8.Index = 16;
1808             this.menuItem8.Text = "-";
1809             // 
1810             // mnuPreview
1811             // 
1812             this.mnuPreview.Index = 17;
1813             this.mnuPreview.Text = "预览";
1814             this.mnuPreview.Click += new System.EventHandler(this.mnuPreview_Click);
1815             // 
1816             // panelVideo
1817             // 
1818             this.panelVideo.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
1819             | System.Windows.Forms.AnchorStyles.Left)
1820             | System.Windows.Forms.AnchorStyles.Right)));
1821             this.panelVideo.Location = new System.Drawing.Point(2, 8);
1822             this.panelVideo.Name = "panelVideo";
1823             this.panelVideo.Size = new System.Drawing.Size(735, 303);
1824             this.panelVideo.TabIndex = 6;
1825             // 
1826             // btnCue
1827             // 
1828             this.btnCue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1829             this.btnCue.Location = new System.Drawing.Point(172, 364);
1830             this.btnCue.Name = "btnCue";
1831             this.btnCue.Size = new System.Drawing.Size(76, 26);
1832             this.btnCue.TabIndex = 1;
1833             this.btnCue.Text = "提示";
1834             this.btnCue.Click += new System.EventHandler(this.btnCue_Click);
1835             // 
1836             // txtDroppedFrames
1837             // 
1838             this.txtDroppedFrames.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1839             this.txtDroppedFrames.CausesValidation = false;
1840             this.txtDroppedFrames.Location = new System.Drawing.Point(680, 330);
1841             this.txtDroppedFrames.Name = "txtDroppedFrames";
1842             this.txtDroppedFrames.ReadOnly = true;
1843             this.txtDroppedFrames.Size = new System.Drawing.Size(68, 21);
1844             this.txtDroppedFrames.TabIndex = 9;
1845             this.txtDroppedFrames.TabStop = false;
1846             this.txtDroppedFrames.Text = "0";
1847             // 
1848             // label2
1849             // 
1850             this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1851             this.label2.Location = new System.Drawing.Point(613, 330);
1852             this.label2.Name = "label2";
1853             this.label2.Size = new System.Drawing.Size(58, 25);
1854             this.label2.TabIndex = 10;
1855             this.label2.Text = "丢帧";
1856             // 
1857             // tmrTime1
1858             // 
1859             this.tmrTime1.Interval = 999;
1860             this.tmrTime1.Tick += new System.EventHandler(this.tmrTime1_Tick);
1861             // 
1862             // txtDuration
1863             // 
1864             this.txtDuration.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1865             this.txtDuration.Location = new System.Drawing.Point(527, 338);
1866             this.txtDuration.Name = "txtDuration";
1867             this.txtDuration.ReadOnly = true;
1868             this.txtDuration.Size = new System.Drawing.Size(77, 21);
1869             this.txtDuration.TabIndex = 11;
1870             this.txtDuration.TabStop = false;
1871             // 
1872             // label3
1873             // 
1874             this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1875             this.label3.Location = new System.Drawing.Point(536, 321);
1876             this.label3.Name = "label3";
1877             this.label3.Size = new System.Drawing.Size(58, 17);
1878             this.label3.TabIndex = 12;
1879             this.label3.Text = "持续时间";
1880             // 
1881             // label4
1882             // 
1883             this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1884             this.label4.Location = new System.Drawing.Point(604, 364);
1885             this.label4.Name = "label4";
1886             this.label4.Size = new System.Drawing.Size(67, 26);
1887             this.label4.TabIndex = 13;
1888             this.label4.Text = "捕获帧";
1889             // 
1890             // txtCapturedFrames
1891             // 
1892             this.txtCapturedFrames.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1893             this.txtCapturedFrames.Location = new System.Drawing.Point(680, 364);
1894             this.txtCapturedFrames.Name = "txtCapturedFrames";
1895             this.txtCapturedFrames.ReadOnly = true;
1896             this.txtCapturedFrames.Size = new System.Drawing.Size(68, 21);
1897             this.txtCapturedFrames.TabIndex = 14;
1898             this.txtCapturedFrames.TabStop = false;
1899             this.txtCapturedFrames.Text = "0";
1900             // 
1901             // groupBox1
1902             // 
1903             this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
1904             | System.Windows.Forms.AnchorStyles.Left)
1905             | System.Windows.Forms.AnchorStyles.Right)));
1906             this.groupBox1.Controls.Add(this.panelVideo);
1907             this.groupBox1.Location = new System.Drawing.Point(10, 9);
1908             this.groupBox1.Name = "groupBox1";
1909             this.groupBox1.Size = new System.Drawing.Size(738, 312);
1910             this.groupBox1.TabIndex = 15;
1911             this.groupBox1.TabStop = false;
1912             this.groupBox1.Resize += new System.EventHandler(this.groupBox1_Resize);
1913             // 
1914             // txtPreSize
1915             // 
1916             this.txtPreSize.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1917             this.txtPreSize.Location = new System.Drawing.Point(440, 338);
1918             this.txtPreSize.Name = "txtPreSize";
1919             this.txtPreSize.Size = new System.Drawing.Size(77, 21);
1920             this.txtPreSize.TabIndex = 16;
1921             this.txtPreSize.Text = "0";
1922             this.txtPreSize.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
1923             // 
1924             // label5
1925             // 
1926             this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
1927             this.label5.Location = new System.Drawing.Point(431, 321);
1928             this.label5.Name = "label5";
1929             this.label5.Size = new System.Drawing.Size(96, 17);
1930             this.label5.TabIndex = 17;
1931             this.label5.Text = "Pre-Size (Meg)";
1932             this.label5.TextAlign = System.Drawing.ContentAlignment.TopCenter;
1933             // 
1934             // CaptureTest
1935             // 
1936             this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
1937             this.ClientSize = new System.Drawing.Size(757, 404);
1938             this.Controls.Add(this.label5);
1939             this.Controls.Add(this.txtPreSize);
1940             this.Controls.Add(this.groupBox1);
1941             this.Controls.Add(this.txtCapturedFrames);
1942             this.Controls.Add(this.label4);
1943             this.Controls.Add(this.label3);
1944             this.Controls.Add(this.txtDuration);
1945             this.Controls.Add(this.label2);
1946             this.Controls.Add(this.txtDroppedFrames);
1947             this.Controls.Add(this.btnCue);
1948             this.Controls.Add(this.btnExit);
1949             this.Controls.Add(this.btnStop);
1950             this.Controls.Add(this.btnStart);
1951             this.Controls.Add(this.txtFilename);
1952             this.Controls.Add(this.label1);
1953             this.Menu = this.mainMenu;
1954             this.Name = "CaptureTest";
1955             this.Text = "捕捉测试";
1956             this.groupBox1.ResumeLayout(false);
1957             this.ResumeLayout(false);
1958             this.PerformLayout();
1959 
1960         }
1961         #endregion
1962 
1963     }
1964 }

 

你可能感兴趣的:(DirectShowNet 使用摄像头录像+录音)