SharpDX 相机流不尊重 MediaType 设置

问题描述 投票:0回答:1

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

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

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。如果我将媒体类型设置为 800x600,我仍然会得到实际为 1920x1080 的样本。

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

c# video-capture ms-media-foundation sharpdx
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.