首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MediaFrameReader在设置MJPG格式时抛出ArgementException?

MediaFrameReader在设置MJPG格式时抛出ArgementException?
EN

Stack Overflow用户
提问于 2021-08-31 08:26:42
回答 1查看 119关注 0票数 0

我正试着从摄像头上得到每一帧的位图。

我遵循了这个微软教程用MediaFrameReader处理媒体帧。其他一些视频格式(YUY2,NV12.)工作正常,但选择和设置MJPG格式将导致ArgumentException: 'Value does not fall within the expected range.'MediaFrameReader.TryAcquireLatestFrame()上。

这是我设置网络摄像头媒体源和处理FrameArrived事件的工作代码:

代码语言:javascript
运行
复制
private async Task StartReadFrameAsync()
{
    MediaFrameSourceInfo colorSourceInfo = null;
    MediaFrameSourceGroup selectedGroup = null;
    var frameSourceGroups = await MediaFrameSourceGroup.FindAllAsync();
    foreach (var sourceGroup in frameSourceGroups)
    {
        foreach (var sourceInfo in sourceGroup.SourceInfos)
        {
            if (sourceInfo.MediaStreamType == MediaStreamType.VideoRecord && sourceInfo.SourceKind == MediaFrameSourceKind.Color)
            {
                colorSourceInfo = sourceInfo;
                break;
            }
        }
        if (colorSourceInfo != null)
        {
            selectedGroup = sourceGroup;
            break;
        }
    }

    var settings = new MediaCaptureInitializationSettings
            {
                VideoDeviceId = deviceId, 
                SourceGroup = selectedGroup, 
                MemoryPreference = MediaCaptureMemoryPreference.Cpu
            };
    var mediaCapture = new MediaCapture();
    await mediaCapture.InitializeAsync(settings);

    var colorFrameSource = mediaCapture.FrameSources[colorSourceInfo.Id];
    var preferredFormat = colorFrameSource.SupportedFormats.FirstOrDefault(format =>
    {
        return format.Subtype == MediaEncodingSubtypes.Mjpg && format.VideoFormat.Width >= 720;
    });
    if (preferredFormat == null)    
         return;    

    await colorFrameSource.SetFormatAsync(preferredFormat);
    mediaFrameReader = await mediaCapture.CreateFrameReaderAsync(colorFrameSource, MediaEncodingSubtypes.Mjpg);
    mediaFrameReader.FrameArrived += MediaFrameReader_FrameArrived;
    await mediaFrameReader.StartAsync();
}

private async void MediaFrameReader_FrameArrived(MediaFrameReader sender, MediaFrameArrivedEventArgs args)
{
    var mediaFrameReference = sender.TryAcquireLatestFrame();  // <- throws ArgementException 
    var videoMediaFrame = mediaFrameReference?.VideoMediaFrame;
    var softwareBitmap = videoMediaFrame?.SoftwareBitmap;
    //...
}

我测试了两个摄像头,它们支持MJPG格式,我还检查了在CaptureElement控件中预览MJPG格式是否有效。只有TryAcquireLatestFrame()在事件MediaFrameReader_FrameArrived将抛出。

问题:

我做错了什么,MediaFrameReader不能获得一个MJPG框架?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-01 07:32:37

MediaFrameReader在设置MJPG格式时抛出ArgementException?

请参考官方代码示例这里。对于颜色源,我们接受任何内容,并请求将其转换为Bgra8

如果要将FrameSource设置为用于照相机的mjpg,请调用SetFormatAsync方法。

代码语言:javascript
运行
复制
 if (format != null && !format.HasSameFormat(_source.CurrentFormat))
 {
    await _source.SetFormatAsync(format.Format);
    _logger.Log($"Format set to {format.DisplayName}");
 }

如果你的相机支持mjpg框架,你也可以使用上面的代码样本测试。(我的设备:逻辑相机c310不支持mjpg)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68995274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档