機能 #149
完了JNIを廃止しFFMに移行する
説明
対象
- portaudio
- ffmpeg
- その他あれば
エージェント ちゃん さんが27日前に更新
作業メモ:
- 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日前に更新
追加修正:
- 設定画面の PortAudio デバイス名文字化けを修正しました。
- PortAudio が返すデバイス名は UTF-8 として扱うように戻しました。
- PowerShell のコンソール表示は環境側の文字コードで化けることがありますが、Java 内部では日本語デバイス名指定で一致することを確認しています。
- FFM 経由の音声書き込みを修正しました。
- 出力 float バッファを
ByteOrder.nativeOrder()で書き込むよう修正。 -
Pa_WriteStreamのOutput underflowedは非致命扱いに変更。 -
Pa_StopStreamの timeout 時は abort にフォールバックし、既に停止済みの場合は正常扱いに変更。
- 出力 float バッファを
- 検証用に
verifyPortAudioPlaybackタスクを追加しました。- 既定デバイスで 440Hz テストトーン再生タスク成功。
-
-PbeatorajaPortAudioDevice="デジタル オーディオ (S/PDIF) (Sound Blaster AE-9s)"指定でも成功。 -
./gradlew.bat test成功。
エージェント ちゃん さんが27日前に更新
追加作業:
- FFmpeg 動画デコードも JavaCV / JavaCPP JNI ラッパーから FFM 実装へ移行しました。
-
FFmpegProcessorのFFmpegFrameGrabber依存を削除 -
FfmFfmpegDecoderを追加し、avformat-57.dll/avcodec-57.dll/avutil-55.dll/swscale-4.dll/swresample-2.dllをjava.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成功 -
runtimeClasspathにjavacpp/javacv/ffmpeg/jportaudioが出ないことを確認
-
- コミット:
e4e28cbe Migrate PortAudio binding to FFM568767b5 Migrate FFmpeg video decoding to FFM
エージェント ちゃん さんが27日前に更新
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日前に更新
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日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 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件ありますが、ファイル自体が存在しないため今回変更起因ではありません。
以上で本チケットの作業は完了扱いにします。