视频直播搭建(个人记录)

Posted eddiead

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视频直播搭建(个人记录)相关的知识,希望对你有一定的参考价值。

简易视频直播 demo 搭建

1.SRS 流媒体服务器搭建

选取 SRS 流媒体服务器的理由
https://gitee.com/ossrs/srs/wikis/v4_CN_Home

1.在 windows 环境下搭建 SRS

由于 SRS 不支持 Windows 环境下直接搭建,所以采取本地搭建 docker 再搭建 SRS 方法。
拉取 SRS 镜像
https://hub.docker.com/r/ossrs/srs/tags?page=1&ordering=last_updated

docker run -p 1935:1935 -p 1985:1985 -p 8080:8080 \\
--name srs-eds1 \\
ossrs/srs:latest

启动 SRS 服务器映射到 docker 端口 8080

访问 docker 地址 8080 端口

2.windows 端口映射

由于 SRS 管理页面 部署在宿主机,宿主机可通过 docker 的 ip 地址加端口访问,但其他机器无法访问,这样就需要把宿主机的端口映射到 docker 的端口,其他机器可通过宿主机 ip 加端口访问 SRS 管理页面。

1.映射 SRS 管理页面端口

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8080 connectaddress=192.168.99.100 connectport=8080

2.映射 rtmp 端口

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=1935 connectaddress=192.168.99.100 connectport=1935
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=1985 connectaddress=192.168.99.100 connectport=1985

至此 SRS 流媒体服务和 windows 端口映射已搭建完毕。

3.尝试直播

1.采用 OBS 推流到 SRS 服务器

2.查看推流情况

3.点击预览查看直播

2.SRS 流媒体进阶版搭建

1.实现文件共享,共享录播文件 (以下为投机取巧方法,以 docker-ToolBox 为例)

文件共享实现的方法。本地<–>虚拟机<–>docker 容器

1.打开 VirtualBox

2.设置共享文档文件夹路径,这个路径为与 docker 容器共享的路径,注意启动镜像

设置成功后重启虚拟机后输入 mount,可以看到我们新加入的共享文件夹。

3.重新运行镜像。
docker run -d --name srsVideo -p 1935:1935 -p 1985:1985 -p 8080:8080 -v /d/srsVideo:/usr/local/srs/objs/nginx/html dce4eca99585

-v 是挂载宿主机的目录 上面我们设置了虚拟机共享目录 d/srsVideo 映射到本地 D:\\srsVideo,因此我们指定挂载到共享目录为 d/srsVideo。因为 srs 服务器的默认录播保存路径默认是 usr/local/srs/objs/nginx/html,所以我们将
usr/local/srs/objs/nginx/html 路径映射到 d/srsVideo。再通过虚拟机的共享目录 d/srsVideo 映射到本地 D:\\srsVideo,实现文件共享功能。dce4eca99585 是镜像 id。

4.检测文件共享是否实现
进入 docker 容器下的 usr/local/srs/objs/nginx/html 目录。

查看本地 D:\\srsVideo 目录

可以看到已经实现了文件共享

当然也可以通过修改配置文件修改录播文件保存的位置。

2.在项目上通过ffmpeg对直播流进行保存并保存为MP4实现录播

本地安装ffmpeg,通过命令去拉取直播rtmp流并转为MP4
ffmpeg -i rtmp://xxxx -c:v copy -c:a copy -bsf:a aac_adtstoasc /xxx/xxx.mp4

rtmp://xxx为rtmp流具体地址
/xxx 为你要保存的路径地址
例如:若为linux /xxx 可为/home/myroot/
若为windows /xxx 可为 D:/srsVideo/
xxx.mp4 为文件名
一下为ffmpeg 方法命令 具体可以自行查阅
-bsf:a 比特流过滤器:音频
aac:advanced audio coding 高级音频编码
aac_adtstoasc 从MPEG-2/4 ADTS标头创建MPEG-4 AudiospecificConfig并删除ADTS标头(adts+es+audioSpecificConfig-adts=mp4)

另外还可以设置在规定时间内判断流是否存在而进行是否停止录播
ffmpeg -rw_timeout 500000 -i rtmp://xxx -c:v copy -c:a copy -bsf:a aac_adtstoasc /home/myroot/Live/srs/replay/eddie.mp4

-rw_timeout 500000:超时5s断流不再拉取rtmp流

温馨提示:为了解决linux和windows环境执行命令不同,执行一次终端命令就要开一个窗口

class PrintErrorReader extends Thread 
        java.io.InputStream __is = null;

        public PrintErrorReader(java.io.InputStream is) 
            __is = is;
        

        @Override
        public void run() 
            try 
                BufferedReader br = new BufferedReader(new InputStreamReader(__is));
                String line = null;
                while ((line = br.readLine()) != null) 
                    log.info(line);
                
             catch (Exception e) 
                e.printStackTrace();
            
        
    

    class PrintInputStream extends Thread 
        java.io.InputStream __is = null;

        public PrintInputStream(java.io.InputStream is) 
            __is = is;
        

        @Override
        public void run() 
            try 
                BufferedReader br = new BufferedReader(new InputStreamReader(__is));
                String line = null;
                while ((line = br.readLine()) != null) 
                    log.info(line);
                
             catch (Exception e) 
                e.printStackTrace();
            
        
    

