环境搭建
本文使用Oracle日本东京提供的AMD免费服务器(Debian 11)进行搭建。
本文使用宝塔面板作为前端搭建方案。
正式搭建
安装环境
安装宝塔
curl -sSO https://raw.githubusercontent.com/8838/btpanel-v7.7.0/main/install/install_panel.sh && bash install_panel.sh#1, 隐藏手机号
sed -i "s|bind_user == 'True'|bind_user == 'XXXX'|" /www/server/panel/BTPanel/static/js/index.js
#2, 删除强制绑定手机js文件
rm -f /www/server/panel/data/bind.pl安装Nginx

注意:安装Nginx时选择“编译安装”并添加自定义模块:
- 模块名称:
 nginx_rtmp_module- 描述:
 nginx_rtmp_module- 参数:
 --add-module=/www/server/nginx/src/nginx-rtmp-module- 预脚本:
 git clone https://github.com/arut/nginx-rtmp-module.git
安装ffmpeg
apt-get -y install ffmpeg修改Nginx配置#

进入 软件商店 - Nginx 1.22.1 - 设置 - 配置修改,在http字段前添加以下内容(记得删除#及后面的内容):
rtmp  {
    server  {
        listen 1935;                             ##这是RTMP协议的默认端口
        chunk_size 4096;                         ##数据块大小
        application live {                       ##项目名为“live”
            live on;                             ##这是一个直播项目
            hls on;                              ##启用HLS录制
            wait_key on;                         ##从关键帧开始视频流
            hls_path /www/wwwroot/site.com/hls;  ##保存HLS录制文件的目录,将/www/wwwroot/site.com/hls修改为你的网站目录
            hls_fragment 5s;                     ##HLS生成的每个ts文件时长
            hls_playlist_length 30s;             ##每个ts文件的保留时间
            hls_continuous on;                   ##从上一个的结尾开始HLS编号
            hls_cleanup on;                      ##自动清理过时的ts文件
            hls_nested on;                       ##为每个HLS流项目创建一个新的子目录
        }
    }
}然后按ctrl+s保存,并在 软件商店 - Nginx 1.22.1 - 设置 - 服务 中点击 重载配置。
创建网站并修改相关设置
创建网页

填写域名及其他相关设置,选择是否启用SSL(海外服务器建议启用SSL并开启Cloudflare云图标)。
修改配置
在access_log字段前添加以下内容:
location /live {
  types {
    application/vnd.apple.mpegurl m3u8;
    video/mp2t ts;
  }
  alias /www/wwwroot/site.com/hls; # 与前面设置的hls目录一致
  add_header Cache-Control no-cache;
}设置Dplayer播放器
将默认的index.html修改为以下内容:
<!DOCTYPE HTML>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>你的直播间名称</title>
    <link rel="icon" type="image/x-icon" href="https://smms.app/image/7vZXEYRjOiW1Ftb">
    <link class="dplayer-css" rel="stylesheet" href="https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.css">
    <script src="https://cdn.jsdelivr.net/npm/hls.js/dist/hls.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.js"></script>
    <style>
        html,body{margin:0px;padding:0px;width:100%;height:100%;}#dplayer{position:absolute;width:100%;height:100%;}
    </style>
</head>
<body>
    <div id="dplayer" class="dplayer dplayer-no-danmaku dplayer-live dplayer-playing dplayer-loading"></div>
    <script>
        const dp = new DPlayer({
            container: document.getElementById('dplayer'),
            live: true,
            danmaku: false,
            autoplay: true,
            video: {
                url: 'hls/streaming_code/index.m3u8',
                type: 'hls'
            }
        });
    </script>
</body>使用OBS或其他软件开始直播
  
设置如下:
- 服务器:
rtmp://你的服务器地址:1935/live/ - 串流密钥:
按需设置,但需与HTML代码中的流代码一致 
使用ffmpeg拉流推流
通用命令如下:
ffmpeg -i 流地址 -c:v copy -c:a aac -b:a 192k -strict -2 -f flv rtmp://127.0.0.1:1935/live/流代码如需后台运行:
nohup ffmpeg -i 流地址 -c:v copy -c:a aac -b:a 192k -strict -2 -f flv rtmp://127.0.0.1:1935/live/流代码 &使用Streamlink拉流推流
安装Streamlink和Screen
apt-get install python3-pip screen
pip3 install streamlink推送媒体流(以YouTube直播为例)
echo "请输入YouTube网址:"
read URL
streamlink $URL best -O | ffmpeg -re -i pipe:0 -c copy -bsf:a aac_adtstoasc -f flv rtmp://localhost:1935/live/youtube推送YouTube非公开直播流
这东西真的难倒我了。看来推送公开直播流确实简单,但Streamlink由于保护机制无法推送非公开直播流,因此使用了一个变通方法。
此推送的前提是需要知道流地址,例如https://youtu.be/abcdefg
安装Screen
我只知道用screen来后台运行...我是新手...
下载并部署yt-dlp
wget -O /usr/local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp使用Screen后台运行
screen -S live推送YouTube非公开直播流
这东西真的难倒我了...
clear
echo "请输入YouTube网址:"
read URL
ffmpeg -re -i $(yt-dlp -f best -g $URL) -c copy -bsf:a aac_adtstoasc -f flv -buffer_size 256M rtmp://localhost/live/youtube这里通过yt-dlp将YouTube直播流链接解析为m3u8链接并传递给ffmpeg读取。设置buffer_size过小似乎会报错(不知道为什么,调大就好了)。
致谢
感谢yt-dlp、Streamlink和ffmpeg的作者。没有他们,本教程就不会存在。