DirectShow videoinfoheader手册设置

时间:2013-06-14 17:43:20

标签: vb.net directshow directshow.net

我试图让相机应用程序拍摄一张图片,这些图片一旦被炸成全屏就清晰可辨(我将我创建的png放入pdf文件中,以便我们将其转移到我们的数据库中。

平板电脑是带有原子处理器的完整版Windows平板电脑,而不是RT。

如果我发送相机的默认尺寸(448x252),一切正常。当我尝试设置手动尺寸(相机支持1920x1080,1280x720,960x540,640x480,640x360)时,出现未指定的错误。

SetConfigParms函数中的videoinfoheader出现问题。如果我正常使用该功能,我会得到-2147467259的图像尺寸。我玩弄它,我很确定图像大小应该是高x宽x 1.5(至少它是448x252,并且它也没有抛出缓冲长度错误,无论分辨率如何)。所以我补充说:     v.BmiHeader.ImageSize = iHeight * iWidth * 1.5 该应用程序在448x252仍然正常,但如果我尝试1280x720或1920x1080,我会得到一个未指定的错误。

我开始认为其他未被更改的videoinfoheader数据搞砸了。例如,即使在手动输入高度和宽度后,srcRect仍保持在0x448x0x252。 ImageSize不会自动计算(如上所述),其他参数也可能存在问题。

有没有人有关于如何手动计算videoinfo标题的所有字段的链接?或者有人可以帮我解决这个问题吗?我已经做了我所能做的一切,我用谷歌搜索了几个小时......我无法得到它。

这是SetConfigParms函数,如果它有帮助的话。如果您想要任何其他功能或完整的相机类,请告诉我。它很长,所以在有人要求之前我不会包括它。

Private Sub SetConfigParms(pStill As IPin, iWidth As Integer, iHeight As Integer, iBPP As Short)

    Dim hr As Integer
    Dim media As AMMediaType
    Dim v As VideoInfoHeader

    Dim videoStreamConfig As IAMStreamConfig = TryCast(pStill, IAMStreamConfig)
    ' Get the existing format block
    hr = videoStreamConfig.GetFormat(media)
    DsError.ThrowExceptionForHR(hr)
    Try
        ' copy out the videoinfoheader
        v = New VideoInfoHeader()
        Marshal.PtrToStructure(media.formatPtr, v)

        ' if overriding the width, set the width
        If iWidth > 0 Then
            v.BmiHeader.Width = iWidth
        End If
        ' if overriding the Height, set the Height
        If iHeight > 0 Then
            v.BmiHeader.Height = iHeight
        End If
        ' if overriding the bits per pixel
        If iBPP > 0 Then
            v.BmiHeader.BitCount = iBPP
        End If
        v.BmiHeader.ImageSize = iHeight * iWidth * 1.5
        ' Copy the media structure back           
        Marshal.StructureToPtr(v, media.formatPtr, True)
        ' Set the new format
        hr = videoStreamConfig.SetFormat(media)
        MsgBox(DsError.GetErrorText(hr))
        DsError.ThrowExceptionForHR(hr)
    Finally
        DsUtils.FreeAMMediaType(media)
        media = Nothing
    End Try
End Sub

1 个答案:

答案 0 :(得分:2)

您初始化的字段太少了......比较您设置的字段以及VIDEOINFOHEADER + BITMAPINFOHEADER中定义的字段 - 您没有PlanesBitCountCompression等。

它不能像这样工作,你需要一个定义良好的初学者格式,然后它可能被设备接受或拒绝。

必须是this(C#):

        var vif = new VideoInfoHeader();
        vif.BmiHeader = new BitmapInfoHeader();

        // The HEADER macro returns the BITMAPINFO within the VIDEOINFOHEADER
        vif.BmiHeader.Size = Marshal.SizeOf(typeof (BitmapInfoHeader));
        vif.BmiHeader.Compression = 0;
        vif.BmiHeader.BitCount = bitCount;
        vif.BmiHeader.Width = width;
        vif.BmiHeader.Height = height;
        vif.BmiHeader.Planes = 1;

        int iSampleSize = vif.BmiHeader.Width*vif.BmiHeader.Height*(vif.BmiHeader.BitCount/8);
        vif.BmiHeader.ImageSize = iSampleSize;