个人流媒体服务搭建

news2024/9/22 10:05:21

简介

主要是个人的流媒体服务器的创建的方式分享

Centos7自建基于HLS的私人直播服务器

相关资源下载

链接:https://pan.baidu.com/s/1zhWFpFRy2v0_lyjA0-AfAg 
提取码:yyds 


入门操作

实现方法基于nginx和nginx的一个rtmp模块。因为epel源和nginx官方源里面安装的nginx是没有nginx-rtmp-module的,所以只能编译安装

先新建一个www用户和组专门用来跑Nginx:

groupadd www
useradd www -g www -s /sbin/nologin

安装EPEL/开发工具包/以及编译Nginx所需的依赖:

yum -y install epel-release
yum -y groupinstall "Development Tools"
yum -y install wget openssl-devel pcre-devel zlib-devel geoip-devel gd-devel

进入到opt目录下载nginx-rtmp-module模块:

如果下载不了,可以访问我的百度网盘

链接:https://pan.baidu.com/s/1qwzHVbHqG_0SBcEb1UaeZg 
提取码:yyds 

cd /opt
git clone https://github.com/arut/nginx-rtmp-module.git

同时下载解压Nginx并进入到Nginx的源码目录:

wget http://nginx.org/download/nginx-1.15.8.tar.gz
tar -xzvf nginx-1.15.8.tar.gz
cd nginx-1.15.8

虽然我们本次使用Nginx只是需要用到它的RTMP功能,但既然都编译了,就编译个全面一点的Nginx吧,所以这里我还是把Nginx常用的一些功能和模块都加上:

由于我网盘里面是windows压缩的,会有文件换行的问题

yum install dos2unix
dos2unix /opt/nginx-rtmp-module/config

同理,如果你的文件是在 linux 编写需要到 windows 环境使用:

unix2dos file
./configure --user=www --group=www --prefix=/usr/local/nginx --add-module=/opt/nginx-rtmp-module --with-http_ssl_module --with-http_v2_module --with-stream --with-stream_ssl_module --with-http_gzip_static_module --with-http_gunzip_module --with-http_flv_module --with-http_mp4_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_stub_status_module --with-http_realip_module --with-http_addition_module

如果配置没有错误,那么就可以编译并完成安装了:

make
make install

然后新建一个systemd服务:

vi /etc/systemd/system/nginx.service

写入:

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

现在创建hls视频文件存放的目录:

mkdir -p /opt/stream/hls

接着创建一个conf.d目录,专门用来存放Nginx的站点配置文件:

mkdir -p /usr/local/nginx/conf/conf.d

很多人配置的时候都喜欢直接在Nginx的主配置文件内去写http段,这是极其愚蠢的做法。为了可以让你的Nginx配置变的一目了然,更好的分类,正确的做法应该是在主配置文件内引用其他http段的配置,所以现在编辑Nginx的主配置文件:

vi /usr/local/nginx/conf/nginx.conf

引用我们之前创建的conf.d目录,所以在Nginx的主配置文件加入:

