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

树莓派摄像头低延迟多客户端流媒体方案优化问询

低延迟多客户端树莓派摄像头推流解决方案

针对你的无人机项目需求,结合树莓派的硬件特性和低延迟要求,以下是几个可落地的优化方案:

1. 优化MJPEG服务器的并发架构(保留低延迟特性)

你当前的MJPEG单客户端延迟表现良好,问题根源在于官方示例通常为每个客户端单独采集/编码视频,导致多客户端时CPU负载飙升、延迟上升。核心优化思路是将视频采集与编码逻辑抽离为单进程/线程,再将编码后的帧分发给所有客户端,避免重复计算。

具体实现

使用Python的picamera2(树莓派官方新摄像头库,默认启用硬件加速)配合多线程架构:

from picamera2 import Picamera2
import threading
import socket
import time

# 初始化摄像头,启用硬件加速MJPEG编码
picam2 = Picamera2()
config = picam2.create_video_configuration(main={"size": (640, 480), "format": "MJPEG"})
picam2.configure(config)

frame_queue = []
lock = threading.Lock()

# 单独线程负责采集编码,只执行一次
def capture_frames():
    picam2.start()
    while True:
        frame = picam2.capture_array()
        with lock:
            frame_queue.append(frame)
            # 限制队列长度,避免内存溢出
            if len(frame_queue) > 5:
                frame_queue.pop(0)
        time.sleep(0.01)

# 每个客户端对应一个线程,从队列取帧发送
def handle_client(client_socket):
    client_socket.sendall(b'HTTP/1.1 200 OK\r\nContent-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n')
    while True:
        with lock:
            if frame_queue:
                frame = frame_queue[-1]  # 取最新帧,降低延迟
        client_socket.sendall(b'--frame\r\nContent-Type: image/jpeg\r\nContent-Length: %d\r\n\r\n' % len(frame))
        client_socket.sendall(frame)
        client_socket.sendall(b'\r\n')
        time.sleep(0.01)

# 启动服务器
def start_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('0.0.0.0', 8000))
    server_socket.listen(30)
    threading.Thread(target=capture_frames, daemon=True).start()
    while True:
        client_socket, addr = server_socket.accept()
        threading.Thread(target=handle_client, args=(client_socket,), daemon=True).start()

if __name__ == '__main__':
    start_server()

额外优化

  • 降低分辨率(如640x480)或帧率(25fps足够),进一步减少编码压力;
  • 在/boot/config.txt中设置gpu_mem=128,给摄像头编码分配足够GPU资源;
  • 关闭树莓派无关服务(如蓝牙、VNC),释放CPU资源。

2. UDP多播推流(极低服务器负载,支持大量客户端)

TCP协议的拥塞控制会在多客户端场景下放大延迟,改用UDP多播可让服务器仅发送一次视频帧,所有局域网内客户端同时接收,服务器负载几乎与客户端数量无关,延迟可维持在100-200ms。

具体命令

服务器端(树莓派)

用raspivid硬件采集编码,通过GStreamer发送UDP多播:

raspivid -t 0 -w 640 -h 480 -fps 25 -hf -vf -o - | gst-launch-1.0 fdsrc ! jpegparse ! rtpjpegpay ! udpsink host=224.0.0.1 port=5000 auto-multicast=true

客户端

接收UDP多播并解码显示(无需额外服务器,直接从网络抓包):

gst-launch-1.0 udpsrc address=224.0.0.1 port=5000 ! rtpjpegdepay ! jpegdec ! autovideosink sync=false

关键参数

  • sync=false:关闭视频同步逻辑,进一步降低延迟;
  • 多播地址选择224.0.0.0-239.255.255.255范围内的合法地址,确保客户端与服务器在同一局域网。

3. WebRTC推流(跨网/浏览器客户端支持,低延迟)

WebRTC是专为实时通信设计的协议,端到端延迟可控制在50-200ms,支持NAT穿透,客户端可直接用浏览器访问,无需额外软件。服务器仅负责信令转发,负载极低,轻松支持20-30个客户端。

简易实现(Python + aiortc)

from aiortc import MediaStreamTrack, RTCPeerConnection, RTCSessionDescription
from picamera2 import Picamera2
import asyncio
import json
from aiohttp import web

class CameraTrack(MediaStreamTrack):
    kind = "video"

    def __init__(self):
        super().__init__()
        self.picam2 = Picamera2()
        config = self.picam2.create_video_configuration(main={"size": (640, 480), "format": "RGB888"})
        self.picam2.configure(config)
        self.picam2.start()

    async def recv(self):
        frame = self.picam2.capture_array()
        return await self.create_frame(frame)

async def offer(request):
    params = await request.json()
    offer = RTCSessionDescription(sdp=params["sdp"], type=params["type"])

    pc = RTCPeerConnection()
    pc.addTrack(CameraTrack())

    await pc.setRemoteDescription(offer)
    answer = await pc.createAnswer()
    await pc.setLocalDescription(answer)

    return web.Response(
        content_type="application/json",
        text=json.dumps({"sdp": pc.localDescription.sdp, "type": pc.localDescription.type}),
    )

app = web.Application()
app.router.add_post("/offer", offer)

if __name__ == "__main__":
    web.run_app(app, host="0.0.0.0", port=8080)

客户端可通过简单HTML页面连接,实现浏览器端低延迟观看。

方案优先级建议

  1. 局域网场景:优先选择UDP多播MJPEG,实现最简单,服务器负载最低,延迟稳定;
  2. 跨网/浏览器客户端:选择WebRTC,兼容性与低延迟兼顾;
  3. 需HTTP访问:优化MJPEG服务器的并发架构,避免重复编码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:35:50