2009-08-06 5 views
1

C# (Windows 앱)에서 2 개 이상의 웹캠으로 하나의 비디오 파일을 만드는 방법을 찾아야합니다. 나는 몇몇 견본을 찾아 내기를 위해 google를 사용하는 것을 시도했다, 그러나 성공 없음.복수의 웹캠을 하나의 avi로 캡쳐 (윈도우 폼)

HTTP : //directshownet.sourceforge.net 나는 방법 (directshowNet와 나는 두 개의 웹캠 ... 두 avi 파일을 저장할 수 있습니다 다이렉트)

directShowNet에 대한

더 웹캠에서 비디오를 녹화하는 방법을 발견/비디오 캡처를위한

샘플 :

HTTP : 간단한 예를 들어 //www.codeproject.com/KB/directx/directshownet.aspx

나는이 웹캠을 가지고있다. 레코드 중에 프레임을 가져와 다른 프레임 근처에 하나의 프레임을 붙여 넣으십시오 (하나의 이미지를 만들고 두 프레임에서 하나의 프레임을 만듦). 그리고 새 프레임을 새로운 avi에 삽입해야합니다. 아이디어가 있으십니까? 프레임을 제 시간에 가져올 수 있으며 캡처 한 2 개의 새 AVI를 만들 수 있습니까? 병합 여기이 코드

+0

두 이미지를 단일 이미지로 만들면 충분합니다. –

답변

0

이 개 이미지

