2016-02-15 14 views
5

के बाद ठीक से वीडियो भी दिखाई नहीं दे रहा उपयोग कर रहा हूँ DirectShowLib -2005 - DxSnap उदाहरण प्रदर्शित करने और वेबकैम से चित्र लेने।
सब कुछ उदाहरण के साथ ठीक काम करता है।
लेकिन जब मैं इसे अपने आवेदन के साथ विलय करने का प्रयास करता हूं (मैंने उस फॉर्म को अपने मुख्य रूप से कॉल करने का प्रयास किया) यह पहली बार काम कर रहा है। एक बार जब मैं कैप्चर विंडो बंद करता हूं और खोलता हूं, तो यह वीडियो को ठीक से प्रदर्शित नहीं कर रहा है।
लेकिन छवि का कब्जा पूरी तरह से हर समय काम करता है।Dxsnap पहली बार खुला

public partial class frmMain : Form 
{ 
    public frmMain() 
    { 
     InitializeComponent(); 
    } 


    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    private static void Main() 
    { 
     Application.Run(new frmMain()); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     frmdxSnap frmdxSnap = new frmdxSnap(); 
     frmdxSnap.ShowDialog(this); 
    } 
} 

Video Display Error

यहां तक ​​कि पीसी, इसकी अभी भी वही पुनरारंभ करने के बाद।
मैंने DxSnap रूप में कुछ भी नहीं बदला है।

उत्तर

3

जबकि DxSnap एक अच्छा प्रारंभिक नमूना है, यह कुछ कोनों को काटता है जैसे कलाकृतियों को संभव बताया गया है। समस्या निम्न पंक्ति में इस धारणा यह है:

m_stride = m_videoWidth * (videoInfoHeader.BmiHeader.BitCount/8);

वास्तविक कदम अलग हो सकता है और यह वीडियो हार्डवेयर वृद्धि हुई प्रगति का सुझाव दे की एक अच्छी तरह से ज्ञात प्रभाव है। जब आप नमूना ग्रैबर बफर से छवि की प्रतिलिपि बनाते हैं, तो BufferLen/m_videoHeight के रूप में स्ट्रैड की गणना करने के लिए और अधिक सटीक होगा (नीचे कोड स्निपेट देखें; यहां पर दावा भी देखें - संभवतः आप इसे अनदेखा कर रहे हैं या रिलीज बिल्ड चला रहे हैं)। वर्तमान मीडिया प्रकार को जांचना और वहां से आगे बढ़ना बेहतर होगा।

आपको वीडियो पाइपलाइन के पहले उदाहरण के साथ समस्या नहीं हो रही है क्योंकि यह वीडियो ओवरले और विभिन्न कोड पथ का उपयोग कर सकती है। आपको 640, 1024 इत्यादि जैसे अच्छी तरह से गठबंधन फ्रेम आकार (चौड़ाई) के साथ कोई समस्या नहीं हो सकती है

/// <summary> buffer callback, COULD BE FROM FOREIGN THREAD. </summary> 
int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen) 
{ 
    // Note that we depend on only being called once per call to Click. Otherwise 
    // a second call can overwrite the previous image. 
    Debug.Assert(BufferLen == Math.Abs(m_stride) * m_videoHeight, "Incorrect buffer length"); 

    if (m_WantOne) 
    { 
     m_WantOne = false; 
     Debug.Assert(m_ipBuffer != IntPtr.Zero, "Unitialized buffer"); 

     // Save the buffer 
     CopyMemory(m_ipBuffer, pBuffer, BufferLen); 
     //////////////////////////////////////////// 
     // HOTFIX: Let's have the stride re-computed for the case it was changed dynamically or otherwise 
     m_stride = BufferLen/m_videoHeight; 
     //////////////////////////////////////////// 

     // Picture is ready. 
     m_PictureReady.Set(); 
    } 

    return 0; 
} 
संबंधित मुद्दे