2016-02-15 72 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);

實際步伐可能會有所不同,它的視頻硬件建議增加進步的一個衆所周知的效果。當你從Sample Grabber緩衝區複製圖像時,重新計算步幅將更爲準確,如BufferLen/m_videoHeight(參見下面的代碼片段;也請注意那裏的斷言 - 大概是你忽略它或運行Release版本)。簡單地檢查當前媒體類型並從那裏獲得大步會更好。

您可能沒有第一個視頻管道問題,因爲它可能使用視頻覆蓋和不同的代碼路徑。您可能根本沒有像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; 
} 
相關問題