Skip to content

4.0.1: ライブ配信 (HLS / DASH / HTTP-FLV / MJPEG)、glTF の拡張、115 言語、FFmpeg がないときの対策 - #16

Merged
malken21 merged 32 commits into
mainfrom
release-4.0.1
Oct 16, 2026
Merged

malken21 merged 32 commits into
mainfrom
release-4.0.1

Conversation

@malken21

Copy link
Copy Markdown
Member

4.0.1 として、次をまとめて入れます。main に入ると、release ワークフローが v4.0.1 を作ります。

Closes #15

ライブ配信 (#15)

HLS (.m3u8)、MPEG-DASH (.mpd)、HTTP-FLV、MJPEG (multipart/x-mixed-replace) の URL を、動画と同じように看板に表示できるようにしました。長い URL は今までどおり自動で短縮されます。

  • 映像と音声を時刻 0 からそろえ、フレームの番号と時刻がずれないようにした (以前はライブ配信で 4 fps 前後まで落ちていた)
  • MJPEG は時刻の情報がないので、届いた時刻を使う
  • 配信が途切れたとき、15 秒間なにも届かないとき (最初からやり直された HLS など) は、待ち時間を延ばしながらつなぎ直す
  • MJPEG の配信は、画像としてダウンロードしない

FFmpeg がないとき

FFmpeg が見つからない状態で、動画の看板を Fabric 1.21.1 / 26.3、Forge 1.7.10 / 1.12.2 / 26.3、NeoForge 26.3 の実機で表示しましたが、落ちることはありませんでした (チャットで知らせて、エラーの画像を出す)。
落ちる原因は特定できていませんが、FFmpeg の場所が null のまま使われうる箇所をなくし、探す処理の例外も止めるようにしました。

glTF の拡張

  • 圧縮・インスタンス: KHR_draco_mesh_compression、EXT_meshopt_compression / KHR_meshopt_compression、EXT_mesh_gpu_instancing、KHR_mesh_quantization
  • 材質: clearcoat、sheen、specular、ior、transmission、volume、iridescence、anisotropy、dispersion、diffuse_transmission、variants
  • 光源: KHR_lights_punctual、EXT_lights_image_based
  • アニメーション: KHR_animation_pointer
  • テクスチャ: KTX2 (KHR_texture_basisu、ETC1S / UASTC、Zstandard)、WebP、DDS (BC1 - BC7)、AVIF (FFmpeg 経由)

Draco、meshopt、WebP、BC6H/BC7、ETC1S/UASTC は、それぞれ openize-drako-java (MIT)、meshoptimizer (MIT)、TwelveMonkeys ImageIO (BSD 3-Clause)、bcdec (MIT)、Basis Universal (Apache 2.0) を取り込み、または Java に書き直したものです。
ライセンスは jar の marumasa_sign/licenses に入れ、README に一覧を書きました。Zstandard の展開は RFC 8878 から書いています。

115 言語

Minecraft のすべての言語 (115) に、画面・チャット・キーの割り当ての名前を翻訳しました。英語と日本語以外はネイティブの確認をしていません。
タミル文字やカンナダ文字など、代わりのフォントにもない文字は、インストールされているフォントから探して描くようにしました。

確認したこと

  • ライブ配信 4 形式: Fabric 1.21.1 の実機で 4 形式とも表示 (警告・エラーなし)。サーバーを止めて再開し、自動でつなぎ直すことも確認
  • glTF: Khronos のサンプル 29 個を描いて、参照画像と比べた。テクスチャは FFmpeg / Pillow の展開結果と PSNR で比べた (DDS・WebP の可逆は一致、KTX2 の ETC1S は 35 - 43 dB)。壊したテクスチャ 2700 個で、例外や止まることがないことを確認
  • 実機: forge 1.7.10 / 1.8.9 / 1.12.2 / 1.18.2 / 1.20.1 / 26.3、liteloader 1.7.10 / 1.12.2、fabric 1.14.4 / 1.16.5 / 1.21.4 / 1.21.8 / 26.3、neoforge 1.21.1 / 1.21.10 / 26.3 の 16 通りで、画像・3D モデル・動画・看板アイテムが表示されることを確認。forge 26.3 だけ、Mojang の認証ライブラリ (authlib) の HTTP エラーが 1 行出ていて、Mod なしの基準にもともとある種類のものです
  • タミル語にした実機でも、警告なしで動くことを確認

確認していないこと

  • 対応表のすべての組み合わせ (上の 16 通り以外) と、影 Mod を入れた状態は、今回は確認していません
  • FFmpeg がないと落ちる、という報告の原因そのもの

- 映像と音声を時刻 0 からそろえ、フレームの番号と実際の時刻がずれないようにした (ライブ配信で 4 fps 程度まで落ちていた)
- MJPEG の配信は時刻の情報がないので、届いた時刻を使う
- ライブ配信が途切れたり、映像も音声も届かなくなったりしたら、待ち時間を延ばしながらつなぎ直す
- multipart/x-mixed-replace の配信は、画像としてダウンロードしない
- FFmpeg が見つからないときは、null のまま使わずに例外にする
- 法線マップで長さが 1 を超えた法線で、負の数の累乗が NaN になり黒い点になっていた
- 透過の材質は半分まで透けるようにし、焼き込まない場合も厚みのある材質の色 (KHR_materials_volume) を付ける
- 三角形の上限 (15 万) は、ゲームの中での負荷のために決めた値なので変えない
Draco の展開は openize-drako-java (MIT)、meshopt の展開は meshoptimizer (MIT) をもとにしているので、
その著作権表示とライセンスを marumasa_sign/licenses に置く。
インストールされているフォントから、文字の種類ごとに表示できるものを探して覚えておき、
1 つのフォントで表示できない文字列は文字ごとにフォントを変えて描く。
以前の実装は、可逆・非可逆とも正しい画素にならなかった (PSNR 5 - 10 dB)。
TwelveMonkeys ImageIO (BSD 3-Clause) の VP8 / VP8L デコーダを取り込み、RIFF の読み込み、
透明度 (ALPH、圧縮なし・可逆圧縮・予測)、アニメーションの最初のフレームは自分で書いた。
FFmpeg の結果と比べて、可逆は完全に一致、非可逆は 46 - 51 dB。
以前の BC7 は分け方の表が間違っていて、正しい画素にならなかった (PSNR 26 dB)。
BC6H と BC7 は bcdec (MIT) を Java に書き直したもの (Bptc)。Pillow のテスト画像と比べて、
BC1 - BC5、BC7、非圧縮、パレットは一致し、壊れたファイルは止まらずに失敗する。
以前の実装は ETC1S も UASTC も正しい画素にならなかった (灰色や黒の画像になっていた)。
- Zstandard の展開を RFC 8878 から書いた (ZstdDecoder)
- ETC1S (BasisLZ) と UASTC は Basis Universal (Apache 2.0) の transcoder を Java に書き直した
- 圧縮していない 8 ビットの形式と、BC1 - BC7 の形式、zlib の超圧縮にも対応
サンプルの KTX2 を WebP 版と比べて ETC1S は 35 - 43 dB (ETC1S 自体の劣化を含む)、
壊したファイル 2700 個で、IOException 以外の例外や止まることはなかった。
@malken21
malken21 merged commit 6dc7aa5 into main Oct 16, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

HLS MPEG-DASH HTTP-FLV MJPEG の対応を追加

1 participant