2012-06-07 72 views
0

我是用DirectshowLib從攝像頭也記錄視頻和c#,但視頻再編碼的視頻預覽過程中也顯示這樣爲了這個,我已經做了以下步驟如何在PictureBox中顯示預覽?

1.I得到可用的視頻設備

  1. 在裏面。 IFilterGrapth2對象使用Graph = (IFilterGraph2)new FilterGraph();

  2. init。通過使用captureGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();

4.filter grapth ICaptureGraphBuilder2對象被設置爲ICaptureGraphBuilder2對象captureGraph.SetFiltergraph(Graph);

  1. ,然後加入soursefilterformoniker()和outputfilename()

完整的代碼是如下面。它沒有任何錯誤,但它分開打開預覽窗口;我想顯示預覽圖片框..

如何在picturebox中預覽窗口?

這裏是我的全部代碼

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using DirectShowLib; 
using DirectShowLib.DMO; 
using System.Runtime.InteropServices; 
using System.Drawing.Drawing2D; 
using System.IO; 

namespace Cam_Recording_V1_directshow.net_ 
{ 
    public partial class Form1 : Form 
    { 
     string captureDeviceName = string.Empty; 
     IFilterGraph2 Graph = null; 
     IMediaControl m_mediaCtrl = null; 
     public List<DsDevice> AvailableVideoInputDevices { get; private set; } 
     IAMVideoProcAmp vpa; 
     [DllImport("olepro32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] 
     private static extern int OleCreatePropertyFrame(IntPtr hwndOwner, int x, int y, 
      string lpszCaption, int cObjects, 
      [In, MarshalAs(UnmanagedType.Interface)] ref object ppUnk, 
      int cPages, IntPtr pPageClsID, int lcid, int dwReserved, IntPtr pvReserved); 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

      IBaseFilter capFilter = null; 
      IBaseFilter asfWriter = null; 
      IFileSinkFilter pTmpSink = null; 
      ICaptureGraphBuilder2 captureGraph = null; 
      object o; 

      // 
      //Get list of video devices 
      // 
      AvailableVideoInputDevices = new List<DsDevice>(); 
      DsDevice[] videoInputDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice); 
      AvailableVideoInputDevices.AddRange(videoInputDevices); 
      if (AvailableVideoInputDevices.Count > 0) 
      { 
       // 
       //init capture graph 
       // 
       Graph = (IFilterGraph2)new FilterGraph(); 
       captureGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2(); 

       // 
       //sets filter object from graph 
       // 
       captureGraph.SetFiltergraph(Graph); 
       // 
       //which device will use graph setting 
       // 
       Graph.AddSourceFilterForMoniker(AvailableVideoInputDevices.First().Mon, null, AvailableVideoInputDevices.First().Name, out capFilter); 
       captureDeviceName = AvailableVideoInputDevices.First().Name; 
       #region WMV 
       // 
       //sets output file name,and file type 
       // 
       captureGraph.SetOutputFileName(MediaSubType.Asf, /*DateTime.Now.Ticks.ToString() +".wmv"*/ "test.wmv", out asfWriter, out pTmpSink); 
       // 
       //configure which video setting is used by graph 
       //     
       IConfigAsfWriter lConfig = asfWriter as IConfigAsfWriter; 
       Guid cat = new Guid("8C45B4C7-4AEB-4f78-A5EC-88420B9DADEF"); 
       lConfig.ConfigureFilterUsingProfileGuid(cat); 
       #endregion      
       captureGraph.RenderStream(PinCategory.Preview, MediaType.Video, capFilter, null, null); 

       captureGraph.RenderStream(PinCategory.Capture, MediaType.Video, capFilter, null, asfWriter); 
       m_mediaCtrl = Graph as IMediaControl; 
       m_mediaCtrl.Run(); 
      } 
      else 
      { 
       MessageBox.Show("Video Capture Device Not Found!!"); 
       button1.Visible = false; 
      } 
     } 

回答

0

我這樣做使用VMR9。我在Graph中添加了VMR9過濾器。還有很多。

+0

您能詳細說明一下如何實際連接圖像和VMR9過濾器嗎? – OzBarry