【问题标题】:Obtaining the wav file from ServletInputStream从 ServletInputStream 获取 wav 文件
【发布时间】:2011-08-23 14:22:45
【问题描述】:

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

使用 Java sound api,我能够捕获录音并将其保存为我的系统中的 wav 文件。然后为了将音频 wav 传递给服务器,我使用 Apache Commons HttpClient 向服务器发布请求。 (我正在使用 apache 提供的 InputstreamEntity 并将数据作为一个块发送)。

当我尝试在服务器上重新创建/检索 wav 文件时出现问题。我知道我必须使用 AudioSystem.write API 来创建 wav 文件(就像在我的系统上所做的那样)。但是我观察到的是,虽然文件已创建,但它无法播放(我正在使用 vlc 媒体播放器对其进行测试,仅供参考)。我在 Google 中搜索了示例代码并尝试实现它,但是一旦创建文件就无法播放它。

示例代码 sn-ps 表示我尝试过的方法:

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

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 属性全部为空。这些空值是否存在问题?因此,在服务器上创建波形文件时,我再次尝试手动设置属性。但即使那样 wav 文件也不会播放。

我也尝试了很多本网站上已经提到的方法,但不知何故它们不起作用。我确定我遗漏了一些东西,但我无法确定确切的问题。

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

P.S (1) 我知道代码很破旧,因为我已经经历了一段时间的反复试验。但如果需要,我将提供有关这些方法的更多详细信息。 2)为笨拙道歉,这恰好是我的第一篇文章..)

【问题讨论】:

    标签: java audio


    【解决方案1】:

    这不是您复制流的方式(来自方法 1)。你有正确的代码来复制上面的流。:

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

    【讨论】:

    • 感谢大家的回复,但我的问题是,我需要使用这些字节流在服务器中创建一个 wav 文件。虽然文件被创建,但它不播放。我想要创建 wav,我必须使用 AudioSystem.write 或等效的 api。我可以简单地将字节写入文件并使用 .wav 扩展名命名它吗?我认为这行不通。如果你们能用伪代码帮助我,那将是 gr8 的帮助..
    • @user902423 - 为什么你认为我的回答与你想要完成的事情无关?如果你不能正确复制流,它对你来说毫无用处。
    【解决方案2】:

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

    因此,方法 1 中提到 AudioInputStream 之前的部分就足够了。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-03-04
        • 1970-01-01
        • 2012-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多