基于FFmpeg模拟监控摄像头输出rtsp视频

|
#python
最后更新于


预计 7 min read


配置环境

FFmpeg

安装 FFmpeg,进入官网点击下载,也可直接使用 GitHub release 直接解压安装(直接解压更为方便,但是需要科学上网)

配置 FFmpeg 环境

在解压后的 ffmpeg-master-latest-win 64-gpl\bin 配置到环境变量里面,以便后续全局使用命令(省略配置环境步骤,同配置 python 环境类似)

MediaMTX

  • MediaMTX 是一个开源的实时媒体服务器和媒体代理,可以作为 rtsp 服务器,能够将媒体流从一个端点路由到另一个端点。 进入 GitHub release 点击下载 下载完毕后解压文件即可。

视频串流查看

VLC

最简单的查看是否推流成功 操作步骤 点击媒体->打开网络串流->输入网路ur

一键执行

  1. 将解压 MediaMTX 的文件夹中的 yml 文件复制粘贴至脚本同级目录下(该配置文件是必须的,如果使用脚本打开 mediamtx 软件,需要将配置一并复制出来)
  2. 执行 python 文件,替换各文件的路径
1
import os
2
3
import subprocess
4
5
import time
6
7
# 启动 mediamtx
8
9
mediamtx_command = "E:\\Video\\mediamtx_v1.9.3_windows_amd64\\mediamtx.exe"
10
11
os.startfile(mediamtx_command)
12
13
time.sleep(1)
14
15
ffmpeg_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
35
process = subprocess.Popen(ffmpeg_command, stdin=subprocess.PIPE)
36
37
# 启动 VLC 播放 RTSP 流
38
39
vlc_command = [
40
41
'E:\\Video\\VLC\\vlc.exe', # VLC 的绝对路径
42
43
'rtsp://localhost:8554/live.sdp'
44
45
]
46
47
subprocess.Popen(vlc_command)

本地视频操作

  1. 准备一个视频在本地
  2. 在解压后的 MediaMTX 文件夹中双击 exe 文件,点击启动 RTSP 视频流服务器
  3. 在视频的同级目录下打开命令窗口,使用命令 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)访问流。
  1. 打开 VLC `点击媒体->打开网络串流->输入网路ur: rtsp://localhost: 8554/live.sdp

笔记本摄像头操作

  1. 在命令窗口查找摄像头名称 ffmpeg -list_devices true -f dshow -i dummy
    video
    video
  2. 使用命令 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协议输出。
  1. 打开 VLC `点击媒体->打开网络串流->输入网路ur: rtsp://localhost: 8554/live.sdp

使用 OpenCV- python 直接调取笔记本摄像头并推流

  1. 创建 python 文件,并设置对应的RTSP流的URL
1
import cv2
2
3
import subprocess
4
5
# FFmpeg命令,设置为RTSP流
6
7
command = [
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
33
process = subprocess.Popen(command, stdin=subprocess.PIPE)
34
35
# 打开摄像头
36
37
cap = cv2.VideoCapture(0) # 0表示默认摄像头
38
39
if not cap.isOpened():
40
41
print("无法打开摄像头")
42
43
exit()
44
45
try:
46
47
while True:
48
49
ret, frame = cap.read()
50
51
if not ret:
52
53
print("无法读取视频帧")
54
55
break
56
57
# 确保帧大小与FFmpeg设置的分辨率匹配
58
59
frame = cv2.resize(frame, (640, 480))
60
61
# 将帧写入FFmpeg的标准输入
62
63
process.stdin.write(frame.tobytes())
64
65
# 显示实时视频
66
67
cv2.imshow('Video', frame)
68
69
if cv2.waitKey(1) & 0xFF == ord('q'):
70
71
break
72
73
except KeyboardInterrupt:
74
75
print("监控已停止")
76
77
# 释放资源
78
79
cap.release()
80
81
process.stdin.close()
82
83
process.wait()
84
85
cv2.destroyAllWindows()
  1. 在解压后的 MediaMTX 文件夹中双击 exe 文件,点击启动 RTSP 视频流服务器。
  2. 执行 python 脚本
  3. 打开 VLC `点击媒体->打开网络串流->输入网路ur: rtsp://localhost: 8554/live.sdp
   
评论