簡體   English   中英

Javasound:AudioSystem.getAudioInputStream在服務器上失敗,在客戶端代碼中有效

[英]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.

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