プロジェクト

全般

プロフィール

機能 #149

完了

JNIを廃止しFFMに移行する

機能 #149: JNIを廃止しFFMに移行する

いづ さん さんが27日前に追加. 22日前に更新.

ステータス:
完了
優先度:
通常
担当者:
対象バージョン:
開始日:
2026/06/09
期日:
進捗率:

100%

予定工数:

説明

対象

  • portaudio
  • ffmpeg
  • その他あれば

いづ さん さんが27日前に更新 操作 #1

Windows11 x64のみでいい

いづ さん さんが27日前に更新 操作 #2

  • ステータス未着手 から 実装中 に変更
  • 進捗率0 から 10 に変更

エージェント ちゃん さんが27日前に更新 操作 #3

作業メモ:

  • PortAudio の Java 側 JNI 依存を FFM 実装へ移行しました。
    • com.portaudio / jportaudio.jar 参照を削除
    • portaudio_*.dll の C API を java.lang.foreign で直接呼び出す FfmPortAudio を追加
    • デバイス列挙、既定出力デバイス取得、出力ストリーム open/start/write/stop/close を FFM 化
    • jpackage 内容から jportaudio_*.dll を除外
  • 検証:
    • ./gradlew.bat compileJava 成功
    • ./gradlew.bat verifyPortAudioDevices 成功(FFM 経由でデバイス列挙確認)
    • ./gradlew.bat test 成功

残作業:

  • FFmpeg はまだ JavaCV / Bytedeco 依存が残っています。動画デコード API 全体の置き換えになるため、PortAudio とは別段階で FFM ラッパー設計とフレーム変換処理の移植が必要です。

エージェント ちゃん さんが27日前に更新 操作 #4

追加修正:

  • 設定画面の PortAudio デバイス名文字化けを修正しました。
    • PortAudio が返すデバイス名は UTF-8 として扱うように戻しました。
    • PowerShell のコンソール表示は環境側の文字コードで化けることがありますが、Java 内部では日本語デバイス名指定で一致することを確認しています。
  • FFM 経由の音声書き込みを修正しました。
    • 出力 float バッファを ByteOrder.nativeOrder() で書き込むよう修正。
    • Pa_WriteStreamOutput underflowed は非致命扱いに変更。
    • Pa_StopStream の timeout 時は abort にフォールバックし、既に停止済みの場合は正常扱いに変更。
  • 検証用に verifyPortAudioPlayback タスクを追加しました。
    • 既定デバイスで 440Hz テストトーン再生タスク成功。
    • -PbeatorajaPortAudioDevice="デジタル オーディオ (S/PDIF) (Sound Blaster AE-9s)" 指定でも成功。
    • ./gradlew.bat test 成功。

エージェント ちゃん さんが27日前に更新 操作 #5

追加作業:

  • FFmpeg 動画デコードも JavaCV / JavaCPP JNI ラッパーから FFM 実装へ移行しました。
    • FFmpegProcessorFFmpegFrameGrabber 依存を削除
    • FfmFfmpegDecoder を追加し、avformat-57.dll / avcodec-57.dll / avutil-55.dll / swscale-4.dll / swresample-2.dlljava.lang.foreign で直接呼び出し
    • javacpp.jar / javacv.jar / ffmpeg.jar / ffmpeg-windows-*.jar を runtimeClasspath から除外
    • jpackage 用に FFmpeg DLL 抽出タスク extractFfmpegNatives を追加
    • 開発実行時は lib/ffmpeg-windows-*.jar から必要 DLL だけを build/ffmpeg-natives へ一時展開
  • 検証:
    • ./gradlew.bat verifyFfmpegDecode 成功
    • 日本語パス動画 D:\rei-no-are\先天性エゴサ依存症候群\egosa_bga.mpg でも decode 成功
    • ./gradlew.bat prepareJpackageContent 成功
    • ./gradlew.bat test 成功
    • runtimeClasspathjavacpp / javacv / ffmpeg / jportaudio が出ないことを確認
  • コミット:
    • e4e28cbe Migrate PortAudio binding to FFM
    • 568767b5 Migrate FFmpeg video decoding to FFM

エージェント ちゃん さんが27日前に更新 操作 #6

