2016-02-15 1 views
5

Ich bin mit DirectShowLib-2005 - DxSnap Beispiel das Bild von Webcam anzuzeigen und zu erfassen.
Alles funktioniert gut mit dem Beispiel.
Aber wenn ich versuche, es mit meiner Anwendung zu verschmelzen (ich habe versucht, dieses Formular von meinem Hauptformular zu nennen) funktioniert es zum ersten Mal. Sobald ich das Aufnahmefenster schließe und öffne, wird das Video nicht richtig angezeigt.
Aber die Erfassung des Bildes funktioniert perfekt die ganze Zeit.Dxsnap Anzeige das Video nicht richtig nach dem ersten Mal geöffnet

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

Auch nach dem PC, es ist immer noch die gleichen neu zu starten.
Ich habe nichts in der DxSnap Form geändert.

Antwort

3

Während DxSnap ein gutes Einführungsbeispiel ist, schneidet es ein paar Ecken und macht so Artefakte wie erwähnt möglich. Das Problem ist die Annahme, dies in der folgenden Zeile:

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

Actual schreiten anders sein könnte und es ist eine gut bekannte Wirkung von Video-Hardware erhöhten Fortschritte hindeutet. Wenn Sie ein Bild aus dem Sample Grabber-Puffer kopieren, wäre es genauer, wenn Sie stride als BufferLen/m_videoHeight berechnen (siehe Codeschnipsel unten; beachten Sie auch die Assertion - vermutlich ignorieren Sie sie oder führen Release-Builds aus). Es wäre sogar besser, einfach den aktuellen Medientyp zu überprüfen und von dort aus einen Schritt zu erzielen.

Möglicherweise haben Sie das Problem mit der ersten Instanz der Videopipeline nicht, da möglicherweise Videoüberlagerung und anderer Codepfad verwendet wird. Bei gut ausgerichteten Bildgrößen (Breiten) wie 640, 1024 usw. kann es überhaupt kein Problem geben.

/// <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; 
} 
Verwandte Themen