基于Flask实现类直播式多视频实时流式传输的简易方案问询
简易实现方案推荐
方案1:HLS 静态切片 + 后台自动续播
因为并发量低(≤5),用ffmpeg做轻量切片配合静态文件服务器就能搞定,不用复杂的RTMP服务:
- 后台跑个常驻进程,按顺序处理视频列表(不用实际渲染,只管编码切片):
- 初始化播放列表,记录当前播放的视频索引和进度
- 对当前视频用ffmpeg生成HLS切片:
ffmpeg -i 当前视频路径 -c:v libx264 -c:a aac -hls_time 10 -hls_list_size 0 -hls_flags delete_segments 输出目录/stream.m3u8 - 视频播完自动切列表里的下一个,重复切片操作
- 前端直接用HTML5的
video标签加载m3u8文件:<video controls> <source src="/static/stream.m3u8" type="application/x-mpegURL"> </video> - 优势:前端不用复杂逻辑,靠浏览器原生HLS支持就行;后台实现简单,ffmpeg命令行搞定切片,加个Python脚本就能维护播放列表和自动续播。
方案2:Flask 实时进度同步 + 范围请求流式传输
不想用HLS的话,直接基于Flask的静态文件服务,配合进度同步也能实现准实时播放:
- 后台部分:
- 用Python线程维护全局播放状态:当前播放的视频文件、已播放时长、播放状态
- 线程持续更新播放时长(模拟播放就行,不用解码视频,按视频总时长算进度),视频结束自动切下一个
- 开个API接口
/current-progress,返回当前播放状态(视频文件名、当前进度秒数) - 重写Flask的静态文件路由,支持HTTP范围请求,客户端请求时从指定进度的字节位置开始返视频流
- 前端部分:
- 页面加载先请求
/current-progress拿当前进度 - 用
fetch或XMLHttpRequest请求视频流,设置Range头指定起始字节(提前用ffprobe获取视频字节和时长的对应关系,换算进度对应的字节位置) - 把流喂给
video标签,同时每2秒左右请求一次进度接口,调整播放位置避免偏移
- 页面加载先请求
- 优势:完全在Flask生态里,不用额外加第三方流媒体服务;逻辑直观,适配小并发场景。
方案3:本地RTSP转HTTP流(极简版)
要是有现成的视频播放工具,直接用ffmpeg把本地播放的视频转成RTSP流,再转成HTTP流给前端:
- 后台启动一个进程,用ffmpeg循环播放视频列表并推流:
ffmpeg -re -stream_loop -1 -i 视频列表.txt -c copy -f rtsp rtsp://localhost:8554/live - 再开个ffmpeg进程把RTSP转成HTTP流:
ffmpeg -i rtsp://localhost:8554/live -c copy -f flv http://localhost:5000/live.flv - 前端用支持FLV的播放器(比如原生video标签加flv.js)加载流:
<script src="flv.min.js"></script> <video id="videoElement" controls></video> <script> if (flvjs.isSupported()) { var flvPlayer = flvjs.createPlayer({ type: 'flv', url: 'http://localhost:5000/live.flv' }); flvPlayer.attachMediaElement(document.getElementById('videoElement')); flvPlayer.load(); flvPlayer.play(); } </script> - 优势:不用写复杂的播放逻辑,靠ffmpeg命令行就能完成流的转换和续播,适合快速搭起来用。
内容的提问来源于stack exchange,提问作者George Yu
相关产品推荐
相关产品推荐

