概述
本教程实现在Ubuntu上部署rtmp服务器并在Windows上使用python脚本推流到rtmp服务器。
一、Ubuntu系统rtmp服务器部署
- 安装docker
sudo apt-get install docker.io
- 配置docker镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://6ykn8gfe.mirror.aliyuncs.com"] } EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
- 拉取rtmp镜像并运行
sudo docker pull jun3/rtmp
sudo docker run --name rtmp -p 1935:1935 -p 8080:80 -d -it jun3/rtmp
运行该镜像就相当于rtmp服务器已经在Ubuntu服务器上部署了。
二、rtmp服务器的简单操作
在Ubuntu服务器上打开浏览器输入地址127.0.0.1:8080/stat
可以看到当前服务器连接情况。以下分别是无连接和有连接的情况:
三、Windows上安装FFMpeg
FFMpeg可以实现推流视频到rtmp服务器,安装步骤如下:
- 下载FFMpeg——FFMpeg下载,自行选择自己需要的多少位的静态程序
- 解压到指定文件夹下——比如
D:\ffmpeg
- 添加到环境变量——为系统变量中的Path变量添加以下一行:
d:\ffmpeg\bin
- 查看FFmpeg版本信息——cmd中输入命令
ffmpeg -version
,如果出现版本信息则安装成功。
四、Windows上推流到Ubuntu的rtmp服务器
- Ubuntu上使用
ifconfig
命令查看本机ip地址:
- 脚本内容
import cv2 import time import subprocess as sp import multiprocessing import psutil class stream_pusher(object): def __init__(self, rtmp_url=None, raw_frame_q=None): self.rtmp_url = rtmp_url self.raw_frame_q = raw_frame_q fps = 20 width = 640 height = 480 self.command = ['ffmpeg', '-y', '-f', 'rawvideo', '-vcodec', 'rawvideo', '-pix_fmt', 'bgr24', '-s', "{}x{}".format(width, height), '-r', str(fps), '-i', '-', '-c:v', 'libx264', '-pix_fmt', 'yuv420p', '-preset', 'ultrafast', '-f', 'flv', self.rtmp_url] def __frame_handle__(self, raw_frame, text, shape1, shape2): return (raw_frame) def push_frame(self): p = psutil.Process() p.cpu_affinity([0, 1, 2, 3]) p = sp.Popen(self.command, stdin=sp.PIPE) while True: if not self.raw_frame_q.empty(): raw_frame, text, shape1, shape2 = self.raw_frame_q.get() frame = self.__frame_handle__(raw_frame, text, shape1, shape2) p.stdin.write(frame.tostring()) else: time.sleep(0.01) def run(self): push_frame_p = multiprocessing.Process(target=self.push_frame, args=()) push_frame_p.daemon = True push_frame_p.start() if __name__ == '__main__': cap = cv2.VideoCapture(0) cap.set(3, 640) cap.set(4, 480) rtmpUrl = "rtmp://192.168.1.35:1935/stream/pupils_trace" raw_q = multiprocessing.Queue() my_pusher = stream_pusher(rtmp_url=rtmpUrl, raw_frame_q=raw_q) my_pusher.run() while True: _, raw_frame = cap.read() info = (raw_frame, '2', '3', '4') if not raw_q.full(): raw_q.put(info) cv2.waitKey(1) cap.release() print('finish')
main函数中的rtmpUrl
中的ip地址要改成上一步中查询到的Ubuntu的ip地址。执行该脚本就会推流到Ubuntu的rtmp服务器,在Ubuntu服务器的浏览器中通过127.0.0.1:8080/stat
地址就可以看到该视频流的传输情况。
五、Ubuntu开机以后如何启动docker镜像运行rtmp服务器
- 查看该镜像的容器id
sudo docker ps -a
下图所示即为该镜像的容器id:
- 启动该容器
输入以下命令启动id为上一步查询到的id的容器,就可以启动rtmp服务器了:
sudo docker start a47e08eaef8b
六、视频拉流
只需要一行代码:
vs = cv2.VideoCapture('rtmp://192.168.1.35:1935/stream/pupils_trace')