本文内容有点过于老旧了,推荐去看这个比较新的:https://www.mfpud.com/topics/10833/

 

VPS使用CentOS 7,搞定YouTube的直播录制,直播转播。

个人使用的CentOS 7,安装BBR,配合ssh以及安装宝塔面板。

使用到的工具,无非也就是youtube-dl,ffmpeg,以及github上找的录制代码之类的。

 

首先准备一台国外的vps,系统选centos 7就可以,安装宝塔面板,但是先别在宝塔面板里安装nginx。

具体教程可以去宝塔面板官网。

使用ssh运行下面这个一键安装bbr代码,安装完成后需要重启。

wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh
chmod +x bbr.sh
./bbr.sh

 

然后就是几个会用到的工具,youtube-dl,python3,ffmepg,screen,等等,以此运行下面的代码

yum install -y epel-release
sudo rpm –import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
yum install -y ffmpeg
wget http://youtube-dl.org/latest/youtube-dl -O /usr/local/bin/youtube-dl
chmod a+x /usr/local/bin/youtube-dl

至此,就已经安装好了youtube-dl 和 ffmpeg。

接下来安装screen,为了能断开ssh后,录制程序依然执行。

yum install screen

安装后新建一个叫做missfeather的会话

screen -S missfeather

读取missfeather会话的命令

screen  -r missfeather

以及查看所有会话,退出会话,清除会话的命令。

screen -ls
screen -d  <session ID 或者 名字>
screen -wipe

总之,新建missfeather的会话后,所有的直播,转播,录制的命名,都在missfeather的这个新会话里完成就可以了。

这里说的会话,是本地使用ssh工具连接的会话,不是宝塔面板里面的那个,不过效果应该一样。

 

先说解析直播的m3u8,以及转播。

这个比较简单,使用youtube-dl解析直播的m3u8地址,然后使用ffmpeg转播就可以。

获取直播的m3u8直播流

youtube-dl -g https://www.youtube.com/channel/UC7QVieoTCNwwW84G0bddXpA/live

得到的就是m3u8的直播流地址

使用ffmpeg把直播流转播到别的平台,比如bilibili的

ffmpeg -i m3u8地址 -c:v copy -c:a aac -b:a 320k -ar 44100 -bufsize 1 -strict -2 -f flv "推流地址"

上面的地址需要修改成自己的,m3u8地址就是刚才提取出来的,推流地址是rtmp密码+直播码,连在一起就可以。

比如这样:

ffmpeg -i https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1616249662/ei/3q5VYLCCEdfbkgarrY3wCg/ip/207.246.105.25/id/-8XZZjd3PY0.1/itag/301/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/sgoap/gir%3Dyes%3Bitag%3D140/sgovp/gir%3Dyes%3Bitag%3D299/hls_chunk_host/r6---sn-a5meknek.googlevideo.com/vprv/1/playlist_type/LIVE/initcwndbps/4970/mh/2P/mm/44/mn/sn-a5meknek/ms/lva/mv/m/mvi/6/pl/23/dover/11/keepalive/yes/fexp/24001373,24007246/mt/1616227701/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,live,sgoap,sgovp,vprv,playlist_type/sig/AOq0QJ8wRgIhAPbG0tL_kJGMTjBOpeJUrW_CB8MgsB-7tpjqhmLZD7vNAiEAqBMH2CKn6wZbgfv1W07DFiodPIeNnXk4y-TThQyiRHc%3D/lsparams/hls_chunk_host,initcwndbps,mh,mm,mn,ms,mv,mvi,pl/lsig/AG3C_xAwRAIgBTAL8r2Gja5TInn8kYDgdK0QxnKTEutzcSzat_eMPlcCIDMZtwft-AM2LZJOELqw-XIYTMXCpye3mzYRGNYp0Rfq/playlist/index.m3u8
 -c:v copy -c:a aac -b:a 320k -ar 44100 -bufsize 1 -strict -2 -f flv "rtmp://live-push.bilivideo.com/live-bvc/?streamname=live_1369556_4527877&key=62633b796d2a1dfb3dhdf7676243ae68&schedule=rtmp"

 

