前言※
单位最近好像有网络直播的需要,说起网络直播,最常见的就是通过 RTMP 协议进行网络推流。ffmpeg 是一款开源的图像处理项目,可以方便的进行图像视频处理,推送操作,当然我们需要的推送 RTMP 流功能也可以很好的实现。 本文就以 ffmpeg 为工具进行 RTMP 的推送。
安装 ffmpeg※
- 在官网下载 ffmpeg 压缩包:下载链接
- 解压到本地磁盘
- 将解压后的 bin 文件夹路径配置到系统环境变量中
- 打开 cmd 输入
ffmpeg –version
,可以看到ffmpeg的相关信息即可
配置RTMP服务器※
rtmp {
server {
listen 1935;#监听端口,若被占用,可以更改
chunk_size 4000;#上传 flv 文件块儿的大小
application live { #创建一个叫 live 的应用
live on;#开启 live 的应用
allow publish 127.0.0.1;#
allow play all;
}
}
}
示例代码※
以下代码可以实现将本地的视频以 RTMP 流的方式推送到 RTMP 服务器,实现网络直播。
import cv2
import subprocess
camera_path = r"本地视频地址"
# 视频读取对象
cap = cv2.VideoCapture(camera_path)
# 读取一帧
ret, frame = cap.read()
# 推流地址
rtmp = "RTMP 服务器地址"
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 推流参数
command = ['D:\\ffmpeg\\bin\\ffmpeg.exe',
'-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',
rtmp]
# 创建、管理子进程
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
# 显示一帧
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()
启动程序后,使用 VLC 或者 Potplayer 等软件读取 RTMP 地址即可播放。
ffmpeg-python 包※
通过以上代码确实能够实现 ffmpeg 的推流,不过实际上只是调用了 ffmpeg 自带的命令行工具,更改参数什么的不太方便,后来了解到 python 有 ffmpeg 的包。
pip install ffmpeg-python