![](/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.