SharpDX 相机流式传输不遵循 MediaType 设置

SharpDX camera streaming not respecting MediaType set

提问人:Robert 提问时间:10/27/2023 最后编辑:Roman R.Robert 更新时间:10/29/2023 访问量:35

问:

我正在尝试将网络摄像头流式传输到我的应用程序,虽然我有各种分辨率的解决方法,但我想使用相机功能以不同的分辨率提供图像。

我目前的解决方法如下(在伪代码中):

ReadSample(); //always in highest resolution

var bmp = UnpackTheFrameIntoBitmap();

if(some_different_resolution_set)
{
   bmp = ResizeImageToNewResolution(bmp);
}

DrawBitmapOnCanvas(bmp);

我发现我可以迭代相机原生类型。我使用此信息来查找支持所选分辨率的本机类型。然后,我将此本机类型设置为当前媒体类型。这是我的代码(半伪):

var nativeType = FindNativeTypeSupportingResolution(resolution);

sourceReader.SetCurrentMediaType(0, nativeType);
sourceReader.SetStreamSelection(0, true);

while(true)
{
    var sample = sourceReader.ReadSample(0, SourceReaderControlFlags.None, out int readStreamIndex, out SourceReaderFlags readFlags, out long timestamp);
    if(sample != null)
    {
        var mediaBuffer = sample.GetBufferByIndex(0);
        var sourcePointer = mediaBuffer.Lock(out int maxLength, out int currentLength);
        
        var data = new byte[sample.TotalLength];
        Marshal.Copy(sourcePointer, data, 0, frameWidth * frameHeight * 4);
        
        /// Get this data into a bitmap.
    }
}

因此,设置本机类型对帧大小没有影响。例如,我的相机的最高帧尺寸为 1920x1080。如果我将媒体 tpye 设置为 800x600,我仍然会得到一个实际上是 1920x1080 的样本。

我做错了什么?为什么设置介质类型对样品没有影响?

C# 视频捕获 ms-media-foundation sharpdx

评论


答:

0赞 Roman R. 10/29/2023 #1

基础Windows Media Foundation API 绝对支持视频分辨率更改以及活动视频捕获。

它以您假设的简单方式发生:通过随时随地更改媒体类型。

一些C++代码来演示这一点:https://github.com/roman380/MediaFoundationVideoCapture/......

评论

0赞 Robert 10/30/2023
我通过设置属性来玩一些源读取器上的一些属性。如果我设置EnableAdvancedVideoProcessing,我将获得更改,并且帧数将非常高,但是如果我仅选择EnableVideoProcessing,则帧数似乎很低,并且不考虑媒体类型的帧大小。
1赞 Roman R. 10/30/2023
你是对的,我也可以重现这个。这一定是 Source Reader API 中的问题,因为它必须回退到传统的 Color Converter DSP(我相信),并且它们没有按预期处理媒体类型更改。但是,在大多数情况下,您希望使用“高级”版本,除非您在某个虚拟或云系统上必须使用GPU。