本文内容有点过于老旧了,推荐去看这个比较新的: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;
}
}