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 作者,沒有他們就沒有此篇教程。

參考鏈接#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。