• 直播系统开发:基于Nginx与Nginx-rtmp-module实现


    😄作者简介:
    小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
    如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊
    座右铭:不想当开发的测试,不是一个好测试✌️。
    如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

    一、前言

    最近测试直播相关的业务比较多,所以就想着,了解下直播相关的开发,是不是对后续的音视频测试更有帮助。每次推流都是使用公司提供的推流地址,那么是不是可以自己搭建一台,果然,Nginx-rtmp-module模块可以实现一个简易的直播系统。当然在搭建的过程中,也遇到了一些 Nginx 相关的问题,所以把这块内容整理下,加深下印象。

    二、基本配置

    以下内容均在Mac电脑中实现

    2.1 安装Nginx

    brew tap denji/homebrew-nginx
    或者
    brew tap denji/nginx
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    brew tap 的作用:当在核心仓库中没有找到相应软件时,可以通过tap命令从第三方仓库中安装所需软件。 注意:

    1)如果直接使用命令 brew install nginx安装,则后续安装Nginx-rtmp-module模块则会失败。

    2)如果使用命令brew tap homebrew/nginx安装,会提示该命令已经废弃。

    2.2 安装 Nginx-rtmp-module模块

    brew install nginx-full --with-rtmp-module
    
    • 1

    在这里插入图片描述
    这行命令大概会执行十几分钟。 上述两个步骤就安装好了Nginx和 Nginx-rtmp-module模块。

    2.3 修改配置文件

    2.3.1 修改Nginx默认端口号

    Nginx默认的端口号是80,但是我本地80端口被占用,所以需更换 Nginx 端口。

    cd /usr/local/etc/nginx
    open -e nginx.conf
    
    • 1
    • 2

    在这里插入图片描述
    在Http内修改server中端口号,我用的是8082,还需要补充一点,在更换端口号之后可以查看下所要设置的端口是否被占用,使用命令 lsof -i:8082 进行查看,如果是一些无关紧要的应用占用端口则使用命令kill掉:kill PID。

    在这里插入图片描述

    2.3.2 添加rtmp协议

    继续上述操作,在nginx.conf文件中,输入一下rtmp配置,因为rtmp和http是同级,所以直接将rtmp配置放在http协议下面,千万别放在 http 内部。

    rtmp {
        server {
            listen 1919;
             publish_time_fix on;
             application live {
                    live on; #表示直播模式
                    allow publish all; # 允许所有地址发布/播放
                    allow play all;
                    record off; #录制关闭
                    }
         }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    application后面跟应用名,那么对应的推拉流地址为:rtmp://localhost:1919/live/test 其中,test为媒体流名称,可以随意定义。

    2.4 生效配置文件

    上述配置完成之后,使用以下命令,使配置生效

    nginx -s reload 
    
    • 1

    如果回车之后,出现

    nginx: [error] open() "/usr/local/var/run/nginx.pid" failed (2: No such file or directory)  
    
    • 1

    这表示run目录下没有nginx.pid文件,原因可能是停止Nginx时,Nginx将nginx.pid文件删除,所以只需要在命令窗口输入nginx即可生成nginx.pid文件 。这块内容,需要对Nginx有一定的了解,这样才会得心应手。

    三、推拉流实现

    3.1 推流

    3.1.1 指定文件推流

    在命令行输入推流地址命令:

    ffmpeg -re -i /Users/zeng/SVID_20221115_145951_1.mp4 -vcodec copy -f flv rtmp://localhost:1919/live/test
    
    • 1

    -re:表示按照本机帧率发送,当ffmpeg作为推流工具时,一定要加上该参数
    -i:表示input,在推流中,也是必不可少的参数。
    -vcodec copy:拷贝源数据的视频流,-vcodec表示制定视频编码器,对应的音频解码器为:-acodec copy
    -f:指定音视频的存取格式

    在这里插入图片描述

    3.1.2 屏幕推流

    ffmpeg -f avfoundation -pixel_format uyvy422 -i "1" -f flv rtmp://localhost:1919/live/test
    
    • 1

    3.1.3 摄像头+麦克风推流

    ffmpeg -f avfoundation -framerate 30 -video_size 1280x720 -i "0:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1919/live/test
    
    • 1

    3.2 拉流

    在命令行输入如下命令,即可实现拉流

    ffplay rtmp://localhost:1919/live/test
    
    • 1

    以上内容就实现一个基于Nginx-rtmp模块的直播系统。

  • 相关阅读:
    oracle中获取连续几天最低数据
    2023年系统分析师上午题
    教你给Linux下新设备从0开始写一个ioctl驱动接口
    过滤器(filter)、watch 侦听器 、计算属性 、axios、vue-cli 的使用 、vue组件化
    数据湖技术之数据中心 Hudi案例实战
    如何使用autotools制作Makefile
    sqoop同步命令从mysql同步到hive
    【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据
    python 内置函数或函数(争取日更)
    企业架构LNMP学习笔记36
  • 原文地址:https://blog.csdn.net/weixin_42182599/article/details/131166946