使用linux的ffmpeg進行B站直播推流

Arya發表於2022-12-20

很久之前買了個友善的開發板R2S,一直在家吃灰。最近看到網上有用ffmpeg進行直播推流的案例,想把吃灰的的開發板利用起來,於是有了這篇教程。

第一步:安裝ffmpeg
sudo apt update
sudo apt install ffmpeg

第二部分:建立用來存放影片的資料夾

這裡我選擇在/opt下建立video 資料夾,將自己的影片上傳到該資料夾

mkdir /opt/video

第三部分:相關推流的指令碼

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
#=================================================================#
#   System Required: CentOS7 X86_64                               #
#   Description: FFmpeg Stream Media Server                       #
#   Author: LALA                                    #
#   Website: https://www.lala.im                                  #
#=================================================================#

# 顏色選擇
red='\033[0;31m'
green='\033[0;32m'
yellow='\033[0;33m'
font="\033[0m"

ffmpeg_install(){
# 安裝FFMPEG
read -p "你的機器內是否已經安裝過FFmpeg4.x?安裝FFmpeg才能正常推流,是否現在安裝FFmpeg?(yes/no):" Choose
if [ $Choose = "yes" ];then
	yum -y install wget
	wget --no-check-certificate https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.0.3-64bit-static.tar.xz
	tar -xJf ffmpeg-4.0.3-64bit-static.tar.xz
	cd ffmpeg-4.0.3-64bit-static
	mv ffmpeg /usr/bin && mv ffprobe /usr/bin && mv qt-faststart /usr/bin && mv ffmpeg-10bit /usr/bin
fi
if [ $Choose = "no" ]
then
    echo -e "${yellow} 你選擇不安裝FFmpeg,請確定你的機器內已經自行安裝過FFmpeg,否則程式無法正常工作! ${font}"
    sleep 2
fi
	}

stream_start(){
# 定義推流地址和推流碼
read -p "輸入你的推流地址和推流碼(rtmp協議):" rtmp

# 判斷使用者輸入的地址是否合法
if [[ $rtmp =~ "rtmp://" ]];then
	echo -e "${green} 推流地址輸入正確,程式將進行下一步操作. ${font}"
  	sleep 2
	else  
  	echo -e "${red} 你輸入的地址不合法,請重新執行程式並輸入! ${font}"
  	exit 1
fi 

# 定義影片存放目錄
read -p "輸入你的影片存放目錄 (格式僅支援mp4,並且要絕對路徑,例如/opt/video):" folder

# 判斷是否需要新增水印
read -p "是否需要為影片新增水印?水印位置預設在右上方,需要較好CPU支援(yes/no):" watermark
if [ $watermark = "yes" ];then
	read -p "輸入你的水印圖片存放絕對路徑,例如/opt/image/watermark.jpg (格式支援jpg/png/bmp):" image
	echo -e "${yellow} 新增水印完成,程式將開始推流. ${font}"
	# 迴圈
	while true
	do
		cd $folder
		for video in $(ls *.mp4)
		do
		ffmpeg -re -i "$video" -i "$image" -filter_complex overlay=W-w-5:5 -c:v libx264 -c:a aac -b:a 192k -strict -2 -f flv ${rtmp}
		done
	done
fi
if [ $watermark = "no" ]
then
    echo -e "${yellow} 你選擇不新增水印,程式將開始推流. ${font}"
    # 迴圈
	while true
	do
		cd $folder
        video=$(find ./ -type f | shuf -n 1)
        ffmpeg -re -i "$video" -preset ultrafast -vcodec libx264 -g 60 -b:v 6000k -c:a aac -b:a 128k -strict -2 -f flv ${rtmp}
    done
fi
}

# 停止推流
stream_stop(){
	screen -S stream -X quit
	killall ffmpeg
	}

# 開始選單設定
echo -e "${yellow} CentOS7 X86_64 FFmpeg無人值守迴圈推流 For LALA.IM ${font}"
echo -e "${red} 請確定此指令碼目前是在screen視窗內執行的! ${font}"
echo -e "${green} 1.安裝FFmpeg (機器要安裝FFmpeg才能正常推流) ${font}"
echo -e "${green} 2.開始無人值守迴圈推流 ${font}"
echo -e "${green} 3.停止推流 ${font}"
start_menu(){
    read -p "請輸入數字(1-3),選擇你要進行的操作:" num
    case "$num" in
        1)
        ffmpeg_install
        ;;
        2)
        stream_start
        ;;
        3)
        stream_stop
        ;;
        *)
        echo -e "${red} 請輸入正確的數字 (1-3) ${font}"
        ;;
    esac
	}

# 執行開始選單
start_menu

先執行以下命令新建終端

screen -S myVideo

然後執行上面的指令碼,按照提示輸入B站的推流地址(伺服器地址+串流金鑰),影片檔案位置(如/opt/video),即可。然後按ctrl+d或輸入exit退出當前screen。完成以上,/opt/vide資料夾的影片會在你的直播間迴圈播放

其他說明

  • 推流地址可以在以下頁面獲取
    image
  • 要先在B站開播,然後再執行指令碼。

相關文章