最近有个项目使用到了监控推流的功能,记录一下自己在实现本地推流的一个经历。
作为一名菜鸟前端切图仔,遇到这种需求的时候,第一时间想到的就是用python去实现(纯属是因为不懂java,并且我认为python相对来说简单点),通过不断的询问DS最终整理出一份可行的方案。
1、安装ffmpeg
首先在电脑上安装chocolatey,管理员身份运行powershell,输入以下代码:
Set-ExecutionPolicy Bypass -Scope Process -Force
![]()
回车后进入下一行代码:
iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex

静静的等待他安装完毕,安装成功后输入choco -v查看他的版本:
![]()
如果正常返回则表示chocolatey安装成功,可以继续安装ffmpeg:
choco install ffmpeg

静静的等待他安装完毕,安装成功后输入ffmpeg校验他是否安装成功:

如果正常返回则表示ffmpeg安装成功。
2、安装mediamtx:
去官网下载压缩包
本人为windows系统,所以本人选择以下包进行下载

这里需要说明以下,这个官网里面最新的这些版本为mediamtx的包,他会自动帮你将rtsp流转换成不同的协议(http、webrtc),如果你单纯只是想要实现rtsp流的话,你可以选择往后面翻页找到rtsp-simple-server的包进行下载:

下载好mediamtx的包后进行解压,得到以下文件:

运行mediamtx.exe文件(可以通过指令方式运行,也可以点击exe文件直接运行):

出现上图的命令板代表这个流已经起起来了,默认rtsp的端口号为8554(这个记着,到时候python需要用到),hls的端口号为8888,webrtc的端口号为8889。
至此,启动rtsp流的步骤已经实现了,接下来就是将你要推的视频流挂载到这个流上面,我通过python去实现对本地笔记本摄像头进行推流
3、python代码
# cv2需要安装opencv-python的依赖
import cv2
import subprocess
# 摄像头设备索引(0 表示默认摄像头)
camera_index = 0
# 推流的地址
rtsp_url = "rtsp://你的ip地址:8554/stream" #8554为上面mediamtx的默认端口号,stream没有特别的意义,单纯是我本人起的一个路径
# 打开本地摄像头
cap = cv2.VideoCapture(camera_index)
# 检查摄像头是否打开
if not cap.isOpened():
print("无法打开摄像头")
exit()
# 获取摄像头分辨率
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
# FFmpeg 推流命令
command = [
"ffmpeg",
"-y", # 覆盖输出文件
"-f", "rawvideo", # 输入格式
"-pix_fmt", "bgr24", # 像素格式
"-s", f"{width}x{height}", # 分辨率
"-r", str(fps), # 帧率
"-i", "-", # 从标准输入读取
"-vf", "scale=1280:720",
"-c:v", "libx264", # 视频编码
"-preset", "ultrafast", # 编码速度
"-b:v", "512k", # 视频码率
"-tune", "zerolatency", # 低延迟
"-rtsp_transport", "tcp", # RTSP 传输协议
"-f", "rtsp", # 输出格式
rtsp_url # 推流地址
]
# 启动 FFmpeg 进程
process = subprocess.Popen(command, stdin=subprocess.PIPE)
try:
while True:
# 获取摄像头帧率
ret, frame = cap.read()
if not ret:
print("获取摄像头帧率失败")
break
# 将帧写入 FFmpeg 的标准输入
process.stdin.write(frame.tobytes())
# 显示帧(可选)
cv2.imshow("Camera", frame)
if cv2.waitKey(1) & 0xFF == ord('q'): # 按 q 退出
break
finally:
# 释放资源
cap.release()
process.stdin.close()
process.wait()
cv2.destroyAllWindows()
运行python代码

如上图则运行成功,这时就可以通过各种途径访问了
VLC:rtsp://你的域名:8554/stream
HLS:http://你的域名:8888/stream (这个可以直接通过浏览器进行访问)
webrtc:http://你的域名:8889/stream/whep (这个也可以直接通过浏览器进行访问,但是有可能同局域网内其他用户访问时会被防火墙拦截。这里我的前端项目用的是这个方式访问流,后期如果有空再出一个vue3项目实现webrtc推流功能的文章)
本人技术有限,如有大佬发现小弟的bug欢迎指出。



2641

被折叠的 条评论
为什么被折叠?



