基于FFmpeg模拟监控摄像头输出rtsp视频
预计 7 min read
配置环境
FFmpeg
安装 FFmpeg,进入官网点击下载,也可直接使用 GitHub release 直接解压安装(直接解压更为方便,但是需要科学上网)
配置 FFmpeg 环境
在解压后的 ffmpeg-master-latest-win 64-gpl\bin
配置到环境变量里面,以便后续全局使用命令(省略配置环境步骤,同配置 python 环境类似)
MediaMTX
- MediaMTX 是一个开源的实时媒体服务器和媒体代理,可以作为 rtsp 服务器,能够将媒体流从一个端点路由到另一个端点。 进入 GitHub release 点击下载 下载完毕后解压文件即可。
视频串流查看
VLC
最简单的查看是否推流成功
操作步骤 点击媒体->打开网络串流->输入网路ur
一键执行
- 将解压 MediaMTX 的文件夹中的 yml 文件复制粘贴至脚本同级目录下(该配置文件是必须的,如果使用脚本打开 mediamtx 软件,需要将配置一并复制出来)
- 执行 python 文件,替换各文件的路径
1import os2
3import subprocess4
5import time6
7# 启动 mediamtx8
9mediamtx_command = "E:\\Video\\mediamtx_v1.9.3_windows_amd64\\mediamtx.exe"10
11os.startfile(mediamtx_command)12
13time.sleep(1)14
15ffmpeg_command = [16
17'ffmpeg',18
19'-re',20
21'-stream_loop', '-1',22
23'-i', 'C:\\Users\\ASUS\\Desktop\\test_video\\assets\\xiaomi.mp4',24
25'-c:v', 'libx264',26
27'-f', 'rtsp',28
29'rtsp://localhost:8554/live.sdp' # RTSP 流地址30
31]32
33# 启动FFmpeg进程34
35process = subprocess.Popen(ffmpeg_command, stdin=subprocess.PIPE)36
37# 启动 VLC 播放 RTSP 流38
39vlc_command = [40
41'E:\\Video\\VLC\\vlc.exe', # VLC 的绝对路径42
43'rtsp://localhost:8554/live.sdp'44
45]46
47subprocess.Popen(vlc_command)
- 点击查看源码
本地视频操作
- 准备一个视频在本地
- 在解压后的 MediaMTX 文件夹中双击
exe
文件,点击启动 RTSP 视频流服务器 - 在视频的同级目录下打开命令窗口,使用命令
ffmpeg -re -stream_loop -1 -i .\xiaomi.mp4 -c:v libx264 -f rtsp rtsp://localhost:8554/live.sdp
ffmpeg
: 调用FFmpeg程序-re
: 表示以实时速度读取输入文件。适用于流媒体输出,这样FFmpeg会模拟输入文件的真实播放速度。-stream_loop -1
:设置输入流的循环播放次数。-1
表示无限循环。此参数使得视频在播放完毕后会自动从头开始播放-i .\xiaomi.mp4
:指定输入文件。.\xiaomi.mp4
是要循环播放的本地视频文件路径(.
表示当前目录)。-c:v libx264
:设置视频编码器为libx264
,这是用于H.264编码的FFmpeg库。H.264是一种常用的高效视频编码格式,适合网络流媒体。-f rtsp
:指定输出格式为RTSP(Real-Time Streaming Protocol)。RTSP是一种网络协议,用于控制流媒体服务器的播放。rtsp://localhost:8554/live.sdp
:设置输出RTSP流的URL。localhost
表示本机,8554
是端口号,/live.sdp
是流的路径。使用该URL可以通过RTSP播放器(如VLC)访问流。
- 打开 VLC `点击媒体->打开网络串流->输入网路ur: rtsp://localhost: 8554/live.sdp
笔记本摄像头操作
- 在命令窗口查找摄像头名称
ffmpeg -list_devices true -f dshow -i dummy
video - 使用命令
ffmpeg -f dshow -rtbufsize 100M -i video="USB2.0 HD UVC WebCam" -video_size 640x480 -r 15 -c:v libx264 -preset ultrafast -f rtsp rtsp://localhost:8554/live.sdp
调取摄像头,并且实时的推流
-f dshow
:指定输入格式为DirectShow。这用于从摄像头获取视频流。-rtbufsize 100M
:设置实时缓冲区大小为100MB。防止在读取视频流时因缓冲区满而丢帧。-i video="USB2.0 HD UVC WebCam"
:指定输入设备为USB2.0 HD UVC WebCam
。这是你系统中的摄像头名称。确保这个名称与实际设备匹配。-video_size 640x480
:设置视频分辨率为640x480。确保捕获的画面符合此分辨率。-r 15
:设置帧率为15帧每秒。这会影响视频流的流畅度,较低的帧率可以减小数据量。-c:v libx264
:设置视频编码器为libx264
,用于H.264编码。H.264是一种高效的视频压缩格式,常用于网络流。-preset ultrafast
:指定编码速度的预设,ultrafast
表示使用最快的编码方式,适合实时流媒体。使用更快的预设会减少CPU负担,但会牺牲压缩效率。-f rtsp
:设置输出格式为RTSP(实时流传输协议)。这使得FFmpeg能够将视频流通过RTSP协议输出。
- 打开 VLC `点击媒体->打开网络串流->输入网路ur: rtsp://localhost: 8554/live.sdp
使用 OpenCV- python 直接调取笔记本摄像头并推流
- 创建 python 文件,并设置对应的RTSP流的URL
1import cv22
3import subprocess4
5# FFmpeg命令,设置为RTSP流6
7command = [8
9'ffmpeg',10
11'-y', # 覆盖输出文件12
13'-f', 'rawvideo',14
15'-pix_fmt', 'bgr24',16
17'-s', '640x480',18
19'-r', '30',20
21'-i', '-',22
23'-c:v', 'libx264',24
25'-f', 'rtsp',26
27'rtsp://localhost:8554/live.sdp'28
29]30
31# 启动FFmpeg进程32
33process = subprocess.Popen(command, stdin=subprocess.PIPE)34
35# 打开摄像头36
37cap = cv2.VideoCapture(0) # 0表示默认摄像头38
39if not cap.isOpened():40
41print("无法打开摄像头")42
43exit()44
45try:46
47while True:48
49ret, frame = cap.read()50
51if not ret:52
53print("无法读取视频帧")54
55break56
57# 确保帧大小与FFmpeg设置的分辨率匹配58
59frame = cv2.resize(frame, (640, 480))60
61# 将帧写入FFmpeg的标准输入62
63process.stdin.write(frame.tobytes())64
65# 显示实时视频66
67cv2.imshow('Video', frame)68
69if cv2.waitKey(1) & 0xFF == ord('q'):70
71break72
73except KeyboardInterrupt:74
75print("监控已停止")76
77# 释放资源78
79cap.release()80
81process.stdin.close()82
83process.wait()84
85cv2.destroyAllWindows()
- 在解压后的 MediaMTX 文件夹中双击
exe
文件,点击启动 RTSP 视频流服务器。 - 执行 python 脚本
- 打开 VLC `点击媒体->打开网络串流->输入网路ur: rtsp://localhost: 8554/live.sdp
评论