#region TakeSnap Class 

    IntPtr memDc; 
    [StructLayout(LayoutKind.Sequential)] 
     public struct Sizes 
    { 
     public Int32 cx; 
     public Int32 cy; 

     public Sizes(Int32 x, Int32 y) 
     { 
      cx = x; 
      cy = y; 
     } 
    } 

    [StructLayout(LayoutKind.Sequential, Pack = 1)] 
     public struct BLENDFUNCTION 
    { 
     public byte BlendOp; 
     public byte BlendFlags; 
     public byte SourceConstantAlpha; 
     public byte AlphaFormat; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
     public struct Points 
    { 
     public Int32 x; 
     public Int32 y; 

     public Points(Int32 x, Int32 y) 
     { 
      this.x = x; 
      this.y = y; 
     } 
    } 

    [DllImport("gdi32.dll",EntryPoint="DeleteDC")] 
    public static extern IntPtr DeleteDC(IntPtr hDc); 

    [DllImport("gdi32.dll",EntryPoint="DeleteObject")] 
    public static extern IntPtr DeleteObject(IntPtr hDc); 

    [DllImport("gdi32.dll",EntryPoint="BitBlt")] 
    public static extern bool BitBlt(IntPtr hdcDest,int xDest, 
     int yDest,int wDest,int hDest,IntPtr hdcSource, 
     int xSrc,int ySrc,int RasterOp); 

    [DllImport ("gdi32.dll",EntryPoint="CreateCompatibleBitmap")] 
    public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, 
     int nWidth, int nHeight); 

    [DllImport ("gdi32.dll",EntryPoint="CreateCompatibleDC")] 
    public static extern IntPtr CreateCompatibleDC(IntPtr hdc); 

    [DllImport ("gdi32.dll",EntryPoint="SelectObject")] 
    public static extern IntPtr SelectObject(IntPtr hdc,IntPtr bmp); 

    [DllImport("user32.dll", EntryPoint="GetDesktopWindow")] 
    public static extern IntPtr GetDesktopWindow(); 

    [DllImport("user32.dll",EntryPoint="GetDC")] 
    public static extern IntPtr GetDC(IntPtr ptr); 

    [DllImport("user32.dll",EntryPoint="GetSystemMetrics")] 
    public static extern int GetSystemMetrics(int abc); 

    [DllImport("user32.dll",EntryPoint="GetWindowDC")] 
    public static extern IntPtr GetWindowDC(Int32 ptr); 

    [DllImport("user32.dll",EntryPoint="ReleaseDC")] 
    public static extern IntPtr ReleaseDC(IntPtr hWnd,IntPtr hDc); 

    protected static IntPtr m_HBitmap; 
    public const int SM_CXSCREEN=0; 
    public const int SM_CYSCREEN=1; 
    public const int SRCCOPY = 13369376; 

    #endregion 



    private IntPtr get_pointer(string path) 
    { 

     Bitmap bitmap=new Bitmap(path); 
     IntPtr oldBits = IntPtr.Zero; 
     IntPtr screenDC = GetDC(IntPtr.Zero); 
     IntPtr hBitmap = IntPtr.Zero; 
     memDc = CreateCompatibleDC(screenDC); 

     try 
     { 
      Point topLoc = new Point(Left, Top); 
      Sizes bitMapSize = new Sizes(bitmap.Width, bitmap.Height); 
      BLENDFUNCTION blendFunc = new BLENDFUNCTION(); 
      Points srcLoc = new Points(0, 0); 

      hBitmap = bitmap.GetHbitmap(Color.FromArgb(0)); 
      IntPtr pt= SelectObject(memDc, hBitmap); 
      ReleaseDC(IntPtr.Zero, screenDC);    
      return memDc; 
     } 
     catch(Exception ex) 
     { 
      return this.Handle; 
     } 

    }  
    public Bitmap GetDesktopImage() 
    { 
     try 
     {    

      Sizes size; 
      IntPtr hBitmap;   
      IntPtr hDC = get_pointer(@"C:\Documents and Settings\admin\Desktop\11_13_40_453.jpg");    
      IntPtr hMemDC = CreateCompatibleDC(hDC); 
      IntPtr hDC1 = get_pointer(@"C:\Documents and Settings\admin\Desktop\11_13_42_906.jpg");   

      size.cx = this.Width-2; 
      size.cy = this.Height-22; 
      hBitmap = CreateCompatibleBitmap(hDC, size.cx*2, size.cy);   
      if (hBitmap!=IntPtr.Zero) 
      { 
       IntPtr hOld = (IntPtr)SelectObject(hMemDC, hBitmap);      
       BitBlt(hMemDC, 0, 0,size.cx,size.cy, hDC,0, 0,SRCCOPY); 
       BitBlt(hMemDC, size.cx, 0,size.cx,size.cy, hDC1,0, 0,SRCCOPY); 
       SelectObject(hMemDC, hOld);       
       DeleteDC(hMemDC);     
       DeleteDC(memDc);      
       ReleaseDC(this.Handle, hDC); 
       ReleaseDC(this.Handle, hDC1);    
       Bitmap bmp = System.Drawing.Image.FromHbitmap(hBitmap);     
       DeleteObject(hBitmap);    
       GC.Collect();    
       return bmp; 
      }   
      return null; 

     } 
     catch(Exception ex) 
     {   
      return null; 
     } 
    } 


    private void Createimage() 
    { 
     try 
     { 
      Bitmap bm= GetDesktopImage(); 
      bm.Save(Application.StartupPath+"\\temp\\"+DateTime.Now.ToString("hh-mm-ss ff")+".Jpeg",System.Drawing.Imaging.ImageFormat.Jpeg); 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 

    } 
+0

size.cx = this.Width-2; size.cx = this.Hight-22; 양식 크기를 설정하는 순간 이미지 크기를 너비 (높이 320, 높이 280)로 설정 –

+0

2 개의 이미지를 서로 가까이 복사하는 더 쉬운 방법이 있습니다 (Ggraphics 및 DrawImageUnscaled - http://www.netcomp.nl/support /origdocs/dotnetsdk/cpref/frlrfsystemdrawinggraphicsclassdrawimageunscaledtopic3.htm). 하지만 내 주요 문제는 "이미지를 병합하는 방법"이 아니라 동시에 2 개의 (또는 그 이상의) 웹캠에서 캡처 한 이미지를 가져 와서 저장하는 것입니다. –

1

질문은 조금 오래된하지만 단지의 경우 (!) : 나는 성공적 AForge.NET 라이브러리를 사용하고 있습니다. 2.1.4 버전에서는 두 카메라의 비디오를 표시하는 샘플이 있습니다.
기본 비디오 플레이어 컨트롤 대신에 VideoCaptureDevice을 사용하고 NewFrame 이벤트에서 원하는 비트 맵을 만들면됩니다. AForge.NET에는 출력 비디오를 만드는 데 사용할 수있는 AVIWriter도 있습니다.

관련 문제