WebRTC(TODO)

1 简介

只是简单学学。。。

简单看了下,貌似就是SIP的下一代。因为我对SIP很熟,所以就比对着来写。

传统的SIP

WebRTC

网络端

终端

2 树莓派的实现

代码

bash 复制代码
webrtc-pi/
├── server.py
├── static/
│   └── client.html

server.py

python 复制代码
import cv2
import asyncio
from aiortc import MediaStreamTrack, RTCPeerConnection, RTCSessionDescription
from aiortc.contrib.media import MediaRelay
from flask import Flask, render_template, request, jsonify, send_from_directory
import json

app = Flask(__name__, static_url_path='')

pcs = set()
relay = MediaRelay()

# 视频采集轨道(OpenCV)
class VideoTrack(MediaStreamTrack):
    kind = "video"

    def __init__(self):
        super().__init__()
        self.cap = cv2.VideoCapture(0)

    async def recv(self):
        pts, time_base = await self.next_timestamp()
        ret, frame = self.cap.read()
        if not ret:
            return None
        # 关键:OpenCV 转 RGB
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        from av import VideoFrame
        video_frame = VideoFrame.from_ndarray(frame, format="rgb24")
        video_frame.pts = pts
        video_frame.time_base = time_base
        return video_frame

@app.route('/')
def index():
    return send_from_directory('static', 'client.html')

@app.route('/offer', methods=['POST'])
def offer():
    offer_sdp = request.get_json()
    pc = RTCPeerConnection()
    pcs.add(pc)

    video = VideoTrack()
    pc.addTrack(video)

    async def create_answer():
        await pc.setRemoteDescription(RTCSessionDescription(**offer_sdp))
        answer = await pc.createAnswer()
        await pc.setLocalDescription(answer)
        return pc.localDescription

    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    desc = loop.run_until_complete(create_answer())
    return jsonify({'sdp': desc.sdp, 'type': desc.type})

@app.route('/answer', methods=['POST'])
def answer():
    return "OK"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

client.html

html 复制代码
<!DOCTYPE html>
<html>
<head>
  <title>Raspberry Pi WebRTC Camera</title>
</head>
<body>
  <h2>WebRTC Camera Stream</h2>
  <video id="video" autoplay playsinline controls></video>
  <script>
    const pc = new RTCPeerConnection();
    const video = document.getElementById("video");

    pc.ontrack = function (event) {
      video.srcObject = event.streams[0];
    };

    fetch("/offer", { method: "POST" })
      .then(res => res.json())
      .then(async ({ sdp, type }) => {
        await pc.setRemoteDescription({ sdp, type });
        const answer = await pc.createAnswer();
        await pc.setLocalDescription(answer);

        fetch("/answer", {
          method: "POST",
          headers: { "Content-Type": "application/json" },
          body: JSON.stringify(pc.localDescription),
        });
      });
  </script>
</body>
</html>

TODO

相关推荐
平行云8 小时前
LarkXR 赋能AI x XR数字供应链:引领智能设计、数字孪生与零售新未来
人工智能·webrtc·xr·云渲染·虚幻引擎·云展厅
CatalyzeSec8 小时前
【插件推荐】WebRTC Protect — 防止 IP 泄漏
网络·webrtc
却道天凉_好个秋8 小时前
WebRTC(一):整体架构
webrtc
邪恶的贝利亚1 天前
从sdp开始到webrtc的通信过程
webrtc·流媒体·sdp
却道天凉_好个秋2 天前
WebRTC(三):P2P协议
网络协议·webrtc·p2p
邪恶的贝利亚2 天前
从基础到实战-rmpt to webrtc
c++·webrtc·rtmp·流媒体
却道天凉_好个秋3 天前
WebRTC(二):工作机制
webrtc
邪恶的贝利亚4 天前
WebRTC 中 ICE 流程优化:SRS 轻量级部署与 NAT 类型检测实战
c++·webrtc·流媒体·ice
邪恶的贝利亚4 天前
实现p2p的webrtc-srs版本
网络协议·webrtc·p2p
_可乐无糖5 天前
EC2安装WebRTC sdk-c环境、构建、编译
服务器·webrtc·aws