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

技巧, 教程  ·  2023-05-01

环境搭建

本文使用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

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/streaming_code/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/流代码 &

使用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的作者。没有他们,本教程就不会存在。

参考链接

 
评论
猫の博客. All Rights Reserved. Theme Jasmine by Kent Liao.
当前博客已在风雨中运行了:
渝ICP备2024020975号 | 渝公网安备50010802006020号 | 萌ICP备20240422号
AniLive放映室 | AniLive资料库