我正在尝试将网络摄像头流式传输到我的应用程序,虽然我有针对各种分辨率的解决方法,但我想使用摄像头功能来提供不同分辨率的图像。
我目前的解决方法如下(伪代码):
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 的样本。
我做错了什么?为什么设置介质类型对样本没有影响?
底层 Windows Media Foundation API 绝对支持视频分辨率更改以及活动视频捕获。
它以您假设的简单方式发生:通过随时更改媒体类型。
一些 C++ 代码来演示这一点:https://github.com/roman380/MediaFoundationVideoCapture/...