FFmpeg FFM移行後の動画色変化について調査しました。D:\rei-no-are\オトゲラヴ!\otogelove_movie.mpg を対象に、FFMデコード結果と旧JavaCV経路の出力をPNG比較したところ、ゲーム内表示で赤青チャンネルが入れ替わる状態でした。\n\n対応として、FFM側の sws_scale 出力を RGB24 から BGR24 に変更し、LibGDX表示時に元動画の色になるよう修正しました。検証用に verifyFfmpegDecode で任意フレームをPNG dumpできる引数も追加しています。\n\n確認済み:\n- ./gradlew.bat compileJava\n- ./gradlew.bat verifyFfmpegDecode\n- ./gradlew.bat verifyFfmpegDecode -PbeatorajaFfmpegSmokeFile=D:\rei-no-are\オトゲラヴ!\otogelove_movie.mpg -PbeatorajaFfmpegSmokeDump=build\tmp\otogelove-ffm-840-fixed.png -PbeatorajaFfmpegSmokeFrame=840\n- ./gradlew.bat test

エージェント ちゃん さんが27日前に更新 操作 #7

FFmpeg native jarを最新版系に更新しました。\n\n変更点:\n- Bytedeco FFmpegを org.bytedeco:ffmpeg:8.0.1-1.5.13:windows-x86_64 に更新\n- DLL名を avutil-60 / swresample-6 / swscale-9 / avcodec-62 / avformat-62 に更新\n- FFmpeg 8 APIに合わせて AVStream.codec 参照を廃止し、codecpar + avcodec_alloc_context3 + avcodec_parameters_to_context に変更\n- 廃止済み avcodec_decode_video2 から avcodec_send_packet / avcodec_receive_frame に変更\n- 最新版artifactにWindows x86 classifierが見当たらないため、FFmpeg動画デコードは64bit Windows前提に明示\n\n確認済み:\n- ./gradlew.bat extractFfmpegNatives\n- ./gradlew.bat compileJava\n- ./gradlew.bat verifyFfmpegDecode\n- ./gradlew.bat verifyFfmpegDecode -PbeatorajaFfmpegSmokeFile=D:\rei-no-are\オトゲラヴ!\otogelove_movie.mpg -PbeatorajaFfmpegSmokeFrame=840 -PbeatorajaFfmpegSmokeDump=build\tmp\otogelove-ffmpeg8-840.png\n- ./gradlew.bat prepareJpackageContent\n- ./gradlew.bat test\n- ./gradlew.bat dependencies --configuration ffmpegWindowsX64\n- ./gradlew.bat dependencies --configuration runtimeClasspath

エージェント ちゃん さんが27日前に更新 操作 #8

  • ステータス実装中 から 完了 に変更
  • 進捗率10 から 100 に変更

最終確認:

  • PortAudio は FFM 実装へ移行済みで、設定画面のデバイス名文字化けと実機再生も確認済みです。
  • FFmpeg 動画デコードは FFM 実装へ移行済みで、色チャンネル修正および FFmpeg 8.0.1-1.5.13 対応済みです。
  • 旧 JNI ラッパー jar / ローカル FFmpeg native jar は削除し、FFmpeg native jar は Gradle 管理へ移行済みです。
  • その他 JNI 依存は runtimeClasspath 上に残っていないことを確認済みです。
  • 実機確認後のログでは FFmpeg / PortAudio の例外、クラッシュ、新規 hs_err はありませんでした。
  • PLAY スキンの BGA/ムービー明るさ変更は、現在も描画時の color 乗算として機能していることをコード上確認済みです。

既知事項:

  • FFmpeg 8 の Bytedeco artifact は Windows x86 classifier が見当たらないため、今回の FFmpeg 動画デコードは Windows x64 前提です。
  • 実機ログに D:\rei-no-are\オトゲラヴ!\Piko05_14.wav の音源読み込み失敗が1件ありますが、ファイル自体が存在しないため今回変更起因ではありません。

以上で本チケットの作業は完了扱いにします。

いづ さん さんが22日前に更新 操作 #9

  • 対象バージョン1.0.0 にセット

他の形式にエクスポート: PDF Atom