繁体   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