具体使用如下:

3.直播(设置推流地址后缀,推流密钥)

1.设置推流地址的后缀,如 123456,密钥可以通过后台随机生成

这样设置的好处是:录播会根据推流地址后缀生成文件夹,并且会根据推流密钥生成录播 m3u8 文件。这样方便我们获取录播文件

4.直播延迟优化方法

修改 srs.conf 文件

主要参考:https://github.com/ossrs/srs/wiki/v2_CN_LowLatency#gop-cache

min_latency:最小延迟打开,默认是打开的,该选项打开的时候,mr 默认关闭。因此这里我们选择 min_latency: on;

mr:Merged-Read,针对 RTMP 协议,为了提高性能,SRS 对于上行的 read 使用 merged-read,即 SRS 在读写时一次读取 N 毫秒的数据

mr
enabled off;

mw_latency:
Merged-Write,SRS 永远使用 Merged-Write,即一次发送 N 毫秒的包给客户端。这个算法可以将 RTMP 下行的效率提升 5 倍左右,范围[350-1800]

gop_cache:

gop 是视频流中两个 I 帧的时间距离,gop 有什么影响?Flash(解码器)只有拿到 gop 才能开始解码播放。也就是说,服务器一般先给一个 I 帧给 Flash。可惜问题来了,假设 gop 是 10 秒,也就是每隔 10 秒才有关键帧
编码器调低 gop,譬如 0.5 秒一个 gop,这样延迟也很低,也不用等待。坏处是编码器压缩率会降低,图像质量没有那么好。

服务器提供配置,可以选择前面两个方案之一:SRS 就这么做,有个 gop_cache 配置项,on 就会马上播放,off 就低延迟。
因此为了降低延迟我们选择 gop_cache off;

queue_length:

配置直播队列的长度,服务器会将数据放在直播队列中,如果超过这个长度就清空到最后一个 I 帧。

tcp_nodelay:

(1)tcp_nodelay off,会增加通信的延时,但是会提高带宽利用率。在高延时、数据量大的通信场景中应该会有不错的效果

(2)tcp_nodelay on,会增加小包的数量,但是可以提高响应速度。在及时性高的通信场景中应该会有不错的效果

因此我们这边选择tcp_nodelay:on 提高响应速度直播降低延时。

5.录播时长问题

由于配置文件 hls 默认设置时长为 60 秒,多余的会被丢弃。所以我们可以通过设置 HLS 最大时长来改变录播丢失问题。由官方 wiki 文档可以获取到相关 hls 配置https://gitee.com/winlinvip/srs.oschina/wikis/v3_CN_DeliveryHLS?sort_id=1701917
因此我们修改 srs.conf

hls_window 36000: hls 视频保存最长秒数。默认 60,这里为方便实现录播功能设置为 36000 秒,

hls_cleanup off: 切换 HLS 清理,默认情况下,该功能处于打开状态。 在这种模式下,nginx 缓存管理器进程从 HLS 目录中删除旧的 HLS 片段和播放列表。 这里我们设置 off,不清除旧的 ts 文件。

hls_dispose 0: hls_dispose:HLS 清理的过期时间(秒),系统重启或者超过这个时间时,清理 HLS 的所有文件,包括 m3u8 和 ts。默认为 0,即不清理。
HLS 目录中删除旧的 HLS 片段和播放列表。 这里我们设置 off,不清除旧的 ts 文件。

hls_dispose 0: hls_dispose:HLS 清理的过期时间(秒),系统重启或者超过这个时间时,清理 HLS 的所有文件,包括 m3u8 和 ts。默认为 0,即不清理。

6. 直播平台部署坑点 Linux

1.部署

1.环境编译

1.进入 linux 服务器,选择存放 SRS 文件夹执行

git clone -b 4.0release https://gitee.com/ossrs/srs.git &&
cd srs/trunk && ./configure && make && ./objs/srs -c conf/srs.conf

获取 SRS 相关环境并进行环境编译和运行(Centos7 为例)。
如果报错(Centos8 出现的)

安装环境编译工具 执行命令 yum -y install perl-CPAN

2.SRS 服务器运行

1.可以修改任一 srs 服务器下的 conf 文件,并执行./objs/srs -c conf/xxx.conf 就可以运行自定义的配置下的服务。

2.可以选择后台运行 nohup ./objs/srs -c conf/xxx.conf。

3.端口修改

1.可以自主修改 conf 文件下的端口,注意:如果想要用 webRtc 拉流,需要注意的是:webRtc 的开放端口需要开启 udp 转发。flv,hls 需要开启端口 tcp 转发。

例如:

4.webRtc 相关坑点

1.webRtc 配置文件设置

值得注意的是:candidate 的配置。candidate 默认会配置成网卡地址,如果是自己本地内网搭建需要做端口转发。例如 本地 docker toolBox 部署默认 candidate 地址是 172.17.0.x 需要通过路由转发命令 route add 172.17.0.0 mask 255.255.0.0 192.168.99.100 把 docker 虚拟机经过的数据转发到网卡 172.17.0.x 网段内,实现拉流。

