2016-12-03 10 views
0

申し訳ありませんが、これは簡単な質問のようですが、プログラミングでサウンドを試すのは初めてです。TargetDataLineデータをOgg Vorbisファイルにエンコードする

私がここで達成しようとしているのは、TargetDataLineオブジェクトで取得したデータを.oggファイルにエンコードすることです。私の出発点は、公式のJava Documentation https://docs.oracle.com/javase/tutorial/sound/capturing.htmlでした。

私はJavaZoomのVorbis API http://www.javazoom.net/vorbisspi/vorbisspi.htmlを使用しています。

private static void recordAudio(int id) { 

    Map<String, Object> myMap = new HashMap<String, Object>(); 
    myMap.put("duration", 0); 
    myMap.put("title", "title_test"); 
    myMap.put("author", "author_test"); 
    myMap.put("album", "album_test"); 
    myMap.put("date", "date_test"); 
    myMap.put("copyright", "copyright_test"); 
    myMap.put("comment", "comment_test"); 

    VorbisAudioFormat format = new VorbisAudioFormat(VorbisEncoding.VORBISENC, 48000.F, 16, 2, 4, 48000.F, true, myMap); 
    Mixer mixer = AudioSystem.getMixer(AudioSystem.getMixerInfo()[id]); 

    TargetDataLine line; 
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); 
    if (!AudioSystem.isLineSupported(info)) { 
     System.out.println("Line is not supported."); 
    } 
    try { 
     line = (TargetDataLine) mixer.getLine(info); 
     line.open(format); 
     line.start(); 

     AudioInputStream ais = new AudioInputStream(line); 
     File auFile = new File("path/stream_test.ogg"); 
     AudioFileFormat.Type fileType = VorbisFileFormatType.OGG; 
     AudioSystem.write(ais, fileType, auFile); 

    } catch (LineUnavailableException ex) { 
     System.out.println("Line is unavailable."); 
     ex.printStackTrace(); 
    } catch (FileNotFoundException e) { 
     System.out.println("File not found."); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

このコードでは、コンソールで次の出力が表示されます。

Line is not supported. 
Exception in thread "main" java.lang.IllegalArgumentException: Line unsupported: interface TargetDataLine supporting format VORBISENC 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, 
    at com.sun.media.sound.DirectAudioDevice.getLine(Unknown Source) 
    at test_mixer.Main.recordAudio(Main.java:60) 
    at test_mixer.Main.main(Main.java:35) 

私はVorbisEncoding.PCM_SIGNEDにencondingを変更しようとしたが、その後、コンソールには、次のようなエラーがスローされます。

Exception in thread "main" java.lang.IllegalArgumentException: could not write audio file: file type not supported: OGG 
at javax.sound.sampled.AudioSystem.write(Unknown Source) 
at test_mixer.Main.recordAudio(Main.java:66) 
at test_mixer.Main.main(Main.java:35) 
+0

AudioSystem.htmlをご覧ください。 AudioFileFormat.Type.htmlを見てください。あなたはどこでもサポートされているようにvorbisを見ますか? – gpasch

+1

@gpasch OPはVorbisのサポートをJava Soundに追加するVorbis SPIコードを使用しようとしています。 –

+0

代替パスは可能ですか?たとえば、wavに書き込んでから、audacity.comのようなものを使ってwavからoggに変換しますか?もしそうなら、私はwavの部分に書くことを手伝うことができると確信しています。直接oggに書き込むためのライブラリがある場合はIDK、利用可能です。おそらくLWJGL 3には、OpenALライブラリを使用していて、oggを読み込んでいて、おそらくそれを書き込んでいる可能性があります。 –

答えて

2

使用しているVorbisのSPIコードはJOrbisのOgg デコーダに基づいています。

Oggファイルの読み込みのみサポートしていますが、Oggファイルのエンコードと書き込みはサポートしていません。

+0

ありがとうございました!書いて、固定サイズの.auファイル(例えば)を書き直してから、エンコーディングの正しい動作を得るためにffmpegの周りにXugglerまたはJavaラッパーを使用しますか? – Niconoid

+1

私はそれがOKだろうと思います。 –

関連する問題