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

如何将WebRTC采集的客户端摄像头帧发送到Python脚本处理?

可行实现方案

方案1:定时抽帧HTTP上传(实现最简单,适合对实时性要求不高的场景,比如1~5秒处理1帧的需求)

前端改造步骤

  • 在现有js代码基础上,新增canvas元素用来临时存储视频帧,定时从video标签中绘制当前帧,转成blob格式发送给Django后端即可,参考改造后的代码:
'use strict';

const mediaStreamConstraints = { video: true };
const localVideo = document.querySelector('video');
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
let localStream;

function gotLocalMediaStream(mediaStream) {
  localStream = mediaStream;
  localVideo.srcObject = mediaStream;
  // 视频加载完成后设置canvas尺寸和视频一致
  localVideo.onloadedmetadata = () => {
    canvas.width = localVideo.videoWidth;
    canvas.height = localVideo.videoHeight;
    // 每1000ms抽一帧上传,间隔可以自行调整
    setInterval(captureAndSendFrame, 1000);
  }
}

function handleLocalMediaStreamError(error) {
  console.log('navigator.getUserMedia error: ', error);
}

// 抽帧上传函数
function captureAndSendFrame() {
  ctx.drawImage(localVideo, 0, 0, canvas.width, canvas.height);
  // 转成blob格式上传,比base64体积更小
  canvas.toBlob((blob) => {
    const formData = new FormData();
    formData.append('frame', blob, 'frame.jpg');
    fetch('/api/process-frame/', {
      method: 'POST',
      body: formData
    }).then(res => res.json()).then(result => {
      // 此处可处理模型返回的结果,比如渲染到页面上
      console.log('模型处理结果:', result);
    })
  }, 'image/jpeg', 0.8) // 0.8为jpeg质量参数,可根据需求调整
}

navigator.mediaDevices.getUserMedia(mediaStreamConstraints)
  .then(gotLocalMediaStream).catch(handleLocalMediaStreamError);

后端Django处理步骤

  • 新增接口接收前端传的图片文件,用OpenCV读取后转成numpy数组,直接喂入机器学习模型即可,处理完成后返回结果给前端,参考视图代码:
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import cv2
import numpy as np
# 导入你自己训练好的ML模型
from your_model import predict

@csrf_exempt
def process_frame(request):
    if request.method == 'POST':
        frame_file = request.FILES.get('frame')
        # 把上传的文件转成OpenCV可用的格式
        img_array = np.asarray(bytearray(frame_file.read()), dtype=np.uint8)
        frame = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
        # 喂入模型处理
        result = predict(frame)
        return JsonResponse({'status': 'success', 'result': result})
    return JsonResponse({'status': 'error', 'msg': '仅支持POST请求'})

方案2:WebSocket实时传输(适合对实时性要求高的场景,比如需要每秒处理10帧以上的需求)

  • 前端不用定时发送fetch请求,建立WebSocket连接后持续把抽好的帧发送给后端,后端收到后实时处理再把结果通过WebSocket推送给前端,延迟比HTTP上传低很多
  • Django端可以用Channels库实现WebSocket支持,帧处理逻辑和方案1完全一致,仅需把HTTP接口替换为WebSocket接收数据即可

注意事项

  • 抽帧间隔可以根据模型推理速度和业务需求调整,不要设置过短导致后端压力过大
  • 上传的图片可以适当压缩质量,减少传输带宽占用
  • 如果有多人同时使用的需求,要注意模型推理的并发控制,避免服务器资源占满

内容的提问来源于stack exchange,提问作者이준혁

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:30:01