2012-10-22 21 views
10

मैं एक ऐसा एप्लिकेशन लिखने की कोशिश कर रहा हूं जो पीसी से जुड़े कैमरे तक पहुंच सके, वीडियो रिकॉर्ड कर सके और वीडियो से एक छवि प्राप्त कर सके। मैं कैमरे तक पहुंचने के लिए AForge.NET पुस्तकालयों का उपयोग करता हूं: http://www.aforgenet.com/framework/वीडियो से छवि प्राप्त करें

मुझे नहीं पता कि एएफर्ज.विडियो.NewFrameEventHandler नामक घटना कैसे काम करती है। इस कोड में ईवेंट किसी वीडियो से नए फ्रेम की बजाय बिटमैप पर शून्य हो जाता है या ईवेंट नहीं कहा जाता है। मैं वीडियो स्ट्रीम की तरह कुछ बनाने के लिए हर बार फ्रेम पर वीडियो से एक फ्रेम बॉक्स में फ्रेम प्राप्त करना चाहता हूं और स्टॉप बटन पर क्लिक करने के बाद मैं चाहता हूं कि आखिरी छवि चित्र बॉक्स में प्रदर्शित रहें। क्या किसी को पता है कि कैसे? और मेरा कोड क्यों काम नहीं करता है?

कोड:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using AForge.Video.DirectShow; 
using System.Drawing; 
using AForge.Video; 

namespace CameraDevice 
{ 
    public class CameraImaging 
    { 
     // enumerate video devices 
     public FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); 
     //camera 
     public VideoCaptureDevice videoSource; 
     //screen shot 
     public Bitmap bitmap; 
     public CameraImaging() 
     { 
      // create video source 
      VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString); 
      // set NewFrame event handler 
      videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame); 
     } 
     public void StartVideo(VideoCaptureDevice videoSource) 
     { 
      // start the video source 
      videoSource.Start(); 
      // ... 
     } 
     public void StopVideo(VideoCaptureDevice videoSource) 
     { 
      // stop the video source 
      videoSource.Stop(); 
      // ... 
     } 
     private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) 
     { 
      // get new frame 
      bitmap = eventArgs.Frame; 
      // process the frame 
     } 
    } 
} 

समान कोड यहाँ है: http://www.aforgenet.com/framework/features/directshow_video.html[ ^]

विण्डोज़ फॉर्म्स मैं एक धागा जो इस पद्धति करता है में इस वीडियो को चलाने में:

private void VideoRecording() 
    { 
     camImg.videoSource.Start(); 

     while (!StopVideo) 
     { 
      pictureBox1.Image = camImg.bitmap; 
      pictureBox1.Invalidate(); 
     } 
     camImg.videoSource.Stop(); 

    } 
+0

AForge.NET वीडियो कैप्चर हार्डवेयर तक पहुंचने के लिए देशी डायरेक्टशो एपीआई का उपयोग करता है।हो सकता है कि आप [DirectShow.NET] (http://directshownet.sourceforge.net/) लाइब्रेरी को देखना चाहें, जो .NET ऐप्स और वीडियो कैप्चर एपीआई के बीच सबसे व्यापक रूप से उपयोग किया जाने वाला "पुल" है। –

उत्तर

0

एक जाने का तरीका get or write a wrapper around FFMPEG है, जो extracting images from your video के लिए आपके लिए काम कर सकता है। मैंने दो परियोजनाओं पर काम किया है जिन्होंने अपलोड किए गए वीडियो से थंबनेल और/या स्थिरता प्राप्त करने के इस साधन का उपयोग किया है। यह थोड़ा हैकिश महसूस करेगा, लेकिन यह काम करना चाहिए।

3

यदि मुझे सही याद है कि बिटमैप को तुरंत कॉपी करने की आवश्यकता है क्योंकि यह घटना के बाद अधिलेखित है। संदर्भ का उपयोग करना कोई अच्छा नहीं है। की तरह कुछ का प्रयास करें:

private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) 
{ 
    // copy the new frame 
    bitmap = new Bitmap(eventArgs.Frame); 
    // process the frame 
} 

या

private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) 
{ 
    // clone new frame 
    bitmap = eventArgs.Frame.Clone(); 
    // process the frame 
} 

इसके अलावा, आप इस के लिए एक अतिरिक्त धागा उपयोग नहीं करना चाहिए, AForge पहले से ही है कि नहीं करता है।

  1. कॉल प्रारंभ (जैसे लोड घटना में, या एक बटन दबाने के बाद)
  2. फ्रेम घटनाओं

    निजी शून्य VideoStream_NewFrame संभाल (वस्तु प्रेषक, AForge.Video.NewFrameEventArgs EventArgs) { बिटमैप न्यूफ्रेम = नया बिटमैप (eventArgs.Frame); तस्वीरबॉक्स 1। छवि = नया फ्रेम; आप समस्या आ जाती है }

  3. कॉल बंद करो

(घटना या बटन बंद करने) WinForm जैसे नियंत्रित करता है साथ एक लेबल जिसे आपको यह जानने की आवश्यकता है कि ये नियंत्रण किसी अन्य धागे पर बनाए गए थे और आपको Invoke का उपयोग करने की आवश्यकता है। उदा:

label_ms.Invoke((MethodInvoker)(() => label_ms.Text = msTimeSpan.TotalMilliseconds.ToString())); 

आपका सबसे अच्छा शर्त यह AForge नमूना उस ढांचे के साथ आता है की जाँच करने के लिए है: http://aforge.googlecode.com/svn/trunk/Samples/Video/Player/

1

मैं अपने Foscams साथ Aforge वीडियो लाइब्रेरी का उपयोग कर रहा है, और यह बहुत अच्छी तरह से काम कर रहा है। इवेंट हैंडलर के लिए मेरा कोड यहां है।

private void Video_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs) 
    { 
     //Create Bitmap from frame 
     Bitmap FrameData = new Bitmap(eventArgs.Frame); 
     //Add to PictureBox 
     PictureBox.Image = FrameData; 
    } 
संबंधित मुद्दे