簡體   English   中英

將TargetDataLine數據編碼為Ogg Vorbis文件

[英]Encoding TargetDataLine data into Ogg Vorbis file

抱歉,這似乎是一個簡單的問題,但這是我第一次嘗試在編程中進行聲音測試。

我在這里想要實現的是將通過TargetDataLine對象獲得的數據編碼為.ogg文件。 我的起點是官方Java文檔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更改為VorbisEncoding.PCM_SIGNED但控制台隨后引發以下錯誤。

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)

您使用的Vorbis SPI代碼基於JOrbis Ogg 解碼器

它僅支持讀取Ogg文件,不支持編碼和寫入Ogg文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM