USB摄像头转rtsp推流,并转websocket流,在浏览器中播放

本文详细介绍了如何下载并配置RTSP服务器、ffmpeg,进行USB摄像头推流,以及通过VLC拉流和使用node-rtsp-stream将RSTP流转换为WebSocket在浏览器中播放的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文章

下载RTSP服务器

下载rtsp-simple-server,现在叫做mediamtx,我用了和博文一样的版本,所以下载的还是rtsp-simle-server而不是现在的mediamtx

下载ffmpeg

参考文章

然后将下载好的ffmpeg和rtsp放到同一个文件夹下

如图

在这里插入图片描述

推流

首先cd进入安装目录

E:
cd E:\Project\LabCockpit\USB摄像头推流测试

打开rtsp服务器

rtsp-simple-server.exe
#或者在linux服务器上运行在后台
nohup mediamtx &

在这里插入图片描述

再打开一个新的终端,同样cd进入安装目录

E:
cd E:\Project\LabCockpit\USB摄像头推流测试

查看自己的摄像头驱动名称

ffmpeg -list_devices true -f dshow -i dummy

在这里插入图片描述

查询到自己的摄像头设备名称为“H65 USB CAMERA”

输入指令开始推流,在指令最后可以修改url,在video处修改为你的摄像头设备

ffmpeg -f dshow -i video="H65 USB CAMERA" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/video

在这里插入图片描述

推流成功

拉流

下载并安装VLC,选中左上角媒体>打开网络串流,输入URL

在这里插入图片描述

点击播放,获取到摄像头影像

在这里插入图片描述

多摄像头

当连接入两个摄像头时

再次输入查看摄像头设备

ffmpeg -list_devices true -f dshow -i dummy

在这里插入图片描述

发现有两个H65 USB CAMERA,这个时候推流就要用摄像头的别名,下面的Alternative name

ffmpeg -f dshow -i video="@device_pnp_\\?\usb#vid_0c45&pid_6368&mi_00#6&ba256cb&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/video1
ffmpeg -f dshow -i video="@device_pnp_\\?\usb#vid_0c45&pid_6368&mi_00#6&3483702d&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/video2

将video改成摄像头别名,然后将最后的URL改成video1和video2即可

rstp流在浏览器播放

现在的浏览器不支持rstp格式的视频流,在网上查询解决方式,最终方案是经转码后视频流通过websocket传送给客户端,再将视频流解码成图片通过canvas渲染出来,参考文章

首先在ubuntu服务器上安装node和npm

sudo apt install node
sudo apt install npm

然后新建一个文件夹rtsp-to-web

mkdir rtsp-to-web
cd rtsp-to-web

在里面安装node-rtsp-stream

npm install node-rtsp-stream -S

随后创建app.js并写入内容

touch app.js
const stream = require('node-rtsp-stream')
 new stream({
  name: 'video-stream',
  streamUrl: 'rtsp://114.214.236.207:8554/video1',//rtsp地址
  wsPort: 9999,//端口号
  ffmpegOptions: { 
    '-stats': '', 
    '-r': 30 ,//视频帧数
    '-s': '1920*1080' //视频分辨率
  }
})

随后启动服务

node app.js

服务启动成功

在这里插入图片描述

随后在本地任意处通过git命令下载jsmpeg.min.js

git clone https://github.com/phoboslab/jsmpeg.git

编写测试界面,并把jsmpeg.min.js复制到同一目录下

<!DOCTYPE >
<html>
  <head>
    <script src="./jsmpeg.min.js"></script>
    <style>
      #video{
        width: 1000px;
        height: 600px;
      }
    </style>
  </head>
  <body>
    <canvas id="video"></canvas>
    <button onclick="onPlay()">播放</button>
    <button onclick="onPause()">暂停</button>
    <button onclick="onStop()">停止</button>
  </body>
  <script>
    var canvas = document.getElementById("video");
    var url = "ws://114.214.236.207:9999";//node服务ip+端口号,本机node服务默认127.0.0.1
    var player = new JSMpeg.Player(url, { canvas });

    //开始播放
    function onPlay() {
      player.play();
    }

    //暂停播放
    function onPause() {
      player.pause();
    }

    //停止播放
    function onStop() {
      player.stop();
    }
  </script>
</html>

打开index.html,得到如下界面
在这里插入图片描述
由于是晚上,1楼实验室太黑了,但隐隐约约还是能看出来有图像的,rtsp流播放成功

### 实现手机APP对树莓派进行远程监控 为了实现通过手机应用程序 (APP) 对树莓派进行远程监控,可以采用一种基于 WLAN 的通信方案。此方法允许用户利用智能手机上的 APP 来查看由安装于树莓派摄像头所捕捉的画面,并能发送指令使搭载有该设备的小车按照指定的方向移动[^1]。 #### 构建服务器端程序 在树莓派一侧需部署服务端软件来负责接收来自客户端的数据请求并向其传输图像帧。这里荐使用 Python 结合 Flask Web 框架搭建 HTTP API 接口用于处理网络连接逻辑;同时调用 OpenCV 库读取 USB 或 PiCamera 设备中的影像资料作为直播源[^2]。 ```python from flask import Flask, render_template_string, Response import cv2 app = Flask(__name__) camera = cv2.VideoCapture(0) def gen_frames(): while True: success, frame = camera.read() if not success: break ret, buffer = cv2.imencode('.jpg', frame) yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + buffer.tobytes() + b'\r\n') @app.route('/video_feed') def video_feed(): return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame') if __name__ == "__main__": app.run(host="0.0.0.0", port=8080) ``` 上述代码片段展示了如何配置一个简易版的视频媒体服务器,它会持续不断地向已建立连接的浏览器送最新的图片帧序列形成动态画面效果。 #### 开发移动端应用界面 对于 Android 平台而言,开发者可以选择 NativeScript、React Native 或者 Flutter 这样的跨平台开发工具快速构建原生体验的应用程序原型。iOS 用户则可能倾向于 Swift/Objective-C 编程语言配合 Xcode IDE 完成相同的工作程。无论哪种方式都离不开 WebView 组件加载 HTML5 页面或是直接集成第三方 SDK 支持 MJPEG/RTSP 协议解析播放 RTMP 地址。 假设已经拥有了一个具备基本功能的操作面板,则可以通过 WebSocket 技术实现实时双向通讯机制从而下达具体动作命令给到远端机器完成诸如前进后退弯等操作。 #### 配置无线局域网环境 确保所有参与交互过程中的电子装置均处于同一 Wi-Fi 子网内部非常重要。因为大多数情况下私有 IP 地址段内的主机之间可以直接相互通信而无需额外配置路由器规则开放特定端口号映射至公网接口之上。 一旦完成了以上准备工作之后便可通过输入形如 `http://<Raspberry_Pi_IP>:8080/video_feed` 形式的 URL 访问位于本地网络里的多媒体资源了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值