banner
oldcatY

oldcatY

中轻度LoveLive厨,主推莲团,二推水+虹团(缪团是神,星团……)
twitter
github
bilibili
steam

【技巧】利用ffmpeg/Streamlink+Dplayer做拉流中转

搭建环境#

本文使用甲骨文日本东京的 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#

image

需要注意:安装 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 配置#

image

进入 软件商店——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——设置——服务 点击 重载配置

创建网站并修改相关设置#

创建网页#

image

填写域名等相关设置,可选择是否开启 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/推流码/index.m3u8',
                type: 'hls'
            }
        });
    </script>
</body>

使用 OBS 等软件开启直播#

image
设置如下:

  • 服务器: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/推流码 &
apt-get install python3-pip screen
pip3 install streamlink

转推流媒体(以 YouTube 直播为例)#

echo "Please input the youtube url:"
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 非公开 (Unlisted) 直播流【淦】#

这个玩意真的折腾死我了,公开直播的转推似乎真的非常简单,而 Unlisted 直播由于受到保护,Streamlink 无法转推,因此进行了一波取巧操作。

这种转推的前提是你要知道直播流的地址,如https://youtu.be/abcdefg

安装 Screen#

apt -y install 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 youtube

转推 YouTube 非公开直播#

为了这个东西折腾死我了……

clear
echo "Please input the YouTube url:"
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 作者,没有他们就没有此篇教程。

参考链接#

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。