直播录制,或者在本地架设直播服务器,可以试试下面的这两个方式

录制:https://github.com/lovezzzxxx/liverecord

 

本地架设rtmp服务器

需要用到nginx,并且不能用宝塔自带的,需要卸载后使用ssh手动安装。

yum -y install git
sudo yum install -y git make gcc gcc-c++ wget
sudo yum -y install pcre-devel openssl openssl-devel
git clone https://github.com/arut/nginx-rtmp-module /www/server/nginx_plus/nginx-rtmp-module/

回到宝塔面板中,点击左边的文件,按路径找到这个文件

/www/server/panel/install/nginx.sh

右键编辑

搜索

./configure

在后面添加 一行

--add-module=/www/server/nginx_plus/nginx-rtmp-module/

 

修改后保存文件

回到ssh里,运行这个安装命令

sh /www/server/panel/install/nginx.sh install 1.18

或者直接打开宝塔面板的软件商店,找到运行环境,找到nginx,选择编译安装,点添加自定义模块

模块名称:nginx_rtmp_module
描述:nginx rtmp
参数:--add-module=/www/server/nginx_plus/nginx-rtmp-module/

 

安装好之后,就不要切换nginx版本了,不然这个mod就被删了。

可以使用这个看看rtmp的mod有没有安装成功

nginx -V

 

然后去宝塔的左边,网站,添加网站,比如rtmp.seriousos.com

生成的文件路径应该就是 /www/wwwroot/rtmp.seriousos.com

 

点文件,找到以下路径

/www/server/nginx/conf

新建一个空白文件,起名 rtmp.conf

编辑这个文件,添加如下内容,注意改自己的网址。

rtmp_auto_push on;
rtmp {
    server {
        listen 1935;  #监听端口,记得开放
        ping 30s;
        chunk_size 4000;
        notify_method get;

        application hls {
            live on;
            hls on;
            hls_path /www/wwwroot/rtmp.seriousos.com; #视频流暂存地址
            hls_sync 100ms;
            hls_fragment 5s;   #切片大小,越小占用资源越高,但是延时越小,默认5s
        }
        application live {
                        live on;
        }
        # Video on demand
        #application vod {
        #    play /www/tmp/Videos;
        #}
        # Video on demand over HTTP
        #application vod_http {
        #    play http://localhost:8080/vod/;
        #}
    }
}

去软件商店,已安装,nginx,设置,配置修改

events
    {
        use epoll;
        worker_connections 51200;
        multi_accept on;
    }

下面,添加一句

include rtmp.conf;

如图

在这行代码上面,添加一堆代码

access_log /www/wwwlogs/access.log;

需要添加的代码,注意改自己的网址

#----------------rtmp的设置-----------
    #rtmp-http 配置这些配置放在nginx.conf的http{}里面
        #rtmp状态
        location /stat {
            rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
        root /www/server/nginx-rtmp-module; 
        #rtmp- module模块安装地址,这个可以通过http看到状态
        }
        #http支持hls流播放
        location /hls {
        #Serve HLS config
            types {
                application/vnd.apple.mpegurl    m3u8;
                video/mp2t ts;
                     }
        root /www/wwwroot/rtmp.seriousos.com; #与视频流暂存地址相同
        expires -1;
        add_header Cache-Control    no-cache;
        add_header Access-Control-Allow-Origin *;
        }
#----------------rtmp的设置-----------

保存后,重载配置,重启nginx

去宝塔,安全,里面,添加放行端口1935

 

最后就可以用obs去做视频推流了

推流服务器写

rtmp://你的ip地址:1935/hls

密码写个单词就行,比如我这里写test

