2017-04-09 4 views
2

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

これを引き起こす可能性があることは誰にも分かりますか?

+0

あなたが投稿したダンプに基づいて、Java側でメディアプレーヤーをリリースした後、おそらくネイティブコードが(libvlc_event_send経由で)イベントを送信している可能性があります。どこかにシーケンシングの問題やvlcjクリーンアップのバグがあるかもしれません。私は確かに分かりません。 – caprica

+0

興味深いことに、私は、イベントリスナーが受け取ったすべてのイベントをログに記録し、メディアプレーヤーを解放する前にちょっと待ってから、何が得られるかを見てみようと思います。また、Windows上でテストを繰り返して、それが違うかどうかを確認します。 –

+0

vlcjのrelease()クリーンアップは実際には何よりも先にネイティブイベントリスナーを実際に明示的に登録解除するので、難しいです。おそらくこれは、vlcj githubプロジェクトページの問題として、より良いものです。 – caprica

答えて

0

私はカプリカのコメントのおかげで私の質問に答えることができたと思います。

TL; DRは:mediaChangednewMediafinishedイベントの後、VLCはまだ他の二つのイベントが発生します。それがプレーヤーを解放した後に起こるなら、それはクラッシュします。

は今、ここに私の実験の詳細については、私はそれは時々働いていたのWindows 10上で同じコードを試してみましたが、ほとんどの場合player.release()にエラーjava.lang.Error: Invalid memory accessを上げ...

です。

player.release()の前にThread.sleep(1000)の文を追加しようとしましたが、クラッシュを再現できなくなりました。

私はほとんどのイベントを記録したイベントリスナーを使用し、player.release()の前にThread.sleep(1000)ステートメントを保持しました。 finishedの後に受け取った2つのイベント:最初にmediaChanged、次にnewMediaに気づいた。最後に、私もsleep文を削除しますが(むしろ最初finishedイベントより)第二newMediaイベントの後player.release()を呼び出してみました

mediaStateChanged 
finished 
Finished! 
mediaChanged 
newMedia 
[00000000209f45b0] mux_ogg mux: Close [this line logged by VLCJ, not by me] 
Player released 
Factory released 

、と私も再現することができませんでした。ここのようなログの終わりが見えたものですクラッシュ。

+0

うーん... – caprica

関連する問題