2017-01-26 57 views
0

我的AudioInputStream audioInput該對象本身具有編碼爲ULAW爲什麼java AudioSystem.getTargetEncodings(AudioFormat)返回與我們提供的AudioFormat的編碼不同的Encoding?

System.out.println(audioInput.getFormat().getEncoding()); 

其中在控制檯返回ULAW編碼。

ULAW 

然而,當我使用AudioSystem.getTargetEncodings(audioInput)它返回一組不同的編碼

Encoding availableEncoding[] = AudioSystem.getTargetEncodings(audioIn.getFormat()); 
    for (Encoding encode : availableEncoding) 
    { 
     System.out.println(encode); 
    } 

的其中返回:

PCM_SIGNED 

的事情是,我要工作有很多這些文件,其中對象編碼和目標編碼不匹配。這些音頻文件無法被AudioSystem夾被打開,拋出一個異常

Clip audioClip = AudioSystem.getClip(); 
audioClip.open(audioInput); 
// this throws error javax.sound.sampled.LineUnavailableException: line with format ULAW 8000.0 Hz, 8 bit, mono, 1 bytes/frame, not supported. 

但是,如果我的聲音轉換爲目標編碼

audioInput = AudioSystem.getAudioInputStream(Encoding.PCM_SIGNED , audioInput); 
audioClip.open(audioInput); //it works !! 

之一。雖然這種做法似乎爲所有發出的聲音與我一起工作的文件,我幾乎不知道我在做什麼。根據Java文檔,在AudioSystem.getTargetEncodings說明(如果它可以幫助):

"Obtains the encodings that the system can obtain from an audio input stream with the specified format using the set of installed format converters." 

對不起,長細節,但這裏是我的問題:

  1. 爲什麼java的AudioSystem。 getTargetEncodings(AudioFormat)返回與我們在參數中提供的AudioFormat的編碼不同的結果?

  2. 因此,在我的情況下,這是否意味着即使文件本身的編碼是ULAW,系統也只能用PCM_SIGNED編碼來感知和處理文件?

  3. 我的解決方案是否合法?這真的竊聽了我很多有,似乎沒有一個很好的理由

+2

我不知道這裏講什麼,但如果它的工作原理 - AudioSystem.getTargetEncodings返回系統可以轉換到 - 所以它可以轉換爲PCM - 好!我不知道完整的故事,所以我不能評論,如果它的合法短期內,如果它的工作你很好 - 如果你遇到問題回來 – gpasch

+0

哈哈,爲講課抱歉。我很想盡可能地提供我所學到的信息。我有點覺得它也是惹火 – LameLoura

回答

2

據我到目前爲止已經學會了工作的解決方案:

  1. Java正在尋找在默認設置爲播放系統的配置,而不是音頻文件的格式。許多(大多數?)計算機系統設置爲播放PCM_SIGNED。

  2. 取決於「only」的含義。有可能有方法來改變你的系統的播放首選項,但我一直只使用默認或「支持」選項之一。

  3. 該解決方案完全合法!流式轉換是爲這種情況編寫的:許多音頻文件類型,即設置爲播放有限子集的系統。如果您希望以新格式編程轉換和保存文件,它們也會有所幫助。

但對於我的音樂用途(SF遊戲線索/ X - 我遇到不同類型的文件),我傾向於全部轉換,外部,使用大膽,之前的遊戲包裝他們,以免在遊戲過程中進行任何轉換。

相關問題