include /usr/local/nginx/conf/conf.d/*.conf;

位置如图:

接着我们还是在这个配置文件内加入RTMP的设置,基本上每个参数我都写了注释,你可以一目了然的知道这些配置都做了啥:

vi /usr/local/nginx/conf/nginx.conf
rtmp {
    server {
        #记得放开下端口安全组
        listen 1935;
        chunk_size 4000;
        # POST请求改为GET用于鉴权验证
        notify_method get;

        application show {
            # 开启实时
            live on;
            # 鉴权验证
            on_publish http://你的服务器公网IP/auth;
            # 加密视频
            wait_key on;
            # 开启HLS
            hls on;
            # ts文件存放路径
            hls_path /opt/stream/hls;
            # 每个ts包含5秒视频
            hls_fragment 5;
            # hls可回放时间
            hls_playlist_length 60;
            # 连续模式,可解决libx264编码出现的缓冲问题
            hls_continuous on;
            # 创建子目录存放ts文件
            hls_nested on;
            # 直播结束清理所有视频文件
            hls_cleanup on;
        }
    }
}

例子 

rtmp {
    server {
        listen 1935;
        chunk_size 4000;
        notify_method get;

        application show {
            live on;
            #由于后面写的server我配置的是8080
            on_publish http://101.132.163.124:8080/auth;
            wait_key on;
            hls on;
            hls_path /opt/stream/hls;
            hls_fragment 5;
            hls_playlist_length 60;
            hls_continuous on;
            hls_nested on;
            hls_cleanup on;
        }
    }
}

上面这段配置加到events段的下面,如图所示:

 接着我们新建一个站点配置文件

vi /usr/local/nginx/conf/conf.d/stream.conf

写入:

server {
    listen       80;
    server_name  你的服务器公网IP;
    charset utf-8;

    location / {
        root   /usr/local/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/local/nginx/html;
    }

    # 简单的鉴权验证
    location /auth {
        if ($arg_psk = '设置你的直播密码') {
          return 201;
          }
          return 404;
    }

    # HTTP播放地址
    location /live {
        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }
        alias /opt/stream/hls;   
        expires -1;
        add_header Cache-Control no-cache;
    }

    # 统计
    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }

    location /stat.xsl {
        root /opt/nginx-rtmp-module/;
    }
}

例子 

server {
    #由于我的ip没有备案不能用80就用的8080
    listen       8080;
    server_name  101.132.163.124;
    charset utf-8;

    location / {
        root   /usr/local/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/local/nginx/html;
    }

    # 简单的鉴权验证
    location /auth {
        if ($arg_psk = '123') {
          return 201;
          }
          return 404;
    }

    # HTTP播放地址
    location /live {
        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }
        alias /opt/stream/hls;   
        expires -1;
        add_header Cache-Control no-cache;
    }

    # 统计
    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }

    location /stat.xsl {
        root /opt/nginx-rtmp-module/;
    }
}

Nginx的配置到这里就完成了,我们可以使用下面的命令检查一下配置是否正常:

(如果这里检查出文件格式出现问题,也就是./configure这一步出现了编译问题,那么用dos2unix /opt/nginx-rtmp-module/config转换成linux格式就行了,然后从./configure这一步重新编译安装直到成功为止)

/usr/local/nginx/sbin/nginx -t

 有错误就按照错误的提示去排查,没错误就可以用systemd启动Nginx了:

systemctl start nginx
systemctl enable nginx

下面我用Dplayer简单弄个html页面用来测试是否可以正常直播:

cd /usr/local/nginx/html/

下载hls.min.js:

链接:https://pan.baidu.com/s/136gyDHi4YagCg6_S-l3GaQ 
提取码:yyds 

wget https://github.com/video-dev/hls.js/releases/download/v0.12.2/hls.min.js

编辑这个目录内的index.html:

vi index.html

把里面的内容替换成:

<link rel="stylesheet"  href="https://cdn.bootcss.com/dplayer/1.25.0/DPlayer.min.css">
<script src="hls.min.js"></script>
<script src="https://cdn.bootcss.com/dplayer/1.25.0/DPlayer.min.js"></script>
<div id=”dplayer”></div>
<script>
const dp = new DPlayer({
container: document.getElementById(‘dplayer’),
video: {
url: ‘http://你的服务器公网IP/live/imlala/index.m3u8’,
type: ‘hls’
}
});
</script>

例子

<link rel="stylesheet"  href="https://cdn.bootcss.com/dplayer/1.25.0/DPlayer.min.css">
<script src="hls.min.js"></script>
<script src="https://cdn.bootcss.com/dplayer/1.25.0/DPlayer.min.js"></script>
<div id="dplayer"></div>
<script>
const dp = new DPlayer({
container: document.getElementById("dplayer"),
video: {
url: "http://101.132.163.124:8080/live/imlala/index.m3u8",
type: "hls"
}
});
</script>

电脑推流使用OBS进行如下设置:

 

然后点击开始直播 

 这里还是具体说一下这个OBS的推流设置,首先URL就是:

rtmp://你的服务器公网IP:1935/show/

而下面这个流的名称,比如我是:

imlala?psk=123

这其中imlala是可以自定义的,你可以把这个理解成一个直播间名字(房间号)而后面的233133xxx就是你的直播密码,这个密码是在/usr/local/nginx/conf/conf.d/stream.conf内可以设置的。其次如果你修改了你的直接间名字(房间号)那么上面那个示例html中的播放地址也需要做修改:

http://你的服务器公网IP/live/imlala/index.m3u8

这样就可以实现一个私人的直播间,如果你不做这种鉴权验证的话,那只要有人知道你的rtmp地址就可以用你的服务器做直播,这样会造成滥用。 

最后通过浏览器访问服务器IP测试是否能够正常播放(不好意思我的电脑里面只有这种视频):

http://101.132.163.124:8080/

在上面的配置中,我还配置了一个简易的统计功能,访问:

http://你的服务器公网IP/stat

可以浏览到当前你的直播间有多少观众以及你直播的时长:

 参考地址https://lala.im/4799.html

一个极易部署的流媒体服务:Node-Media-Server

现在有很多自建流媒体服务器的方法,最常用的应该是Nginx,但如果是自己想体验一下的话,这个Node-Media-Server比Nginx配置起来要简单很多,而且还有一个简单的WEB面板可以方便的查看一些信息。

这里使用Docker的方式部署,首先安装Docker

curl -sSL https://get.docker.com/ | sh
systemctl start docker
systemctl enable docker

一条命令即可完成部署:

docker run -d -p 1935:1935 -p 8000:8000 --restart=always --name nms illuspas/node-media-server

然后我们需要进到容器内,做一些更改:

docker exec -it nms /bin/sh

编辑:

vi /usr/src/app/bin/app.js

找到下面这一段,更改默认的管理员密码,然后把publish改为true,最后把secret也改一下,例如:

  auth: {                
    api: true,
    api_user: 'admin',
    api_pass: 'admin',
    play: false,
    publish: true,      
    secret: 'x1x2x3x4x5lalaim'                                        
  } 

这样做的话是让推流有一个鉴权验证,不做验证的话任何人知道你这个服务器的地址都能用你这台机器推流,这样会造成滥用。

改完之后退出容器并重启:

exit
docker restart nms

如果上面的重启报错,回显类似什么iptables/DNAT啥的,就直接重启Docker服务吧:

systemctl restart docker

因为我们给推流做了一个鉴权验证,这个时候我们需要计算一下推流的地址,首先要定义一个推流地址过期的时间,这里我假设地址在2023年的7月1日过期,那么将时间戳换算成unix的类型

date -d "2023-07-01 00:00:00" +%s

执行上述的命令后,得到的unix时间戳是:

1688140800

然后我们把时间戳和之前在app.js内配置的secret进行一次md5加密,格式如下:

echo -n "/live/test-1688140800-x1x2x3x4x5lalaim" | md5sum

注:其中的test是可以自己随便更改的,你这里可以理解为这是一个直播间的名字。

执行完上面的命令得到的md5值是:

c52940001cbe732cce6b4ca08980438f

那么最终我们的推流地址就是:

rtmp://101.132.163.124:1935/live/test?sign=1688140800-c52940001cbe732cce6b4ca08980438f

服务端这边就部署完成了,下面简单说一下怎么用FFMPEG/OBS推流。

FFMPEG推流

安装FFMPEG,这边一切从简,直接用FFMPEG的静态包:

wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
tar -xJf ffmpeg-release-amd64-static.tar.xz
cd ffmpeg-4.1.3-amd64-static
cp ffmpeg /usr/bin && cp ffprobe /usr/bin && cp qt-faststart /usr/bin

然后随便找个视频文件测试一下:

ffmpeg -re -i 230OREC-315.mp4 \
-c:v libx264 -preset superfast -tune zerolatency \
-c:a aac -ar 44100 -f flv rtmp://vpsip/live/test?sign=1561939200-2e99dbb982cd4bb0edd485a2d249745c

类似如下图的回显就说明推流成功:

OBS推流

OBS推流设置:

现在我们可以访问一下WEB面板看看推流是否正常:

http://101.132.163.124:8000/admin/

下面是使用obs推流的效果 

这个媒体服务器支持很多种格式,像什么FLV/HLS/DASH都是支持的,相应的拉流地址:

http://vpsip:8000/live/STREAM_NAME.flv
ws://vpsip:8000/live/STREAM_NAME.flv
http://vpsip:8000/live/STREAM_NAME/index.m3u8
http://vpsip:8000/live/STREAM_NAME/index.mpd

链接:https://pan.baidu.com/s/1gWD9De9LY2kqYFkJdcnr8g 
提取码:yyds 
--来自百度网盘超级会员V5的分享 

<script src="https://cdn.bootcss.com/flv.js/1.5.0/flv.min.js"></script>
<video id="videoElement"  muted="muted"></video>

<script>
    if (flvjs.isSupported()) {
        var videoElement = document.getElementById('videoElement');
        var flvPlayer = flvjs.createPlayer({
            type: 'flv',
            url: 'ws://101.132.163.124:8000/live/test.flv'
        });
        flvPlayer.attachMediaElement(videoElement);
        flvPlayer.load();
        flvPlayer.play();
    }
</script>

  自己弄个简单的html页面或者套个Dplayer都是可以的,这里就不多BB了。。这样一个私人直播服务器就搭建完成了。。

参考文献:

https://github.com/illuspas/Node-Media-Server/blob/master/README_CN.md

https://lala.im/5879.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/182152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

来源于《高质量C/C++编程》的几道经典面试题

本文介绍几个非常经典的笔试题&#xff0c;原题详细解析&#xff0c;供参考题目1&#xff1a;非法访问内存泄漏题目2&#xff1a;返回栈空间地址问题--非法访问题目3&#xff1a;内存泄漏题目4&#xff1a;非法访问题目1&#xff1a;非法访问内存泄漏 void Getmemory(char* p)…

Apache Doris 系列: 基础篇-使用BitMap函数精准去重(2)

1. 背景 Apache Doris 原有的BitMap函数虽然比较通用&#xff0c; 但在亿级别的BitMap大基数并交计算性能较差&#xff0c;主要是由以下两个原因造成的&#xff1a; 当BitMap的基数过大&#xff0c;大小超过1GB时&#xff0c;网络或者磁盘的处理时间较长BE节点扫描完数据后传…

机器自动翻译古文拼音 - 十大宋词 - 念奴娇 赤壁怀古 苏轼

念奴娇 赤壁怀古 苏轼 大江东去&#xff0c;浪淘尽&#xff0c;千古风流人物。故垒西边&#xff0c;人道是&#xff0c;三国周郎赤壁。乱石穿空&#xff0c;惊涛拍岸&#xff0c;卷起千堆雪。江山如画&#xff0c;一时多少豪杰。 遥想公瑾当年&#xff0c;小乔初嫁了&#xf…

机器自动翻译古文拼音 - 十大宋词 - 扬州慢 淮左名都 姜夔

扬州慢淮左名都 南宋姜夔 淮左名都&#xff0c;竹西佳处&#xff0c;解鞍少驻初程。 过春风十里&#xff0c;尽荠麦青青。 自胡马窥江去后&#xff0c;废池乔木&#xff0c;犹厌言兵。 将黄昏&#xff0c;清角吹寒&#xff0c;都在空城。 杜郎俊赏&#xff0c;算而今重到须惊…

springmvc 整合 thymeleaf 模板引擎

springmvc 整合 thymeleaf 模板引擎 第一步&#xff1a;导入 web.xml 文件 -> <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-ins…

代码随想录算法训练营第31天 二叉树 java :39. 组合总和 40.组合总和II 131.分割回文串

文章目录LeetCode 39. 组合总和本题题解思路LeetCode 40.组合总和II本题题解思路LeetCode 131.分割回文串本题题解思路那么在代码里什么是切割线呢&#xff1f;那么在代码里什么是切割线呢&#xff1f;总结LeetCode 39. 组合总和 本题题解 思路 根据递归三部曲来分析 递归函…

网站如何进行整站优化?

如果要做优化或者选择性优化&#xff0c;一定要区分关键词优化和全站优化&#xff0c;米贸搜整理如下&#xff0c;希望可以帮助到你&#xff1a;一、全站优化的概念:1.一般认为&#xff0c;全站点优化是指通过SEO技术&#xff0c;使其网站成为搜索引擎中的权威站点。当达到效果…

面试汇总-多线程

目录 1、Thread.sleep(0)的作用 2、Synchronized 2.1、特性 2.2、说一说自己对于 synchronized 关键字的了解&#xff1a; 2.3、synchronized关键字的底层原理(JVM如何实现重量级锁) 2.4、Jdk1.6之后对synchronized做的优化 2.4.1、锁粗化 2.4.2、锁消除 2.5、线程池的…

Scala运算符

算术运算符 关系运算符 Java 和 Scala 中关于“”的区别 逻辑运算符 赋值运算符 位运算符 Scala运算符总结 算术运算符 基本与Java一致 对于除号“/”&#xff0c;它的整数除和小数除是有区别的&#xff1a;整数之间做除法时&#xff0c;只保留整 数部分而舍弃小数部分…

JDBC学习笔记(黑马)

目录 一、JDBC快速入门 二、JDBC API详解 &#xff08;一&#xff09;DriverManager &#xff08;二&#xff09;Connection &#xff08;三&#xff09;Statement &#xff08;四&#xff09;ResultSet &#xff08;五&#xff09;PreparedStatement 三、数据库连接池…

前端实现水印的两种方式(DOM和Canvas)

&#x1f431; 个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域新星创作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff1a;vue3从入门…

Python 海象运算符

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人网站&#xff1a;小嗷犬的技术小站 &#x1f34a;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xf…

图纸版本混乱?BOM表管理困难?看SolidWorks PLM如何高效助力产品数据管理

“随着集团的日益壮大&#xff0c;我们越来越重视信息化系统的建设工作&#xff0c;但在研发生产的过程中我们经常会遇到图纸版本混乱、数据查找不便的问题&#xff1b;特别是在产品设计好后&#xff0c;还需要花费很多时间手动整理BOM表&#xff0c;整理期间由于数据量太大&am…

2023年,对人工智能的思考与展望

近些年来&#xff0c;人工智能的话题一次次的冲上热榜&#xff0c;而在前段时间内&#xff0c;chatgpt以及midjourney又一次冲上了热搜&#xff0c;在海内外引起广泛的讨论&#xff0c;我个人在研究了近一个多月的技术文档和文献资料后&#xff0c;也对人工智能的未来有了很多的…

STC32G 单片机通用串行通信接口及其编程

STC32G 系列单片机有4个全双工通用串行通信接口&#xff0c;串口1与串口2既有异步通信功能、又有同步通信功能&#xff0c;串口1与串口2都可进行SPI通信&#xff0c;SPI是一个全双工高速同步串行&#xff1b;通信总线串口3、串口4只有异步通信功能。本文将重点讨论其异步通信&a…

hexo个人博客搭建+butterfly主题配置(雏形版本)

前提&#xff1a; 1. 有一个属于自己的GitHub账号 2. 安装好了git 3. 安装好了node 一、安装hexo 1. 建立一个文件夹 Blog&#xff08;可以自己取名字&#xff09;&#xff0c;进入文件夹标右键打开 Git Bush Here&#xff0c;安装Hexo&#xff1a; npm install -g hexo-…

中智股份冲刺上交所上市:半年收入约87亿元,计划募资37亿元

近日&#xff0c;中智经济技术合作股份有限公司&#xff08;下称“中智股份”&#xff09;预披露招股书&#xff0c;准备在上海证券交易所主板上市&#xff0c;中信证券为其保荐机构。 本次冲刺上市&#xff0c;中智经济计划募资37.42亿元&#xff0c;将用于中智人力资源研发运…

函数的连续性和间断点——“高等数学”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是高等数学中的函数的连续性和间断点&#xff0c;好的&#xff0c;那现在就让我们进入函数的连续性和间断点的世界吧 一、函数的连续性 1.函数增量 2.连续的定义 3.单侧连续 二、例题&#xff08;函数的连续性&#xff09; …

JDK动态代理CGLIB动态代理

代理模式 是通过代理对象访问目标对象&#xff0c;这样可以在目标对象基础上增强额外的功能&#xff0c;如添加权限&#xff0c;访问控制和审计等功能。 房产中介代替业主卖房 静态代理 静态代理中代理类与被代理类都需要实现同一个接口&#xff0c;这就说明我们的一个静态代…

MFC|Toolbox内控件简单介绍

参考&#xff1a; MFC控件工具箱 &#xff08;https://blog.csdn.net/Hubz131/article/details/77684910&#xff09; 对应工具的超链接是本人搜到认为较易理解的单个控件介绍。 Pointer&#xff1a;就是普通的鼠标&#xff0c;默认状态Button&#xff1a;按钮&#xff0c;用…