然后推送一下,看看文件夹内是否已经开始出现缓存内容了。

 

然后就可以把网址分享出去了

ip分享播放地址是

rtmp://你的ip地址:1935/hls/test

 

网址链接就是刚才你设置的网址,以及附带的 密码.m3u8

比如刚才设置的

rtmp.seriousos.com/test.m3u8

 

顺便说一个基于docker的SRS直播服务器搭建,和上面代码有重复

yum install docker
yum install screen
screen -S srs
screen -r srs
docker run -p 1935:1935 -p 1985:1985 -p 8080:8080 ossrs/srs:3

1935端口为直播推流点 1985端口为控制台 8080端口是直链m3u8和flv输出点

国内安装SRS的节点

docker run registry.cn-hangzhou.aliyuncs.com/ossrs/srs:3
systemctl restart docker

剩下的也就是使用ffmpeg推流了

rtmp推流连接:rtmp://ip:1935/live/ livestream为密匙
rtmp拉流:rtmp://ip:1935/live/livestream
m3u8直链提取:http://ip:8080/live/livestream.m3u8
flv直链提取:http://ip:8080/live/livestream.flv

ffmpeg的推流代码,没有压缩的,直接推原画质视频,也可以参考上面提到的那个压缩音质的代码,并且推荐加上缓存 -bufsize 1

ffmpeg -re -i 视频位置 -vcodec copy -acodec copy -f flv -y rtmp://ip:1935/live/livestream

 

顺便说一个,搭建一个简单的播放网页

可以新建个二级域名的单站,然后在网站的文件目录添加一个src的文件夹,下载 flv.js 和 flv.min.js 放到这个文件夹内

下载地址:https://github.com/bilibili/flv.js/releases

新建一个index.html,代码如下

<!DOCTYPE html><html><head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>Live</title>
<style>
    .mainContainer {            display: block;            width: 1024px;            margin-left: auto;            margin-right: auto;
    }        .urlInput {            display: block;            width: 100%;            margin-left: auto;            margin-right: auto;            margin-top: 8px;            margin-bottom: 8px;
    }        .centeredVideo {            display: block;            width: 100%;            height: 576px;            margin-left: auto;            margin-right: auto;            margin-bottom: auto;
    }        .controls {            display: block;            width: 100%;            text-align: left;            margin-left: auto;            margin-right: auto;
    }    </style></head><body>
<div class="mainContainer">
    <video id="videoElement" class="centeredVideo" controls autoplay width="1024" height="576">Your browser is too old which doesn't support HTML5 video.</video>
</div>


<script src="./src/flv.min.js"></script>
<script>
    var player = document.getElementById('videoElement');        if (flvjs.isSupported()) {            var flvPlayer = flvjs.createPlayer({                type: 'flv',                "isLive": true,
            url: 'xxxx',//这里填你的直播源flv格式

        });
        flvPlayer.attachMediaElement(videoElement);
        flvPlayer.load(); 
        flv_start();
    }        function flv_start() {
        player.play();
    }        function flv_pause() {
        player.pause();
    }        function flv_destroy() {
        player.pause();
        player.unload();
        player.detachMediaElement();
        player.destroy();
        player = null;
    }        function flv_seekto() {
        player.currentTime = parseFloat(document.getElementsByName('seekpoint')[0].value);
    }    </script></body></html>

说一下中转的,使用nginx的中转配置

stream {
    server {
        listen xxxx;
        proxy_connect_timeout 5s;
        proxy_timeout 20s;
        proxy_pass ip:port;
    }
}

端口号与你的直播拉流端口对应,如:一台直播服务器ip为9.9.9.9的 flv m3u8端口号为8080 转发到中转机9090端口,那代码为

stream {
        server {
            listen 9090;
            proxy_connect_timeout 5s;
            proxy_timeout 20s;
            proxy_pass 9.9.9.9:8080;
        }
}