-
v0.4.10 — fix 5fps video (preallocate decoder buffer)
StableSome checks failedbuild / build (push) Has been cancelledreleased this
2026-05-15 22:55:04 +09:00 | 32 commits to main since this releasev0.4.10 — 영상이 5fps로 보이던 문제 수정
무엇이 문제였나
- 0.4.9 에서 디코더 쓰레드가 매 프레임마다
ByteBuffer.allocateDirect(w*h*4)를 새로 잡았습니다. - 1080p × 24fps = 초당 192MB direct memory 할당. 매번 페이지 zero-fill + 이전 버퍼 Cleaner 큐 처리.
- 디코더가 메모리 처리에 시간을 다 써서 grab() 이 실시간 페이스를 따라가지 못함 → 단일 슬롯 latest 가 버스트로 채워지고 렌더 쓰레드는 ~5fps 로만 샘플링.
- 게임 전체는 부드러운데 영상만 끊기는 증상이 그 때문이었습니다.
무엇이 바뀌었나
- 디코더 측에 RGBA staging 버퍼를 backend 인스턴스당 단 한 번 preallocate.
- 짧은 lock 안에서 디코더가 staging 으로 memcpy, 렌더 쓰레드가 같은 lock 안에서 staging → GPU 텍스처 포인터로 memcpy.
VideoBackend.pollFrame() → ByteBuffer를consumeFrame(long dstAddr, long maxBytes) → boolean로 교체. 버퍼 소유권 race 없음, 할당 없음.- 0.4.9 의 RGBA pixel format / TextureManager.release 수정은 그대로 유지.
받기
- Windows 64bit:
video_player-windows-x86_64-0.4.10.jar - macOS Intel:
video_player-macosx-x86_64-0.4.10.jar - macOS Apple Silicon:
video_player-macosx-arm64-0.4.10.jar - Linux 64bit:
video_player-linux-x86_64-0.4.10.jar - 바닐라(JavaCV 별도 설치용):
video_player-0.4.10.jar
Downloads
- 0.4.9 에서 디코더 쓰레드가 매 프레임마다
-
v0.4.9 — real stutter fix + delete-crash defense
StableSome checks failedbuild / build (push) Has been cancelledreleased this
2026-05-15 22:32:32 +09:00 | 33 commits to main since this release0.4.7/0.4.8 의 끊김 근본 원인 수정 + 삭제 시 잠재적 텍스처 release 누락 방어 패치.
끊김 (root cause):
- 0.4.7 에서 GPU 텍스처 업로드는 memcpy 로 바꿨는데, 디코드 쪽 toRgba() 가 여전히 BufferedImage.getRGB() + 픽셀별 ARGB→RGBA 루프(1080p 기준 200만회)를 돌고 있었습니다. 한 프레임당 20-50ms.
- 이게 실시간 24fps(~42ms/프레임) 보다 느려지면 오디오 버퍼가 비고 → 백프레셔 사라짐 → 디코더가 풀스피드로 catch-up 프레임을 1슬롯 AtomicReference 에 덮어쓰기(0.5초 버퍼 분량의 12프레임 중 11개 드롭) → 다시 오디오 버퍼 차면 ~0.5초 블록. 사용자 분이 말씀하신 '한번 로딩, 다음 로딩 전까지 끊김' 패턴과 정확히 일치.
- v0.4.9 에서는 FFmpegFrameGrabber.setPixelFormat(AV_PIX_FMT_RGBA=26) 으로 swscale 한테 RGBA 변환을 강제. frame.image[0] 이 바로 ByteBuffer (RGBA 바이트) 라서 fresh direct buffer 로 copy 만 하면 끝. 컬러스페이스 변환은 swscale 의 네이티브 SIMD 에서 <1ms 에 끝나므로 디코더가 안정적으로 real-time 페이스 유지.
- BufferedImage / Java2DFrameConverter 코드 경로 전부 제거.
삭제 시 크래시 방어:
- Entry.close() 가 texture.close() 만 부르고 TextureManager 등록은 안 풀어줬습니다. RenderType 이 Identifier 기준으로 캐싱되므로, 삭제 직후 캐시된 RenderType 이 죽은 GL 핸들을 bind 시키면 렌더 쓰레드 크래시 가능.
- mc.getTextureManager().release(id) 를 close 시 호출하도록 추가.
- 사용자 분이 보고하신 크래시 (crash-reports/ 폴더가 없다고 하셔서 정확한 트레이스는 아직 못 봤지만) 의 가장 유력한 후보. latest.log 의 끝부분(200줄) 받으면 확정 가능.
업그레이드: video_player--0.4.9.jar 하나만 mods 폴더에 (0.4.8 jar 는 삭제). JavaCV 별도 설치는 0.4.8 부터 불필요한 것 그대로 유지.
Downloads
-
v0.4.8 — JavaCV bundled (no separate install)
StableSome checks failedbuild / build (push) Has been cancelledreleased this
2026-05-15 22:15:34 +09:00 | 34 commits to main since this releaseJavaCV 별도 설치 없이 jar 하나만 받으면 됩니다.
이번 버전에서 모드 jar 안에 JavaCV 1.5.13 + FFmpeg 8.0.1 네이티브 까지 모두 포함시켰습니다 (Fabric loom 의 jarJar 로 nested jar 형태로 번들 — Fabric loader 가 런타임에 풀어서 classpath 에 추가). 이전에 필요했던 .minecraft/libraries/javacv/ 폴더 + 5개 jar 복사 + -Xbootclasspath/a:... JVM 인수 가 전부 사라집니다.
자신의 OS·CPU 에 맞는 jar 하나만 mods 폴더에 넣으세요:
- Windows 64bit: video_player-windows-x86_64-0.4.8.jar (~32MB)
- macOS Intel: video_player-macosx-x86_64-0.4.8.jar (~24MB)
- macOS Apple Silicon (M1/M2/M3/M4): video_player-macosx-arm64-0.4.8.jar (~21MB)
- Linux 64bit: video_player-linux-x86_64-0.4.8.jar (~27MB)
업그레이드 주의:
- 0.4.7 이하에서 쓰던 -Xbootclasspath/a:...javacv... JVM 인수가 있다면 반드시 제거하세요. 부트클래스패스의 JavaCV 와 jar 안의 JavaCV 가 충돌해 검은 화면이 날 수 있습니다.
- 이전 video_player-0.4.x.jar 는 mods 폴더에서 삭제. 두 개를 같이 두면 켜지지 않습니다.
서버용 (헤드리스, JavaCV 디코더 안 씀):
- video_player-0.4.8.jar (~85KB, 클라이언트 jar 와 다름) 가 필요하면 소스에서 -Pplatform 없이 ./gradlew build 로 직접 빌드하세요. README 의 "개발자용 빌드" 섹션 참고.
Fabric API 0.149.0+26.1.2 / Java 25 요구사항은 0.4.7 과 동일합니다.
Downloads
-
v0.4.7 — smoother playback
StableSome checks failedbuild / build (push) Has been cancelledreleased this
2026-05-15 22:06:15 +09:00 | 35 commits to main since this release부드러운 영상 재생.
- 텍스처 업로드: 픽셀 단위 Java 루프 → LWJGL memcpy 한 번. 1080p 한 프레임 업로드 시간이 ~20ms → <1ms 수준으로 떨어집니다. 가장 큰 끊김 원인이었습니다.
- 프레임 펌프 주기: 20Hz client tick → 매 렌더 프레임(LevelRenderEvents.START_MAIN). 24fps 영상에서 디코드된 프레임이 다음 tick까지 최대 50ms 대기하던 창이 사라집니다.
- 거리 기반 오디오 게인 계산은 cheap 하므로 여전히 20Hz 로 둡니다.
설치: video_player-0.4.7.jar 를 mods 폴더에 넣어주세요. JavaCV 의존성 / Java25 / Fabric 0.19.2 / Fabric API 0.149.0 요구사항은 0.4.6 과 동일합니다.
Downloads
-
v0.4.6 — 서버 config 자동 프리로드
StableSome checks failedbuild / build (push) Has been cancelledreleased this
2026-05-15 21:58:26 +09:00 | 36 commits to main since this release변경 사항
⚙️ 서버 config 로 자동 프리로드
- 모드를 서버에 넣고 처음 실행하면
<서버폴더>/config/video_player.json이 자동 생성됩니다. preload_urls배열에 자주 쓰는 URL 을 적어두면, 플레이어가 접속할 때마다 서버가 그 URL 들에 대해 자동으로 PreloadPayload 를 보냅니다 →/videopreload를 사람마다 입력한 것과 동일.- 클라이언트 동작은 기존
/videopreload와 동일: 캐시 디렉터리, 채팅 메시지([videopreload] 다운로드 시작 / 완료), 재생 시 로컬 파일 사용 모두 그대로.
예시:
{ "preload_urls": [ "https://video.example.com/intro.mp4", "https://video.example.com/bgm-loop.webm" ] }규칙
- URL 은
http://또는https://로 시작, 256자 이하. 그 외는 무시 + WARN 로그. - 파일 수정 적용은 서버 재시작 필요 (config 는 시작 시 1회만 읽음).
- 싱글플레이도 통합 서버를 띄우므로
<게임폴더>/config/video_player.json으로 동작합니다.
설치
mods/video_player-0.4.5.jar을0.4.6.jar로 교체. 서버에도 동일 버전 적용 후 처음 실행하면 config 가 만들어집니다.Downloads
- 모드를 서버에 넣고 처음 실행하면
-
v0.4.5 — panel-center audio · preload feedback · BE safety
StableSome checks failedbuild / build (push) Has been cancelledreleased this
2026-05-15 21:53:21 +09:00 | 37 commits to main since this release변경 사항
🔊 오디오
- 거리 감쇠 기준을 판때기 중앙으로 변경. 예전엔 앵커 블록(보통 화면 모서리)에서의 거리로 음량을 계산해서, 4x4 같은 큰 화면이면 소리가 한쪽 모서리에서 들리는 느낌이었습니다. 이제 화면 중앙에서 발생하는 것처럼 들립니다.
💬
/videopreload피드백- 각 클라이언트가 채팅창에 다운로드 상태를 출력합니다:
[videopreload] 다운로드 시작: <url>(노랑)[videopreload] 완료 (N MB): <url>(초록)[videopreload] 실패 (...): <url>(빨강)[videopreload] 이미 캐시됨/이미 다운로드 중/기존 캐시 사용
- 커맨드블럭으로
/videopreload→/videoplace를 이어서 쓸 때는[videopreload] 완료메시지를 본 뒤에/videoplace를 트리거하세요. 그 전에 재생하면 일반 스트리밍으로 떨어집니다. /videopreload명령 응답에도 "완료 알림 후 재생하세요" 안내가 추가됐습니다.
🛡️ 안전장치
- 매 클라이언트 틱마다 활성 앵커의 BE 존재를 검증합니다.
BLOCK_ENTITY_UNLOAD이벤트가 누락되는 엣지케이스(차원 이동, 청크 강제 언로드 등)에도 다음 틱 안에 재생이 정지됩니다.
설치
mods/의video_player-0.4.4.jar을video_player-0.4.5.jar로 교체하세요. 서버와 클라이언트 양쪽 모두 같은 버전이어야 합니다. JavaCV/FFmpeg 네이티브 jar 동봉 절차는 README 와 동일합니다.Downloads
-
v0.4.4 — audio fix · stutter reduction · /videopreload
StableSome checks failedbuild / build (push) Has been cancelledreleased this
2026-05-15 21:42:11 +09:00 | 38 commits to main since this release변경 사항
🐛 버그 수정
- 재생 중 삭제 시 소리가 계속 나던 문제 해결. 클라이언트에서 앵커 블록 엔티티가 언로드되면 즉시 재생을 중단합니다. 블록된 오디오 라인(
SourceDataLine.write())과 FFmpeggrab()호출도 워커 외부에서 강제로 깨워 종료 지연을 없앴습니다.
⚡ 성능
- 스트리밍 끊김 감소. FFmpeg 옵션 튜닝(
buffer_size=1MB,probesize=8MB,analyzeduration=2s,max_delay=500ms,reconnect_delay_max=2,fflags=+genpts) 및 오디오 라인 버퍼를 약 0.5초로 사전 확보.
✨ 새 명령어
/videopreload <url>— 서버가 모든 접속자에게 프리로드 요청을 브로드캐스트하면, 각 클라이언트는 해당 URL을<게임폴더>/video_player_cache/<sha256>파일로 다운로드합니다. 이후 같은 URL로/videoplace를 호출하거나 우클릭 배치를 하면 네트워크 스트리밍 없이 로컬 파일에서 재생되어 미세 끊김이 사라집니다.- 캐시 한도: URL당 최대 512MB. 캐시 폴더를 삭제하면 다시 받습니다.
- 권한:
COMMANDS_GAMEMASTER(op level 2). 커맨드 블럭에서 호출 가능합니다.
사용 예시
/videopreload https://example.com/intro.mp4 # 잠시 후 (다운로드 완료를 클라이언트가 알아서 처리) /videoplace ~ ~ ~ north 4 3 https://example.com/intro.mp4설치
video_player-0.4.4.jar를 받아mods/폴더에 있는 기존video_player-0.4.3.jar을 교체하세요. 클라이언트와 서버 양쪽 모두 동일 버전이어야 합니다. JavaCV/FFmpeg 네이티브 jar 동봉 절차는 README와 동일합니다.Downloads
- 재생 중 삭제 시 소리가 계속 나던 문제 해결. 클라이언트에서 앵커 블록 엔티티가 언로드되면 즉시 재생을 중단합니다. 블록된 오디오 라인(
-
v0.4.3 — fix install guide: missing javacpp native jar
StableSome checks failedbuild / build (push) Has been cancelledreleased this
2026-05-15 21:22:02 +09:00 | 39 commits to main since this releaseDocs-only patch. v0.4.2 mod code is unchanged.
What changed
Install guide previously listed 4 JavaCV jars; the 5th (the platform-specific
javacpp-<os>-<arch>.jar) was silently missing. Without it, JavaCPP Loader cannot loadjnijavacppJNI bridge → FFmpeg natives fail to link → black panel +JavaCV decode error: UnsatisfiedLinkError ... jnijavacppinlatest.log.Now required: 5 jars (
javacv.jar,javacpp.jar,javacpp-<os>-<arch>.jar,ffmpeg.jar,ffmpeg-<os>-<arch>.jar). README updated with new-Xbootclasspath/a:examples on Windows / macOS / Linux and a diagnostic note.Upgrading from 0.4.2
- Delete
video_player-0.4.2.jarfrom.minecraft/mods/and drop invideo_player-0.4.3.jar. - Add
javacpp-1.5.13-<os>-<arch>.jarfromjavacv-platform-1.5.13-bin.zipnext to your existing 4 JavaCV jars. - Update the
-Xbootclasspath/a:JVM arg in the official launcher to list the new 5th jar.
Downloads
- Delete
-
v0.4.2 — stick texture fix (26.1.2 model namespacing)
StableSome checks failedbuild / build (push) Has been cancelledreleased this
2026-05-15 21:02:03 +09:00 | 41 commits to main since this releaseFixes
- Video stick renders as a missing-model cube despite v0.4.1 loading. Root cause: Fabric 26.1.2 model loader no longer auto-resolves unprefixed parent paths.
parent: item/generatedhad to be writtenparent: minecraft:item/generatedper the official Fabric 26.1.2 docs.
Upgrade
Delete
video_player-0.4.1.jarfrom your mods folder, dropvideo_player-0.4.2.jarin. Same Fabric API (0.149.0+26.1.2) and same JavaCV 1.5.13 setup as v0.4.1.Downloads
- Video stick renders as a missing-model cube despite v0.4.1 loading. Root cause: Fabric 26.1.2 model loader no longer auto-resolves unprefixed parent paths.
-
released this
2026-05-15 20:21:19 +09:00 | 46 commits to main since this releasev0.4.1 — 비디오 스틱 아이콘 / quad 좌하단 앵커링 / EAST·WEST 벽 flush
세 가지 픽스:
- 비디오 스틱이 missing-texture 로 보이던 문제. 26.1.2 는 신 client_item 디스크립터
assets/<mod>/items/<name>.json가 필요합니다. 추가했습니다. 기존models/item/...와 텍스처 자산은 그대로 유지. - 영상 quad 의 좌하단(local 0,0)이 클릭한 벽 면의 좌하단 모서리에 정렬되도록 변경. 클릭한 블록이 BL, W/H 만큼 오른쪽·위로 확장.
- EAST/WEST 면의 회전 방향이 뒤집혀 있어서 quad 가 anchor 블록의 반대쪽 면(벽에서 1블록 떨어진 곳)에 배치되던 버그 수정. 6면 회전 수학을 first-principle 로 재유도:
- EAST =
Axis.YP +90°(local +Z → world +X, 우방향 = 북) - WEST =
Axis.YP -90°(local +Z → world -X, 우방향 = 남) - NORTH/SOUTH/UP/DOWN 은 기존이 맞음 (재검증 완료)
- EAST =
알려진 사항: 실제 영상/오디오 재생은 클라이언트에 JavaCV 가 있을 때만 활성화됩니다. 없으면 anchor 자리에 회색 placeholder quad 만 보입니다 (placement 위치는 정상). 로그에
JavaCV not on classpathWARN 이 표시되면org.bytedeco:javacv-platform또는javacv+ ffmpeg natives 를 클라이언트 클래스패스에 추가해야 합니다.Downloads
- 비디오 스틱이 missing-texture 로 보이던 문제. 26.1.2 는 신 client_item 디스크립터