RTSP H264 流 MSE 播放

elsampsa/websocket-mse-demo 项目介绍:

It this demo we're streaming live video from an RTSP camera to your HTML5 browser.

Video is streamed as H264 encapsulated in MP4. No transcoding takes place in the stream-to-browser pipeline. No browser-side flash or pure-javascript decoders required.

Video is decoded and presented in the browser using the W3 Media Source Extensions that is well supported by all major browsers by > now.

Only H264 is supported - browser MSE's do not support H246 yet (and neither does libValkka).

实现了浏览器 MSE (Media Source Extensions) 播放相机 RTSP (Real Time Streaming Protocol) 流。动手体验一下咯~

准备

# 系统 Ubuntu 18

# 如有 conda 虚拟环境,请停用
# conda deactivate

# 获取代码
git clone --depth 1 https://github.com/elsampsa/websocket-mse-demo.git

# 安装 libValkka
sudo apt-add-repository ppa:sampsa-riikonen/valkka
sudo apt-get update
sudo apt-get install valkka

# 安装 nginx
sudo apt-get install nginx

# 安装 python websockets
pip3 install websockets

# 准备 nginx 用户权限
sudo addgroup nginx
sudo adduser $USER nginx
sudo chgrp -R nginx /var/lib/nginx /var/log/nginx
sudo chmod -R g+r+w+x /var/lib/nginx /var/log/nginx
# 切换用户组
newgrp nginx
id

# 测试 nginx 工作是否正常(无 Permission denied)
cd websocket-mse-demo
nginx -p $PWD -c ./nginx.conf -g 'error_log error.log warn;'

# 设置相机发送 H264(该项目只支持 H264)

使用

发送 RTSP 流:

sudo snap install vlc
# allow camera permission
snap connect vlc:camera :camera

# 发送 ~/Videos/test.mp4 文件(循环)
#  https://archive.org/download/archive-video-files/test.mp4
vlc file:///$HOME/Videos/test.mp4 --loop \
--sout '#gather:transcode{vcodec=h264}:rtp{sdp=rtsp://:8554/test}' \
--network-caching=1500 --sout-all --sout-keep

# 或,发送 /dev/video0 webcam(实时)
vlc v4l2:///dev/video0:chroma=yuyv:width=640:height=480:fps=30 \
--sout '#transcode{vcodec=h264,width=640,height=480}:rtp{sdp=rtsp://:8554/test}'

# 测试接收 RTSP 流
vlc rtsp://127.0.0.1:8554/test

启动程序:

killall -9 nginx
python3 ws_serve_new.py rtsp://127.0.0.1:8554/test

打开浏览器:

xdg-open http://localhost:8089

更多

技术:

  • WebSocket
  • MediaSource: 构建媒体流,供 video/audio 元素播放
  • WebRTC: 可直接捕获客户端视频流,并点对点传输、不依赖服务器中转
  • WebCodecs: 编解码音视频
  • WebAssembly: C/C++/Rust 等编译进前端使用

    • ffmpegwasm/ffmpeg.wasm
    • GoogleChromeLabs/webm-wasm

项目:

  • MSE: 需构建流,通常容器格式是 ISO BMFF (Fragmented MP4) = fMP4
    • elsampsa/websocket-mse-demo: RTSP > fMP4
    • ChihChengYang/wfs.js: H.264 NAL > fMP4
    • bilibili/flv.js: FLV > fMP4
    • Garefield/RTSP-WS-Proxy: RTSP > fMP4
    • Streamedian/html5_rtsp_player: RTSP > fMP4, Proxy 收费
  • JS 解码
    • phoboslab/jsmpeg: MPEG1 Video & MP2 Audio Decoder

      • kyriesent/node-rtsp-stream
      • wanghaoxi3000/gin-rtsp
      • YE-Fan/JAVA-RTSP-JSMpeg
      • Aleckgt/rtsp-ws-proxy
      • k-yle/rtsp-relay
    • mbebenita/Broadway: H.264 decoder

      • 131/h264-live-player
  • Wasm 解码
    • sonysuqin/WasmVideoPlayer: H265 > YUV, WebGL
    • wupeng-engineer/decoder_wasm: H264,H265 > YUV, WebGL
    • gliese1337/h264decoder: H264 > YUV
    • mattdesl/mp4-h264: H264 > YUV/RGB
    • mattdesl/mp4-wasm: H264
  • 其他
    • HTML5 RTSP player: 收费

