You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置MJPG格式后MediaFrameReader调用TryAcquireLatestFrame抛出ArgumentException如何解决

问题原因

你出现该异常的核心原因是:MediaFrameReader 不支持在CPU内存偏好模式下直接读取MJPG这类压缩格式的帧,且压缩格式帧不存在对应的 SoftwareBitmap 结构,你在创建阅读器时强制指定输出格式为MJPG,和后续读取逻辑不兼容。

修复方案

方案1:需要获取可直接处理的未压缩位图(最常用)

无需指定阅读器的输出格式为MJPG,让系统自动将摄像头输出的MJPG流解码为未压缩格式,修改 CreateFrameReaderAsync 调用逻辑即可:

// 原有错误代码
// mediaFrameReader = await mediaCapture.CreateFrameReaderAsync(colorFrameSource, MediaEncodingSubtypes.Mjpg);

// 修改为:不指定输出格式,系统自动解码MJPG为未压缩位图
mediaFrameReader = await mediaCapture.CreateFrameReaderAsync(colorFrameSource);
// 也可显式指定需要的未压缩格式,比如适配渲染的Bgra8格式:
// mediaFrameReader = await mediaCapture.CreateFrameReaderAsync(colorFrameSource, MediaEncodingSubtypes.Bgra8);

同时建议去掉 MediaFrameReader_FrameArrived 方法上不必要的 async 关键字,没有await操作时加async void会增加异常逃逸的风险。

方案2:需要获取原始MJPG压缩数据

如果业务需要直接读取MJPG压缩帧数据,需要调整内存偏好和读取逻辑:

  1. 修改初始化配置的内存偏好:
var settings = new MediaCaptureInitializationSettings
{
    VideoDeviceId = deviceId, 
    SourceGroup = selectedGroup, 
    // 改为Auto/Gpu模式,支持读取压缩格式数据
    MemoryPreference = MediaCaptureMemoryPreference.Auto
};
  1. 保留创建阅读器时指定MJPG格式的逻辑,修改帧读取逻辑,不要访问 SoftwareBitmap:
private void MediaFrameReader_FrameArrived(MediaFrameReader sender, MediaFrameArrivedEventArgs args)
{
    using (var mediaFrameReference = sender.TryAcquireLatestFrame())
    {
        if (mediaFrameReference?.Buffer == null) return;
        // 读取原始MJPG字节数据
        var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(mediaFrameReference.Buffer);
        byte[] mjpgFrameData = new byte[mediaFrameReference.Buffer.Length];
        dataReader.ReadBytes(mjpgFrameData);
        // 后续自行处理MJPG数据即可
    }
}

内容的提问来源于stack exchange,提问作者Dia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:00:03