banner
oldcatY

oldcatY

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

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

前言#

之前用 dplayer 搭過一個直播轉播的方案 查看這裡,感覺 dplayer 在移動端的播放按鈕點擊後如果加載時間有點長的話,會總認為自己沒有點到播放,因此參考 V 佬的轉播頁面後,換用了 Artplayer。同時,這次我發現可以利用渣浪或 QQ 頻道的直播功能進行 FLV 扒取,這樣就實現了網頁本身只需要隨便一個小雞(甚至空間)就能進行轉播了

以下是正文


搭建環境#

本文使用 Ubuntu 22.04 進行搭建
本文取消了寶塔面板作為 nginx 控制面板,使用完全命令行方式配置【2023/10/22 更新】

正式搭建#

安裝 nginx & ffmpeg & certbot#

apt-get -y install ffmpeg nginx certbot

創建網站目錄#

mkdir -p /var/www/your.site

配置 Nginx#

使用 nginxconfig.io 生成配置#

  1. 打開 Nginxconfig.io ,使用以下配置:

image

image

image

image

  1. 接下來根據網站中 使用配置 部分的說明進行配置。需要注意:

    在我的伺服器這邊測試 certbot 始終無法獲取證書,經查可能是網站暫時無法訪問導致,因此使用 standalone 模式進行申請。申請前需要暫時停止 Nginx 服務,申請成功後再打開。

    sudo systemctl stop nginx
    certbot certonly --standalone -d 你的网站 --email 你的邮箱 -w /var/www/_letsencrypt -n --agree-tos --force-renewal
    sudo systemctl start nginx
    

去除網頁請求的.html 後綴#

/etc/nginx/nginxconfig.io/general.conf 中加入如下重寫字段:

location ^~ / {  
    if (!-e $request_filename){ 
        rewrite ^(.*)$ /$1.html last;
        break;
    }
    try_files $uri $uri/ =404;
}

保存後輸入 sudo nginx -t && sudo systemctl reload nginx 應用配置即可

使用 OBS 等軟體開啟直播#

image
設置如下:

  • 伺服器:rtmp://你的伺服器地址:1935/live/
  • 串流密鑰:隨意設置,但應與HTML代碼中的推流碼一致

使用 ffmpeg 拉流轉推#

大致命令如下:

ffmpeg -i $拉流地址 -c copy -f flv $微博推流地址
apt-get install python3-pip screen  
pip3 install streamlink  

轉推流媒體(以 YouTube 直播為例)#

echo "Please input the youtube url:"  
read URL  
streamlink $URL best -O | ffmpeg -i pipe:0 -c copy -f flv $微博推流地址

轉推 YouTube 非公開 (Unlisted) 直播流【淦】#

這種轉推的前提是你要知道直播流的地址,如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設置較小似乎會報錯(我也不知道為什麼,反正調大就對了)。

戰渣浪#

#!/bin/bash
clear
read -p "Enter the original file address: " URL
echo ""
read -p "Enter Weibo stream link: " LINK
streamlink $URL best -O | ffmpeg -re -i pipe:0 -c copy -f flv $LINK
  • 使用以下代碼在網頁中調用微博直播流
<!DOCTYPE HTML>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>LIVE</title>
    <link rel="icon" type="image/x-icon" href="https://gcore.jsdelivr.net/gh/imbalaomao/picx-images-hosting@master/image.4akbdjz0ewy0.png">
    <script src="https://gcore.jsdelivr.net/npm/hls.js/dist/hls.min.js"></script>
    <script src="https://gcore.jsdelivr.net/npm/artplayer/dist/artplayer.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/flv.js/1.6.2/flv.min.js"></script>
    <style>
        .artplayer-app {
            margin: auto;
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
        }
    </style>
</head>
<body>
    <div class="artplayer-app"></div>
    <script>
        function playFlv(video, url, art) {
            if (flvjs.isSupported()) {
                if (art.flv) art.flv.destroy();
                const flv = flvjs.createPlayer({ type: 'flv', url });
                flv.attachMediaElement(video);
                flv.load();
                art.flv = flv; 
                art.on('destroy', () => flv.destroy());
            } else {
                art.notice.show = 'Unsupported playback format: flv';
            }
        }
        
        var art = new Artplayer({
            container: '.artplayer-app',
            url: '微博直播地址',
            type: 'flv',
            isLive: true,
            customType: {
                flv: playFlv,
            },
        });
        
        art.on('ready', () => {
            console.info(art.flv);
        });
    </script>
</body>
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。