Java 8u121でOS X 10.11.6を使用していますが、VLCJ 3.10.1(VLC 2.2.4)を使用してオーディオファイルをOGG Vorbis)。トランスコードは正常に動作しているようですが、MediaPlayer
をリリースするとエラーが発生します。VLCJ MediaPlayerをリリースするとJVMがクラッシュする
ベローはVLCJレポからRipAudioTestに基づいて私の最小限のテストコード、次のとおりです。
public class VlcjTestMain {
public static void main(String[] args) throws InterruptedException {
Path sourceFile = // source file here
Path targetFile = // target file here
new NativeDiscovery().discover();
MediaPlayerFactory factory = new MediaPlayerFactory();
MediaPlayer player = factory.newHeadlessMediaPlayer();
CountDownLatch latch = new CountDownLatch(1);
player.addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
@Override
public void finished(MediaPlayer mediaPlayer) {
latch.countDown();
}
@Override
public void error(MediaPlayer mediaPlayer) {
System.out.println("Rip failed");
latch.countDown();
}
});
String transcodeOpts =
":sout=#transcode{acodec=vorb,vcodec=dummy}:std{dst=" + targetFile.toAbsolutePath().toString() + ",mux=ogg,access=file}";
player.playMedia(
sourceFile.toAbsolutePath().toString(),
transcodeOpts);
latch.await();
System.out.println("Finished!");
player.release();
System.out.println("Player released");
factory.release();
System.out.println("Factory released");
}
}
トランスコーディングが正常に終了したが、player.release()
に、JVMがSIGSEGVエラーでクラッシュ:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00000001224e8649, pid=13561, tid=0x000000000000c253
#
# JRE version: Java(TM) SE Runtime Environment (8.0_121-b13) (build 1.8.0_121-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.121-b13 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# C [libvlc.dylib+0x6649] libvlc_event_send+0x19
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
残りのクラッシュログcan be seen here。
これを引き起こす可能性があることは誰にも分かりますか?
あなたが投稿したダンプに基づいて、Java側でメディアプレーヤーをリリースした後、おそらくネイティブコードが(libvlc_event_send経由で)イベントを送信している可能性があります。どこかにシーケンシングの問題やvlcjクリーンアップのバグがあるかもしれません。私は確かに分かりません。 – caprica
興味深いことに、私は、イベントリスナーが受け取ったすべてのイベントをログに記録し、メディアプレーヤーを解放する前にちょっと待ってから、何が得られるかを見てみようと思います。また、Windows上でテストを繰り返して、それが違うかどうかを確認します。 –
vlcjのrelease()クリーンアップは実際には何よりも先にネイティブイベントリスナーを実際に明示的に登録解除するので、難しいです。おそらくこれは、vlcj githubプロジェクトページの問題として、より良いものです。 – caprica