2016-02-15 9 views
5

Sto usando DirectShowLib 2005 - DxSnap esempio per visualizzare e catturare l'immagine da webcam.
Tutto funziona correttamente con l'esempio.
Ma quando provo a unirlo con la mia applicazione (ho provato a chiamare quel modulo dal mio modulo principale) sta funzionando per la prima volta. Una volta chiuso e aperto la finestra di acquisizione, non viene visualizzato correttamente il video.
Ma la cattura dell'immagine funziona perfettamente tutto il tempo.Dxsnap non visualizza correttamente il video dopo la prima volta aperto

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

Anche dopo il riavvio del PC, la sua ancora lo stesso.
Non ho modificato nulla nel modulo DxSnap.

risposta

3

Mentre DxSnap è un buon esempio introduttivo, taglia un paio di angoli rendendo artefatti come accennato possibile. Il problema è il presupposto questo nella seguente riga:

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

passo effettivo potrebbe essere diverso ed è un effetto ben noto di hardware video che suggerisce un aumento dei passi da gigante. Quando copi un'immagine dal buffer Sample Grabber, sarebbe più accurato ricalcolare lo stride come BufferLen/m_videoHeight (vedi lo snippet di codice di seguito, nota anche l'asserzione lì - presumibilmente lo stai ignorando o eseguendo build di Release). Sarebbe anche meglio controllare semplicemente il tipo di media corrente e ottenere il passo da lì.

Potrebbe non esserci il problema con la prima istanza di pipeline video poiché potrebbe utilizzare l'overlay video e il percorso del codice diverso. Potresti non avere alcun problema con dimensioni del fotogramma ben allineate (larghezze) come 640, 1024 ecc.

/// <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; 
} 
Problemi correlati