Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从ServletInputStream获取wav文件_Java_Audio - Fatal编程技术网

Java 从ServletInputStream获取wav文件

Java 从ServletInputStream获取wav文件,java,audio,Java,Audio,我们当前的项目要求我们向服务器发送一个音频文件,然后使用该音频文件进行进一步计算 使用Java sound api,我能够捕获录音并将其保存为系统中的wav文件。然后,为了将音频wav传递到服务器,我使用ApacheCommonsHttpClient向服务器发送请求。我使用apache提供的InputstreamEntity并将数据作为块发送 当我试图在服务器上重新创建/检索wav文件时,会出现此问题。我知道我必须使用AudioSystem.write API来创建wav文件,就像在我的系统上所

我们当前的项目要求我们向服务器发送一个音频文件,然后使用该音频文件进行进一步计算

使用Java sound api,我能够捕获录音并将其保存为系统中的wav文件。然后,为了将音频wav传递到服务器,我使用ApacheCommonsHttpClient向服务器发送请求。我使用apache提供的InputstreamEntity并将数据作为块发送

当我试图在服务器上重新创建/检索wav文件时,会出现此问题。我知道我必须使用AudioSystem.write API来创建wav文件,就像在我的系统上所做的一样。然而,我观察到的是,尽管创建了文件,但它没有播放,我正在使用vlc media player对其进行测试,仅供参考。我在谷歌搜索了一些示例代码,并试图实现它,但一旦创建了文件,就无法播放

示例代码片段指出了我尝试过的方法:

//******************************************************************

try {
InputStream is = request.getInputStream();
FileOutputStream fs = new FileOutputStream("output123.wav");
byte[] tempbuffer = new byte[4096];
int bytesRead;
while((bytesRead=is.read(tempbuffer))!=-1)
{
fs.write(tempbuffer, 0,bytesRead);
}
is.close();
fs.close();
AudioInputStream inputStream =AudioSystem.getAudioInputStream(newFile("output123.wav"));
int numofbytes = inputStream.available();           
byte[] buffer = new byte[numofbytes];
inputStream.read(buffer);
int bytesWritten = AudioSystem.write(inputStream, AudioFileFormat.Type.WAVE,new File("outputtest.wav"));
System.out.println("written"+bytesWritten);
方法2

InputStream is = request.getInputStream(); 
System.out.println("inputStream obtained : "+is.toString());
ByteArrayInputStream bais = null;
byte[] audioBuffer = IOUtils.toByteArray(is);
System.out.println(" is audioBuffer empty? : length =  ? "+audioBuffer.length);
try {
AudioFileFormat ai = AudioSystem.getAudioFileFormat(is);
System.out.println("ai bytelength ? "+ai.getByteLength());
System.out.println("ai frame length = "+ai.getFrameLength());
Set<Map.Entry<String,Object>> audioProperties = ai.getFormat().properties().entrySet();
System.out.println("entry set is empty ? "+audioProperties.isEmpty());          
for(Map.Entry me : audioProperties){
System.out.println("key = "+me.getKey());
System.out.println("value ="+me.getValue());}       
bais = new ByteArrayInputStream(audioBuffer);
AudioInputStream ais = new AudioInputStream(bais, new AudioFormat(8000,8,2,true,true), 2);
AudioSystem.write(ais, AudioFileFormat.Type.WAVE,new File("testtest.wav"));

//*************************************************************************************
audioFormat属性结果都为空。这些空值是否给出了问题?因此,在服务器上创建wave文件时,我再次尝试手动设置属性。但即使这样,wav文件也无法播放

我也尝试了很多在这个网站上已经提到的方法,但不知怎么的,它们都不起作用。我确信我遗漏了什么,但我无法准确指出问题所在

如果你们能指出如何从ServletInputStream转换为wav,这将非常有帮助

我知道代码很糟糕,因为我已经经历了一段时间的反复试验。但如果需要的话,我会给出更多的细节。
为我的笨拙道歉,这是我的第一篇帖子

这不是从方法1复制流的方式。您有正确的代码来复制正好位于此上方的流:

int numofbytes = inputStream.available();           
byte[] buffer = new byte[numofbytes];
inputStream.read(buffer);

如果您的服务器只想获取数据并将其写入文件,那么您不需要使用任何音频API:只需将数据视为字节流即可


因此,在提到AudioInputStream之前的方法1部分应该足够了。

尽管选择的方法可能不是完美的解决方案,但由于时间限制,我采用了一种更简单的方法。使用java.util.zip,我只需将其压缩并发送到服务器,然后在文件解压缩时编写一个层。然后我删除了zip文件。似乎是一个不成熟的解决方案bcos最初的挑战是发送音频文件。现在,我正在承受压缩文件的开销,但是文件传输会相对更快。谢谢你们的帮助

谢谢回复,但我的问题是,我需要使用这些字节流在服务器中创建一个wav文件。虽然文件已创建,但无法播放。我猜要创建wav,我必须使用AudioSystem.write或等效的api。我可以简单地将字节写入一个文件并将其命名为.wav扩展名吗。。我认为那是行不通的。如果你们能用一个伪代码来帮我的话,这将对gr8有所帮助。@user902423-为什么你们认为我的答案与你们想要实现的目标无关?如果不能正确复制流,它将对您毫无用处。