GoCoding 个人实践的经验分享,可关注公众号!

相关推荐:

如何在 Tkinter 中按顺序播放匹配的视频列表

本文介绍如何使用tkvideo在Tkinter中实现语音识别后匹配多个关键词,并将对应视频逐个顺序播放(而非同时播放),通过自定义Player类与虚拟事件<>实现无缝队列控制。 本文介绍如何使用tkvideo在tkinter中实现语音识别后匹配多个关键词,并将对应视频**逐个顺序播放**...

如何在 Python 中使用 Esc 键实时中断 playsound 播放

本文介绍如何通过多进程与键盘监听机制,实现在playsound播放音频时按Esc键立即停止播放,解决该库原生不支持中断的限制,并提供可运行示例与关键注意事项。 本文介绍如何通过多进程与键盘监听机制,实现在`playsound`播放音频时按esc键立即停止播放,解决该库原生不支持中断的限制,并提供可运...

如何使用 Streamlit 与 OpenCV 实现双视频并行播放

本文详解如何在streamlit应用中稳定、高效地同步播放两个本地视频(如用于计算机视觉对比分析),解决原始循环阻塞、帧不同步及通道错误等常见问题,并提供可直接运行的健壮实现方案。 本文详解如何在streamlit应用中稳定、高效地同步播放两个本地视频(如用于计算机视觉对比分析),解决原始循环阻塞、...

Streamlit + OpenCV 实现双视频并行播放的完整教程

本文详解如何在streamlit中使用opencv同步加载并实时渲染两个本地视频流,以1×2并排布局呈现,兼顾性能、帧同步与色彩空间兼容性。 本文详解如何在streamlit中使用opencv同步加载并实时渲染两个本地视频流,以1×2并排布局呈现,兼顾性能、帧同步与色彩空间兼容性。 在计算机视觉项目...

如何在 CustomTkinter 中播放 GIF 动画

customtkinter原生不支持gif动画自动播放,需手动提取每一帧并配合`after()`实现循环刷新;本文提供可复用的`giflabel`自定义组件,支持自适应尺寸、帧率控制与无缝循环播放。 在CustomTkinter中显示静态图片(如PNG、JPEG)非常简单,直接使用CTkImage配...

Go语言怎么开发浏览器视频流rtsp转webrtc播放

本篇内容主要讲解“Go语言怎么开发浏览器视频流rtsp转webrtc播放”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言怎么开发浏览器视频流rtsp转webrtc播放”吧!1.前言前面我们测试了rtsp转hls方式,发现延迟比较大,不太适合我们的使...

Android编程实现播放视频的方法示例

本文实例讲述了Android编程实现播放视频的方法。分享给大家供大家参考,具体如下: 播放视频文件其实并不比播放音频文件复杂,主要是使用VideoView类来实现的。这个类将视频的显示和控制集于一身,使得我们仅仅借助它就可以完成一个简易的视频播放器。VideoView的用法和MediaPlayer也...

Android开发中播放声音的两种方法分析

本文实例讲述了Android开发中播放声音的两种方法。分享给大家供大家参考,具体如下: 在Android中,音频、视频等多媒体元素的加入,使得应用程序的用户体验更好。可以说,现在的手机,已经远远不只作为通信工具,更成为娱乐、办公的必备产品。 Android提供了简单的音频API。一般大家使用的是Me...