但现在部署到公网,所以我们把 candidate 设置成域名或者服务器公网 ip。也可以在拉流的时候 webrtc://项目部署地址/live/livestream?eip=服务器 ip 地址 具体设置规则可通过。部署地址可以为域名。

具体规则可以查看:https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#config-candidate

本地 vhost 配置

vhost __defaultVhost__ 
gop_cache   off;
mr 
enabled off;

tcp_nodelay on;
rtc 
enabled on;
bframe  discard;
aac transcode;
twccon;

mw_latency  100;
dvr 
enabled  on;
dvr_applyall;
dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].mp4;
dvr_plan session;
time_jitter  full;

http_remux 
enabled on;
mount   [vhost]/[app]/[stream].flv;

play 
mw_latency   0;
mw_msgs  0;

min_latency on;

5.webRtc 拉流格式

1.webrtc 拉流不带端口号 webrtc://SRS 服务器地址(ip 地址或域名)

从0开始搭建个人博客网站

写在前面

本人编程小白一枚,在读学生,一直想搭建一个自己的博客网站,上星期抽出了一点时间,参照羊哥的视频手把手教你从0开始搭建自己的个人博客 |无坑版视频教程| hexo和各路大神的教程,搭建了自己的博客网站https://trace001.gitee.io 在这里分阶段记录一下搭建的整个过程

介绍一下

搭建环境

搭建环境是window10,博客框架使用的是Hexo

Hexo官方介绍

Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。

Hexo博客本地部署

先安装环境

安装node.js

技术图片
作者一开始去官网下载,速度是真的慢,然后就去了这里下载,贼快。在网上看到还可以在淘宝 Node.js 镜像下载
傻瓜式安装即可,一顿操作之后,就可以看到如下页面了
技术图片
可以看到安装了node.js和npm

安装git

技术图片

安装hexo

  • 新建一个文件夹eg:blog打开文件夹在空白处点击鼠标右击,选择git bash here看下刚刚安装的node.js和npm的版本:node –v(node.js的版本) npm –v(包管理器的版本)
    技术图片

  • 安装一个cnpm来提高速度

    npm install -g cnpm --registry=https://registry.npm.taobao.org

    验证是否安装成功:cnpm
    技术图片

    • 安装hexo

      cnpm install -g hexo-cli

      验证是否安装成功:hexo –v
      技术图片

    • 建立项目:hexo init
      技术图片
      新建完成后,指定文件夹的目录如下:
      .
      ├── _config.yml
      ├── package.json
      ├── scaffolds
      ├── source
      |   ├── _drafts
      |   └── _posts
      └── themes
  • _config.yml
    网站的 配置 信息,您可以在此配置大部分的参数。
  • package.json
    应用程序的信息。EJS, Stylus 和 Markdown renderer 已默认安装,您可以自由移除。
    package.json
    {
    "name": "hexo-site",
    "version": "0.0.0",
    "private": true,
    "hexo": {
    "version": ""
    },
    "dependencies": {
    "hexo": "^3.8.0",
    "hexo-generator-archive": "^0.1.5",
    "hexo-generator-category": "^0.1.3",
    "hexo-generator-index": "^0.2.1",
    "hexo-generator-tag": "^0.2.0",
    "hexo-renderer-ejs": "^0.3.1",
    "hexo-renderer-stylus": "^0.3.3",
    "hexo-renderer-marked": "^0.3.2",
    "hexo-server": "^0.3.3"
    }
    }
  • scaffolds
    模版 文件夹。当您新建文章时,Hexo 会根据 scaffold 来建立文件。
    Hexo的模板是指在新建的文章文件中默认填充的内容。例如,如果您修改scaffold/post.md中的Front-matter内容,那么每次新建一篇文章时都会包含这个修改。
  • source
    资源文件夹是存放用户资源的地方。除 posts 文件夹之外,开头命名为 (下划线)的文件 / 文件夹和隐藏的文件将会被忽略。Markdown 和 HTML 文件会被解析并放到 public 文件夹,而其他文件会被拷贝过去。
  • themes
    主题 文件夹。Hexo 会根据主题来生成静态页面。

    几个命令

    1. hexo clean #用来清理缓存
    2. hexo g #生成文件
    3. hexo s #运行本地服务器
    4. hexo d #上传到服务其上
      运行本地服务器:hexo s
      技术图片
      浏览器输入:localhost:4000
      技术图片
      本地环境部署成功

以上是关于视频直播搭建(个人记录)的主要内容,如果未能解决你的问题,请参考以下文章

利用树莓派搭建个人服务器

短视频运营账号主页搭建 ① ( 昵称 | 昵称原则 | 昵称公式 | 昵称禁忌 | 个人简介 | 个人简介公式 )

记录视频

JA17-大型电商分布式系统应用实践+性能优化+分布式应用架构+负载均衡+高并发设计+持久化存储视频教程

使用CSDN云服务搭建一个WordPress 个人站点(视频教程)

使用CSDN云服务搭建一个WordPress 个人站点(视频教程)