繁体   English   中英

Java Sound Api:将记录保存到磁盘后无法播放Wav文件

[英]Java Sound Api: Wav file not playing after saving recording on disk

我正在从麦克风录音,并将其另存为.wav文件到磁盘。

我不能用Media Player播放wav文件吗? 这正常吗?

AudioFormat format = new AudioFormat(
                AudioFormat.Encoding.PCM_SIGNED,
                44100.0F, 16, 2, 4, 44100.0F, false);
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); // format is an AudioFormat object

    // Obtain and open the line.
    try {
        targetLine = (TargetDataLine) AudioSystem.getLine(info);
        targetLine.open(format);
        targetLine.start();
        ByteArrayOutputStream out  = new ByteArrayOutputStream();
        int numBytesRead;
        byte[] data = new byte[targetLine.getBufferSize() / 5];

        targetLine.start();

        while (recording) {
           numBytesRead =  targetLine.read(data, 0, data.length);
           out.write(data, 0, numBytesRead);
           System.out.println(Arrays.toString(data));
        }     


        File fileOut = new File("C:\\audio\\audio6.wav");
        AudioInputStream ais = new AudioInputStream(targetLine);

        if (AudioSystem. isFileTypeSupported(AudioFileFormat.Type.WAVE,ais)) {
            AudioSystem.write(ais, AudioFileFormat.Type.WAVE, fileOut);
            System.out.println("writen");
        }   
        targetLine.stop();

        ais.close();

如果文件正常运行,则应该可以在媒体播放器中播放该文件。

我建议您获得免费音频编辑器Audacity(http://audacity.sourceforge.net/)的副本并查看数据。 首先检查文件中是否有一些数据,然后检查字节序,位深度和采样率是否正确(切换并查看是否有明显的噪音)。

如果这样不起作用,请尝试从文件而不是麦克风中读取一些样本,然后在到达另一端时检查它们是否相同。

如果您尚未找到它,那么这对于Java Audio http://www.jsresources.org/是一个很好的资源

您正在将记录的数据加载到ByteArrayOutputStream中,然后再对其执行任何操作(如Jon Skeet所指出的)。

当“ recording”布尔值为false时,您是否将TargetDataLine附加到AudioInputStream? 但是,如果记录为假,则我假设没有数据通过TDL传输。 数据是通过read()方法从TDL获取的,并且在while循环内。

我认为可以通过ByteArrayInputStream来创建AIS,该方法可以从用于从TDL收集数据的ByteArrayOutputStream进行。

因此,在记录布尔值变为假之后,请尝试通过以下方式制作AIS:

ByteArrayInputStream bais = new ByteArrayInputStream(out.toByteArray());
AudioInputStream ais = new AudioInputStream(bais, format, baos.size());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM