之前介绍过,使用CentOS加上youtube-dl,获取到youtube直播的m3u8,再使用ffmpeg推流到其它地方的教程,不过经过这一年半的时间后,之前的m3u8方案已经不太好用了,所以就有了个今天这个比较新的方案。
大概过程,使用streamlink获取youtube live的直播流并转发到本地端口,然后使用ffmpeg工具转播到其它地方。
这次不单单会写转播教程,还会顺便把搭建本地nginx rtmp的过程也写上,还会顺便写一些其它的东西,比如自动录播功能等等,所以就直接收藏本文吧。
为了照顾新手,会安装宝塔面板,或者aaPanel,系统选择Debian,因为可以直接安装ffmpeg,CentOS的第三方的ffmpeg版本挺老的,新版的还得自己编译,怪麻烦的,所以直接用Debian省了不少事。
VPS当然得是需要国外的VPS,这个就不多说了。
安装 curl
apt-get update -y && apt-get install curl -y
安装宝塔面板
curl -sSO http://download.bt.cn/install/install_panel.sh && bash install_panel.sh
或者安装aaPanel面板
wget -O install.sh http://www.aapanel.com/script/install-ubuntu_6.0_en.sh && bash install.sh aapanel
安装后记好登陆的地址,以及账号和密码
开启bbr
echo net.core.default_qdisc=fq >> /etc/sysctl.conf
echo net.ipv4.tcp_congestion_control=bbr >> /etc/sysctl.conf
sysctl -p
sysctl net.ipv4.tcp_available_congestion_control
安装sudo
apt-get install sudo
安装aria2
apt-get install aria2 -y
安装pip和pip3
apt-get install python-pip -y
sudo apt install -y python3-pip -y
后续更新pip3
python3 -m pip install --upgrade pip
安装you get
pip3 install you-get
安装youtube-dl,streamlink,screen,yt-dlp.youtube-dlc,ffmpeg等等
pip3 install youtube-dl
pip3 install --upgrade youtube-dl
pip3 install --upgrade yt-dlp
pip3 install --upgrade streamlink
sudo apt install ffmpeg -y
sudo apt install screen -y
pip3 install --upgrade youtube-dlc
更新一下系统
sudo apt update -y && sudo apt upgrade -y
接下来登录你的宝塔面板,或者sspanel面板,一样,以下简称宝塔面板
登陆后不要一键安装环境,手动去商店中安装php以及nginx工具
下载nginx-rtmp-module,先在终端运行
cd /www/server/
git clone https://github.com/arut/nginx-rtmp-module.git
Nginx安装
软件商店 > 应用搜索:nginx > 安装 > 编译安装 > 添加自定义模块
模块名称:nginx_rtmp_module
描述: nginx rtmp
参数:--add-module=/www/server/nginx-rtmp-module
如上图,点编译安装,添加个自定义模块,最后安装前,别忘了勾选。
新建目录:/www/server/nginx/conf/rtmp, 在目录下新建两个文件:
nginx-rtmp.conf 和 nginx-rtmp-play.conf
注意改成你的网址
# nginx-rtmp.conf
rtmp {
server {
listen 1935;
ping 30s;
chunk_size 4000;
notify_method get;
application live { # 推流地址rtmp://ip:1935/live/密钥,同拉流播放地址
live on;
record off; # 是否开启记录 off, all,用于录制直播视频以便回放重播
#record_unique on; # 记录值唯一
#record_max_size 200M; # 记录文件大小
#record_path "/www/wwwroot/live.hercd.com/video"; # 记录文件位置
#record_suffix -%Y-%m-%d-%H_%M_%S.flv; # 记录文件命名
#on_publish http://127.0.0.1:8686/auth; # 开始推流的回调地址
#on_done 'http://when live stop call this url'; # 结束推流的回调地址
#on_play http://127.0.0.1:8686/auth; # 开始播放的回调地址
}
application hls { # 推流地址rtmp://ip:1935/hls/密钥,开启HLS协议进行m3u8直播
live on;
hls on; # 开启hls, hls的推流会产生一个m3u8的ts视频文件索引,同时保存一个个视频片段缓存,可以拿到再次播放。
hls_path /www/wwwroot/live.hercd.com/hls; # 视频切片ts文件存放的位置
hls_sync 100ms;
hls_fragment 5s; # 视频切片的大小,ts文件大小
hls_cleanup on; #对多余的切片进行删除
hls_playlist_length 60s; #保存m3u8列表长度时间,默认是30秒
}
#application vod { # 用于视频点播flv/mp4
# play /www/wwwroot/live.hercd.com/videos; # 本地视频MP4文件存放地址,作为流播放视频: rtmp://ip:1935/vod/视频名称.mp4
#}
#application vod_http { # 播放远程http链接的视频,rtmp://ip:1935/vod_http/视频名称.mp4
# play http://localhost:8080/vod/;
#}
}
}
# nginx-rtmp-play.conf
server {
listen 1000;
location /stat { # http://ip:1000/stat, 监控流的地址
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /www/server/nginx-rtmp-module/;
}
location /hls { # http拉流的地址,http://ip:1000/hls/密钥.m3u8
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /www/wwwroot/live.hercd.com/tmp;
expires -1;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
}
以下示例用 live.hercd.com
新建目录: /www/live.hercd.com/hls 用于存放hls视频文件
编辑nginx.conf
引入配置: include /www/server/nginx/conf/rtmp/nginx-rtmp.conf;
引入配置:include /www/server/nginx/conf/rtmp/nginx-rtmp-play.conf;
重启Nginx,并去安全,放行1000和1935端口
好了,到这里,已经可以用obs给你的服务器推流了,看上面 nginx-rtmp.conf 代码,默认开启了live和hls推流,vod的没开,简单说一下,live是flv格式的,hls是m3u8的,vod是flv或者mp4的。
比如用hls和live的演示,还是用 live.hercd.com ,推流地址分别是
rtmp://live.hercd.com:1935/hls
rtmp://live.hercd.com:1935/live
推流密码写个单词就行,比如test
其实这个时候,去你的网址目录看,就可以看到hls文件夹或者live文件夹内,已经有m3u8以及ts文件,或者flv的文件,已经可以直接用http调用这些文件
live推流的拉流地址 rtmp://live.hercd.com:1935/live/test
hls拉流地址 https://live.hercd.com/hls/test.m3u8
还可以在live.hercd.com中,新建个index.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>HTML5 直播</title>
<link href="https://vjs.zencdn.net/7.0.3/video-js.css" rel="stylesheet">
<script src="https://vjs.zencdn.net/7.0.3/video.js"></script>
<script src="https://cdn.jsdelivr.net/npm/videojs-flash@2/dist/videojs-flash.min.js"></script>
</head>
<body style="margin: auto; width: 1080px;">
<!-- RTMP直播拉流地址 -->
<video id="rtmp-live" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto" width="1080" height="608" data-setup='{}'>
<source src="rtmp://live.hercd.com:1935/live/test" type="rtmp/flv">
</video>
<hr />
<!-- HTTP直播hls拉流地址 -->
<video id="hls-live" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto" width="1080"height="608" data-setup='{}'>
<source src="https://live.hercd.com/hls/test.m3u8" type="application/x-mpegURL">
</video>
</body>
</html>
先说一下使用 screen工具新建终端窗口,因为screen的终端窗口可以后台运行
创建一个新窗口命令
screen -S test
查看所有后台窗口命令
screen -ls
重新打开命令
screen -r test
关掉这个后台窗口命令,注意下面的8471数字会不一样
screen -X -S 8471.test quit
接下来说使用 Streamlink 搭配 ffmpeg 转推了
新建一个新的screen终端窗口,运行
streamlink --player-external-http --player-external-http-port 8080 --retry-open 30 --hls-segment-timeout 600 --hls-timeout 900 --http-stream-timeout 900 --ringbuffer-size 4M https://www.youtube.com/channel/UC7QVieoTCNwwW84G0bddXpA/live best
如果看到正常运行后,最下面会有个网址,应该是 http://127.0.0.1:8080
这个就是把上面youtube的直播转发到本地的8080端口了,外界访问则是 你的ip加上8080端口,当然别忘了防火墙打开端口。
这个时候可以去别的vps上,使用ffmpeg转推刚刚生成8080端口的流媒体,也可以本地新建个终端窗口,本地转推到别的地方,命令如下
ffmpeg -re -i http://127.0.0.1:8080/ -rw_timeout 30000000 -vcodec copy -acodec copy -f flv -bsf:a aac_adtstoasc -y rtmp://live.hercd.com:1935/hls/test
顺便介绍一个 使用ffmpeg 循环推流mp4文件的命令
ffmpeg -re -stream_loop -1 -i url.mp4 -vcodec copy -acodec copy -f flv -y rtmp://live.hercd.com:1935/hls/test
ffmpeg推流多个mp4文件的方法
ffmpeg -re -stream_loop -1 -f concat -safe 0 -i list.txt -rw_timeout 30000000 -codec copy -f flv -bsf:a aac_adtstoasc -y rtmp://youip/youpassword
注意这个list文件,以及list.txt的文件内容,大概如下就行
file '1.mp4'
file '2.mp4'
file '3.mp4'
还要借助.sh脚本做循环,比如起名 push.sh
#!/bin/bash
while true
do
ffmpeg -re -f concat -safe 0 -i list.txt -vcodec copy -acodec copy -f flv "rtmp://rtmp地址/你的直播码"
done
最后执行 sh push.sh
如果你想无缝推流的话,可以使用 mkfifo 的管道,然后把所有视频文件连起来使用ts推流
mkfifo push
#!/bin/bash
while true
do
ffmpeg -re -f concat -safe 0 -i list.txt -f mpegts -vcodec copy -acodec aac -vbsf h264_mp4toannexb pipe:1.ts | cat - >> push
done
ffmpeg -re -i push -c:v copy -c:a aac -f flv "rtmp://rtmp地址/你的直播码"
接下来顺便介绍下使用yt-dlc下载youtube视频的命令
yt-dlp --format "bestvideo[ext=mp4]+bestaudio[ext=m4a]/bestvideo+bestaudio/best" --merge-output-format mp4 https://www.youtube.com/watch?v=_X31LkqbO3Q
剩下的是使用 Screen + Streamlink + ffmpeg 在加上一些脚本自动检测twitch开播并自动录制,以及youtube开播并自动录制的脚本和命令
去/www/wwwroot/的文件夹中,新建一个文件夹,起个英文名字,比如 youtube 或者 twitch
在twitch文件夹中,新建个文件,名字是 record_twitch.sh
内容如下
#!/bin/bash
# Twitch Live Stream Recorder
if [[ ! -n "$1" ]]; then
echo "usage: $0 twitch_id [format] [loop|once] [interval]"
exit 1
fi
# Record the highest quality available by default
FORMAT="${2:-best}"
INTERVAL="${4:-10}"
while true; do
# Monitor live streams of specific channel
while true; do
LOG_PREFIX=$(date +"[%Y-%m-%d %H:%M:%S]")
echo "$LOG_PREFIX Try to get current live stream of twitch.tv/$1"
# Get the m3u8 address with streamlink
M3U8_URL=$(streamlink --stream-url "twitch.tv/$1" "$FORMAT")
(echo "$M3U8_URL" | grep -q ".m3u8") && break
echo "$LOG_PREFIX The stream is not available now."
echo "$LOG_PREFIX Retry after $INTERVAL seconds..."
sleep $INTERVAL
done
# Record using MPEG-2 TS format to avoid broken file caused by interruption
FNAME="twitch_${1}_$(date +"%Y%m%d_%H%M%S").ts"
echo "$LOG_PREFIX Start recording, stream saved to \"$FNAME\"."
# Start recording
#streamlink -o "$FNAME" twitch.tv/$1 best
streamlink -o "$FNAME" --twitch-disable-ads twitch.tv/$1 best
# ffmpeg -i "$M3U8_URL" -codec copy -f mpegts "$FNAME" > "$FNAME.log" 2>&1
# Exit if we just need to record current stream
LOG_PREFIX=$(date +"[%Y-%m-%d %H:%M:%S]")
echo "$LOG_PREFIX Live stream recording stopped."
[[ "$3" == "once" ]] && break
done
依然是使用screen工具,新建个窗口,执行
cd /www/wwwroot/twitch
./record_twitch.sh thebs_chen best loop
thebs_chen 是twitch主播的id,可以换,best是指录制最好的画质,loop是循环执行,直播开始后就录制,直播完成后就继续执行检测命令,等待下次开播。
运行这个命令后,会每隔10秒检测一下twitch的频道,主播开播后会自动录制。
接下来是youtube的开播录制,youtube的开播录制比较麻烦,需要用到cookies,还需要转换成脚本用到的格式
还是在wwwroot的文件夹内新建一个文件夹,比如就叫youtube
点这里,下载这个包:https://github.com/lovezzzxxx/liverecord/archive/refs/heads/master.zip
解压,把 record_twitcast.py 、record_new.sh 、record.sh 这三个文件上传到youtube的文件夹
在youtube的文件夹内手动新建两个txt文件,分别命名为 you-cookies.txt 和 you-config.txt
用谷歌浏览器打开youtube,并登陆你的账号
按F12,打开开发人员的前端工具
按F5,刷新一下youtube的网站
在右边找到 Network
接下来就比较困难了,需要找到包含 SID 的cookies文件,不知道文件名会不会变
比如我写教程的这里,名字是这个开头,cookies的文本在这里
如图,找到cookies的文本后,把上图红框内的文本复制出来。
打开 http://tools.bugscaner.com/cookietocookiejar/
作用域写
.youtube.com
下面把刚才复制过来的文本粘贴过去,转化一下
把上图中下面转化好的文本,复制粘贴到 you-cookies.txt 里面保存
打开 you-config.txt
http-cookie=SID=这里是文本
http-cookie=HSID=这里是文本
http-cookie=SSID=这里是文本
http-cookie=APISID=这里是文本
http-cookie=SAPISID=这里是文本
把 you-cookies.txt 里面的cookies文本手动一条条的复制到 you-config.txt 中,文本格式是上面的代码
完成后如图
youtube文件夹内的最终文件
然后依然是新建个screen窗口,然后依次执行
cd /www/wwwroot/youtube
./record_new.sh youtubeffmpeg "UC7QVieoTCNwwW84G0bddXpA" --you-cookies "./you-cookies.txt" --you-config "./you-config.txt" -f 1080p,720p,480p,360p,worst -l 30 -o "/www/wwwroot/youtube"
大概意思是 使用 record_new.sh 文件命令执行,检测 UC7QVieoTCNwwW84G0bddXpA 这个Youtube博主的个人地址,这里可以换成你想自动录制的博主id
--you-cookies "./you-cookies.txt" --you-config "./you-config.txt" 是调用cookies,这个不用管
-f 1080p,720p,480p,360p,worst 这个是录制视频的画质选择,默认从高到低,哪个最好用哪个
-l 30 -o "/www/wwwroot/youtube"
-l 是命令循环运行,等博主开播了就自动录视频,录完了就继续检测等待下次开播。
30 是指每30秒检测一次,建议就用30就行了,太快了不知道会不会被Youtube ban掉。
-o "/www/wwwroot/youtube" 这个就是录制的视频文件保存的位置了。
下载youtube视频的命令,单线程下载
yt-dlp --format "bestvideo[ext=mp4]+bestaudio[ext=m4a]/bestvideo+bestaudio/best" --merge-output-format mp4 https://www.youtube.com/watch?v=eBIBa228c8k
下载youtube视频的命令,使用aria2多线程下载
yt-dlp --format "bestvideo[ext=mp4]+bestaudio[ext=m4a]/bestvideo+bestaudio/best" --merge-output-format mp4 https://www.youtube.com/watch?v=Iajwh9a1NA0 --external-downloader aria2c --external-downloader-args "-x 16 -k 1M"
默认是ts格式,转换mp4代码
ffmpeg -i youtube.ts -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4