前言 首先恭喜音MAD活动 MADCORE.wav 圆满落幕!
可惜本次活动我没去现场,哈哈。不过本次活动我主持了 Minecraft 服务器转播活动 MINECORE.jar,游戏录像可以在这里 看到。
接下来我来说一下做转播选择的方案以及踩到的坑。
转播方案一 准备工作 方案一比较复杂,而且实测效果并不好。
转播链路如下:
B站直播源 -> [上海某处公网服务器 Streamlink -> MediaMTX] -> [托管Minecraft的公网服务器 WATERFrAMES模组]
需要准备如下软件:
其中 Streamlink 和 FFmpeg 需要手动添加到系统变量里,这里就不再赘述了。
我让 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 里无法访问推流。
配置 Streamlink 我让 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 框架,哈哈。
需要安装如下内容:
直接弄个屏幕然后输入网址就完事了,虽然所有人访问同一个网址,但是实际内容有差别,最好给每个人发一个激光笔让他们自己调。
缺点 MCEF 初次启动时会下载大量资源,然而在国内没有镜像,导致下载的特别慢。
本质就是在游戏画面内塞一个网页,而且只能让所有人同时看一个网页,网页的具体内容因人而异(因为浏览器在端侧)。
很吃内存。
音量不受游戏控制(需要自己在系统的音量合成器里调整 JCEF 的音量)。
WebDisplays 有概率会在你进入服务器的时候直接崩端,不知道什么毛病,得多次重新进服。
总结 在 MC 里搞转播就是一个坑,没有受虐癖别搞。