2016-02-15 43 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; 
} 
相关问题