项目:在Minecraft里观看哔哩哔哩直播

前言

首先恭喜音MAD活动 MADCORE.wav 圆满落幕!

可惜本次活动我没去现场,哈哈。不过本次活动我主持了 Minecraft 服务器转播活动 MINECORE.jar,游戏录像可以在这里看到。

接下来我来说一下做转播选择的方案以及踩到的坑。

转播方案一

准备工作

方案一比较复杂,而且实测效果并不好。

转播链路如下:

B站直播源 -> [上海某处公网服务器 Streamlink -> MediaMTX] -> [托管Minecraft的公网服务器 WATERFrAMES模组]

需要准备如下软件:

其中 Streamlink 和 FFmpeg 需要手动添加到系统变量里,这里就不再赘述了。

配置 MediaMTX

我让 GPT 5.6 给我写了配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# \mediamtx\mediamtx.yml

###############################################
# 日志
###############################################

logLevel: info
logDestinations: [stdout, file]
logFile: "C:/LiveRelay/logs/mediamtx.log"

###############################################
# RTSP输入,仅允许本机FFmpeg连接
###############################################

rtsp: true
rtspTransports: [tcp]
rtspEncryption: "no"
rtspAddress: 127.0.0.1:8554

###############################################
# 关闭不需要的协议
###############################################

rtmp: false
webrtc: false
srt: false
moq: false

###############################################
# HLS输出
###############################################

hls: true
hlsAddress: :8888
hlsEncryption: false
hlsAllowOrigins: ["*"]

# 即使暂时没有客户端,也持续生成HLS,
# 玩家进入时不需要等待第一批分片
hlsAlwaysRemux: true

# MPEG-TS兼容性最好,适合LibVLC/WATERMeDIA
hlsVariant: mpegts

hlsSegmentCount: 6
hlsSegmentDuration: 1s
hlsSegmentMaxSize: 50M
hlsDirectory: ""

###############################################
# 直播路径
###############################################

paths:
bilibili:
source: publisher
maxReaders: 15

然后在终端里输入 mediamtx.exe mediamtx.yml 即可启动。

需要注意:记得设置出站规则 协议 TCP 端口 8888,否则在 MC 里无法访问推流。

我让 GPT 5.6 给我写了中继脚本,AI 太好用了你知道吗。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# \scripts\relay-bilibili.cmd
@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "ROOM=https://live.bilibili.com/5055636"
set "STREAMLINK=C:\Program Files\Streamlink\bin\streamlink.exe"
set "FFMPEG=D:\Miro-Work\madcore-liverelay\ffmpeg\bin\ffmpeg.exe"
set "TARGET=rtsp://127.0.0.1:8554/bilibili"

if not exist "%STREAMLINK%" (
echo [ERROR] Streamlink not found:
echo %STREAMLINK%
pause
exit /b 1
)

if not exist "%FFMPEG%" (
echo [ERROR] FFmpeg not found:
echo %FFMPEG%
pause
exit /b 1
)

:RESTART

echo.
echo ==================================================
echo [%date% %time%] Starting Bilibili relay
echo Room: %ROOM%
echo Target: %TARGET%
echo ==================================================
echo.

"%STREAMLINK%" ^
--no-config ^
--loglevel info ^
--retry-streams 5 ^
--retry-max 0 ^
--retry-open 5 ^
--ringbuffer-size 64M ^
--stream-timeout 60 ^
--stream-segment-attempts 5 ^
--stream-segment-threads 2 ^
--hls-live-edge 3 ^
--player "%FFMPEG%" ^
--player-verbose ^
--player-args "-hide_banner -loglevel info -fflags +genpts+discardcorrupt -i {playerinput} -map 0:v:0 -map 0:a:0? -vf fps=30,format=yuv420p -c:v libx264 -preset veryfast -tune zerolatency -profile:v high -level:v 4.1 -b:v 4500k -maxrate 5000k -bufsize 10000k -g 60 -keyint_min 60 -sc_threshold 0 -bf 0 -refs 1 -fps_mode:v cfr -c:a aac -b:a 160k -ar 48000 -ac 2 -f rtsp -rtsp_transport tcp -muxdelay 0.1 %TARGET%" ^
"%ROOM%" hls

set "EXITCODE=%ERRORLEVEL%"

echo.
echo [%date% %time%] Relay stopped. Exit code: %EXITCODE%
echo Restarting in 5 seconds...
timeout /t 5 /nobreak >nul
goto RESTART

直接双击打开就行,别用 PowerShell 打开。

测试

本机内可以在浏览器内输入网址 http://127.0.0.1:8888/bilibili/index.m3u8 测试推流是否正常。

缺点

实际跑起来画面很卡,可能有优化空间但是感觉不如接下来这个方案。

还有输入网址的时候有概率崩端,保险做法是直接把网址粘贴进去。

转播方案二

直接在大家的电脑里塞一个 CEF 框架,哈哈。

需要安装如下内容:

  • 模组 WebDisplays 客户端与服务端均需安装
  • 模组 MCEF 仅客户端安装

直接弄个屏幕然后输入网址就完事了,虽然所有人访问同一个网址,但是实际内容有差别,最好给每个人发一个激光笔让他们自己调。

缺点

MCEF 初次启动时会下载大量资源,然而在国内没有镜像,导致下载的特别慢。

本质就是在游戏画面内塞一个网页,而且只能让所有人同时看一个网页,网页的具体内容因人而异(因为浏览器在端侧)。

很吃内存。

音量不受游戏控制(需要自己在系统的音量合成器里调整 JCEF 的音量)。

WebDisplays 有概率会在你进入服务器的时候直接崩端,不知道什么毛病,得多次重新进服。

总结

在 MC 里搞转播就是一个坑,没有受虐癖别搞。