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

ASP.NET Minimal API实现摄像头实时流传输的方案问询

在ASP.NET Minimal API中实现摄像头实时流输出

这个需求完全可以实现,核心思路是通过**线程安全的管道流(Pipe)**衔接摄像头回调的数据和API的响应流,再通过Results.Stream将实时数据返回给客户端。以下是具体实现方案:

实现步骤与代码示例

替换你现有的端点代码,改用Pipe来跨线程传递回调数据,并处理请求生命周期的资源释放:

app.MapGet("/stream", async (string deviceId, string token, int authType, int channel, CancellationToken cancellationToken) =>
{
    // 初始化摄像头设备(保留你原有的设备连接、认证逻辑)
    var device = new YourCameraDevice(); // 替换为你的实际设备实例
    // ... 这里添加设备认证、参数配置等代码 ...

    // 创建Pipe,用于在回调线程和API响应线程之间安全传递流数据
    var pipe = new Pipe();
    var pipeWriter = pipe.Writer;

    // 绑定摄像头流数据回调
    device.OnStreamData = (sender, e) =>
    {
        var streamData = (StreamDataEventArgs)e;
        try
        {
            // 将回调收到的字节数据写入Pipe
            pipeWriter.Write(streamData.Data);
            // 立即刷新,让读取端能获取到最新数据
            _ = pipeWriter.FlushAsync(cancellationToken);
        }
        catch (OperationCanceledException)
        {
            // 请求取消时终止写入,无需额外处理
        }
    };

    // 注册请求取消回调:客户端断开时停止摄像头流并关闭Pipe
    using var cancellationRegistration = cancellationToken.Register(async () =>
    {
        await device.StopStreamAsync();
        await pipeWriter.CompleteAsync();
    });

    try
    {
        // 启动摄像头流
        await device.StartStreamAsync(IntPtr.Zero, channel);
    }
    catch (Exception ex)
    {
        // 启动失败时,完成Pipe并返回错误
        await pipeWriter.CompleteAsync(ex);
        return Results.BadRequest($"启动流失败: {ex.Message}");
    }

    // 返回实时流给客户端,注意设置正确的Content-Type(根据摄像头流格式调整)
    return Results.Stream(
        stream: pipe.Reader.AsStream(),
        contentType: "video/mp4", // 示例:如果是H.264裸流可改为"video/H264",通用二进制流用"application/octet-stream"
        enableRangeProcessing: false
    );
});

关键细节说明

  • 线程安全的Pipe:摄像头的OnStreamData回调通常在非请求线程触发,Pipe是.NET提供的线程安全流组件,能安全处理跨线程的数据写入与读取。
  • 请求生命周期管理:通过CancellationToken监听客户端断开事件,及时停止摄像头流并关闭Pipe,避免资源泄漏。
  • Content-Type配置:必须匹配你的摄像头输出流格式,否则客户端可能无法正确解析播放/下载流数据。
  • 异常处理:启动流失败时要主动完成Pipe并返回错误响应,避免客户端一直处于等待状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:20:27