使用ffmpeg推送RTMP流

-
-
2022-05-19

前言

单位最近好像有网络直播的需要,说起网络直播,最常见的就是通过 RTMP 协议进行网络推流。ffmpeg 是一款开源的图像处理项目,可以方便的进行图像视频处理,推送操作,当然我们需要的推送 RTMP 流功能也可以很好的实现。 本文就以 ffmpeg 为工具进行 RTMP 的推送。

安装 ffmpeg

  1. 在官网下载 ffmpeg 压缩包:下载链接
  2. 解压到本地磁盘
  3. 将解压后的 bin 文件夹路径配置到系统环境变量中
  4. 打开 cmd 输入ffmpeg –version,可以看到ffmpeg的相关信息即可

配置RTMP服务器

  1. 安装nginx,下载地址
  2. 下载nginx-rtmp,下载地址下载后解压放到与nginx的同级目录
  3. 复制nginx的conf文件夹中的nginx-win.conf文件,在其末尾添加
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

“您的支持是我持续分享的动力”

微信收款码
微信
支付宝收款码
支付宝

目录