【python小脚本】摄像头rtsp流转hls m3u8 格式web端播放
99%的焦虑都来自于虚度时间和没有好好做事,所以唯一的解决办法就是行动起来,认真做完事情,战胜焦虑,战胜那些心里空荡荡的时刻,而不是选择逃避。不要站在原地想象困难,行动永远是改变现状的最佳方式
写在前面
- 工作需要,简单整理
- 实际上这种方式延迟太高了,后来前端直接接的海康的本地解码插件,走的
websockt
- 博文内容为
摄像头 rtsp 实时流转 hls m3u8
的一个 Python 脚本 - 理解不足小伙伴帮忙指正 :),生活加油
99%的焦虑都来自于虚度时间和没有好好做事,所以唯一的解决办法就是行动起来,认真做完事情,战胜焦虑,战胜那些心里空荡荡的时刻,而不是选择逃避。不要站在原地想象困难,行动永远是改变现状的最佳方式
摄像头 rtsp 实时流转 hls m3u8 格式 web 端播放
方案介绍:
- 在服务器上安装并配置
FFmpeg
,从RTSP
摄像头获取实时视频流 - 使用
FFmpeg
并将其转码为HLS
格式,生成m3u8
播放列表和TS
分段文件。 - 将生成的
HLS
文件托管到Nginx
服务器的Web
根目录下,并在Nginx
配置文件中添加相应的配置,以正确处理 HLS 文件的 MIME 类型和跨域访问等。 - 在 Web 页面中使用 HTML5 的
<video>
标签或HLS.js
库来播放Nginx
托管的HLS
视频流。
这里使用的 Nginx 是有 rtmp 模块的 nginx https://github.com/dreammaker97/nginx-rtmp-win32-dev
rtsp 常见的两个转码方式:
rtsp 转 rtmp ffmpeg rtsp 2 rtmp
1 | ffmpeg.exe -i rtsp://admin:hik12345@10.112.205.103:554/Streaming/Channels/101?transportmode=multicast -acodec aac -strict experimental -ar 44100 -ac 2 -b:a 96k -r 25 -b:v 500k -c:v libx264 -c:a copy -f flv rtmp://127.0.0.1:1935/live/demo |
ffmpeg rtsp 2 hls
rtsp 转 hls
1 | ffmpeg -f rtsp -rtsp_transport tcp -i rtsp://admin:hik12345@10.112.205.103:554/Streaming/Channels/101?transportmode=multicast -acodec aac -strict experimental -ar 44100 -ac 2 -b:a 96k -r 25 -b:v 500k -s 640*480 -c:v libx264 -c:a copy -cpu-used 0 -threads 1 -f hls -hls_time 2.0 -hls_list_size 3 -hls_wrap 50 X:\nginx-rtmp-win32-dev\nginx-rtmp-win32-dev\html\hls\test777.m3u8 |
名词解释:
RTSP 协议
: RTSP (Real-Time Streaming Protocol)
是一种用于实时音视频流传输的网络协议,通常用于监控摄像头等设备的实时视频流传输。
HLS 格式
: HLS (HTTP Live Streaming)
是苹果公司开发的自适应比特率流式传输协议,可以将视频流转码为 HTTP 可访问的 TS 分段文件和 m3u8 播放列表。HLS 具有良好的跨平台和兼容性。
FFmpeg
: FFmpeg
是一个强大的多媒体框架,可以用于音视频的编码、解码、转码等操作。它可以将 RTSP 流转码为 HLS 格式。
Nginx
: Nginx 是一款高性能的 Web
服务器,也可作为反向代理服务器使用。它可以托管 HLS 格式的 m3u8 播放列表和 TS 分段文件
,为 Web 端提供 HLS 流
的访问。
HLS.js
: HLS.js 是一款 JavaScript
库,可以在不支持 HLS 原生播放的浏览器上实现 HLS 流的播放。
编码
通过 fastapi
启了一个Web服务,前端获取某个摄像头的流的时候,会启动一个 ffmpeg
子进程来处理流,同时会给前端返回一个 Nginx 推流的 地址
逻辑比较简单,涉及到进程处理,项目启动会自动启动 nginx
,当取流时会自动启动 ffmpeg
,nginx 和 ffmpge
都为 当前 Python 服务的子进程,当web 服务死掉,对应子进程全部死掉。
项目地址: https://github.com/LIRUILONGS/rtsp2hls-M3U8.git
requirements.txt
1 | APScheduler==3.10.4 |
配置文件
1 |
|
核心代码
1 | #!/usr/bin/env python |
nginx 启动相关
1 | # 启动 Nginx |
进程相关方法
1 | def get_process_by_name(process_name, pid=None): |
打包
1 | pyinstaller --add-data "config.yaml;." --add-data "templates/*;templates" main.py |
exe 路径
1 | rtsp2hls2M3U8\dist\main |
配置文件路径
1 | rtsp2hls2M3U8\dist\main\_internal |
部署测试
1 | 2024-08-13 15:57:03,404 - win32.py[line:58] - DEBUG: Looking up time zone info from registry |
API 文档:http://127.0.0.1:8000/docs#
测试页面
1 | {'ip': '192.168.2.25', 'width': 320, 'height': 170, 'time': <module 'time' (built-in)>, 'uuid_v': 'dbeda9ce-01ec-41cd-8315-8145954d1ea0', 'hls_dir': 'X:/nginx-rtmp-win32-dev/nginx-rtmp-win32-dev/html/hls/', 'ffmpeg_dir': 'W:/ffmpeg-20200831-4a11a6f-win64-static//bin/ffmpeg.exe'} |
博文部分内容参考
© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知 :)
© 2018-至今 liruilonger@gmail.com, 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)
【python小脚本】摄像头rtsp流转hls m3u8 格式web端播放
https://liruilongs.github.io/2024/08/13/Python/【python小脚本】摄像头rtsp流转hls-m3u8-格式web端播放/