1. 在客户端运行rtsp_server(mediamtx.exe)服务器
下载链接:https://github.com/bluenviron/mediamtx
使用教程:https://blog.youkuaiyun.com/qq_20937557/article/details/132271507?spm=1001.2014.3001.5501
2. 在服务端利用ffmpeg向rtmp服务器推流
import cv2
# subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
import subprocess
# 视频读取对象
cap = cv2.VideoCapture(60)
# 推流地址
rtmp = "rtmp://192.168.129.160/live/stream"# 推流的服务器地址
# rtsp = "rtsp://192.168.227.160:8000/live/stream"# 推流的服务器地址
# 设置推流的参数
command = ['ffmpeg',
'-y',
'-f', 'rawvideo',
'-vcodec', 'rawvideo',
'-pix_fmt', 'bgr24',
'-s', '640*480', # 根据输入视频尺寸填写
'-r', '8',
'-i', '-',
'-b:v', '8000k', # 限制视频码率
'-maxrate', '9600k', # 最大码率
'-bufsize', '160000k', # 缓冲区大小
'-qmin','1',
'-qmax','10',
'-c:v', 'h264_rkmpp', # h264
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast',
'-f', 'flv',
rtmp]
# command = [
# 'ffmpeg',
# '-y', # 覆盖输出文件
# '-f', 'rawvideo', # 输入格式为原始视频
# '-vcodec', 'rawvideo', # 输入编解码器为 rawvideo
# '-pix_fmt', 'bgr24', # 输入像素格式
# '-s', '640x480', # 输入分辨率
# '-r', '30', # 输入帧率
# '-i', '-', # 从标准输入读取
# '-c:v', 'h264', # 输出编解码器为 libx264
# '-b:v', '8000k', # 限制视频码率
# '-maxrate', '9600k', # 最大码率
# '-bufsize', '160000k', # 缓冲区大小
# '-qmin', '1', # 最小质量
# '-qmax', '20', # 最大质量
# '-pix_fmt', 'yuv420p', # 输出像素格式
# '-preset', 'ultrafast', # 编码速度
# '-f', 'rtsp', # 输出格式为 rtsp
# '-rtsp_transport', 'udp', # 使用 TCP 进行 RTSP 传输
# rtsp # RTSP 推流地址
# ]
# 创建、管理子进程
pipe = subprocess.Popen(command, stdin=subprocess.PIPE)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# 循环读取
while cap.isOpened():
# 读取一帧
ret, frame = cap.read()
if frame is None:
print('read frame err!')
continue
# 显示一帧
# fps = int(cap.get(cv2.CAP_PROP_FPS))
# cv2.imshow("frame", frame)
# 按键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 读取尺寸、推流
img = cv2.resize(frame, size)
pipe.stdin.write(img.tobytes())
# 关闭窗口
cv2.destroyAllWindows()
# 停止读取
cap.release()
3. 用VLC media player在客户端接收来自服务器的视频流
4. ffmpeg常用命令
获得图片
ffmpeg -rtsp_transport tcp -i "rtsp://admin:a1234567@192.168.1.64:554/h264/ch1/main/av_stream" -vframes 1 -y output.png
参数 | 含义 |
---|---|
-rtsp_transport tcp | 使用 TCP 避免 UDP 丢帧(建议开启) |
-vframes 1 或 -frames:v 1 | 只提取 1 帧 |
-q:v 1 | JPEG 图像质量设置中 1 表示最高质量(范围是 1–31,1 为最好) |
-update 1 | 如果持续保存帧到同一个文件,可启用该参数,保存最新帧(非必须) |
-y | 自动覆盖旧图像 |
获得视频
ffmpeg -rtsp_transport tcp -i "rtsp://admin:a1234567@192.168.10.101:554/h264/ch1/main/av_stream" \
-c:v libx264 -preset slow -crf 18 -t 00:01:00 -y output_high.mp4
参数 | 说明 |
---|---|
-c:v libx264 | 使用 H.264 编码 |
-crf 18 | Constant Rate Factor,18 表示非常高质量(越小越清晰,推荐范围 18–23) |
-preset slow | 编码预设(越慢质量越好),可选:ultrafast, fast, medium, slow, slower |
-t 00:01:00 | 录制时长(此处是 1 分钟) |
-y | 自动覆盖输出文件 |