【问题标题】:Dxsnap not displaying the video properly after first time openDxsnap 首次打开后无法正确显示视频
【发布时间】:2016-05-26 04:54:56
【问题描述】:

我正在使用 DirectShowLib-2005 - 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);
    }
}

即使重新启动电脑,它仍然是一样的。
我没有更改 DxSnap 表单中的任何内容。

【问题讨论】:

    标签: c# video directshow directshow.net


    【解决方案1】:

    虽然DxSnap 是一个很好的介绍性示例,但它减少了几个角落,使上述工件成为可能。问题在于以下行中的假设:

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

    实际步幅可能有所不同,这是众所周知的视频硬件效果,表明步幅增加。当您从 Sample Grabber 缓冲区复制图像时,将步幅重新计算为 BufferLen / m_videoHeight 会更准确(请参见下面的代码 sn-p;还要注意那里的断言——大概您忽略它或运行发布版本)。最好只检查当前的媒体类型并从那里获得步幅。

    视频管道的第一个实例可能没有问题,因为它可能使用了视频覆盖和不同的代码路径。对于 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多