![](/img/trans.png)
[英]Why does AudioSystem.getAudioInputStream() throw IllegalArgumentException
[英]Javasound: AudioSystem.getAudioInputStream fails on server, works in client code
我的應用程序涉及通過Web UI上傳wave文件,將格式轉換為8k,8位mulaw,並將其存儲在服務器上。 嘗試執行以下操作時,我的代碼在服務器上失敗:
final AudioInputStream ais = AudioSystem.getAudioInputStream( in );
錯誤是:
Caused by: javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1102) [classes.jar:1.6.0_65]
因此,我擴展到一個簡單的測試用例,嘗試將音頻文件加載為本地文件:
final File audioFile = new File("/path/to/audio.wav");
final InputStream in = new FileInputStream( file );
final AudioInputStream ais = AudioSystem.getAudioInputStream( in );
這可行。 然后,我回到服務器端並添加了一些調試,如下所示:
final byte[] audio = IOUtils.toByteArray( in );
final File audioLog = File.createTempFile( "audiolog", ".wav" );
IOUtils.write( audio, new FileOutputStream( audioLog ) );
s_logger.info( "File logged to: " + audioLog.getAbsolutePath() );
final InputStream byteIn = new ByteArrayInputStream( audio );
final AudioInputStream ais = AudioSystem.getAudioInputStream( byteIn );
這以完全相同的方式失敗。
然后,我將上傳的原始文件與服務器上記錄的音頻文件進行比較,直到校驗和,它們都是相同的:
$ cksum uploaded.wav
4019972581 84076 uploaded.wav
$ cksum audiolog6415586848170376004.wav
4019972581 84076 audiolog6415586848170376004.wav
任何想法可能會發生什么? 我的服務器端代碼在JBoss 7.1上運行。
謝謝。
-Raj
以下可能值得嘗試。
InputStream中間步驟執行各種測試,如果測試失敗,則可能引發IOException 。 從api :
此方法的實現可能需要多個解析器來檢查流,以確定它們是否支持該流。 這些解析器必須能夠標記流,讀取足夠的數據以確定它們是否支持該流,如果不能,則將流的讀取指針重置為其原始位置。 如果輸入流不支持這些操作,則此方法可能會失敗,並出現IOException 。
我建議完全避免InputStream步驟,並設置自己通過AudioSystem.getAudioInputStream(File)或AudioSystem.getAudioInputStream(URL)進行加載。 這兩個沒有此要求。
不過,我會承認,這與您的寫作並不相稱,引發的錯誤是UnsupportedAudioFileException ,並且您能夠使用此方法作為“本地文件”進行加載。 在不同情況下,實施這些測試的方式可能會有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.