java - 为什么我无法收听录音文件内容

标签 java audio javasound

我正在使用 Java Sound API 通过麦克风录制音频。音频文件被录制并存储在“/root/RecFiles/”位置。但是当我尝试播放录制的音频文件时,录制的声音不会从耳机/扬声器中发出。

import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;

public class RecordingTest {
    static final long RECORD_TIME = 6000;

    File wavFile = new File("/root/RecFiles/RecordedFile.wav");

    AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;

    TargetDataLine line;

    AudioFormat getAudioFormat() {
        float sampleRate = 8000;
        int sampleSizeInBits = 16;
        int channels = 1;
        boolean signed = true;
        boolean be= true;
        AudioFormat format = new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, be);
        return format;
    }

    void start() {
        try {
            AudioFormat format = getAudioFormat();

            DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);

            if (!AudioSystem.isLineSupported(info)) {
                System.out.println("Line not supported");
                System.exit(0);
            }
            line = (TargetDataLine) AudioSystem.getTargetDataLine(format);

            line.open(format);
            line.start();

            System.out.println("Start capturing...");

            AudioInputStream ais = new AudioInputStream(line);

            System.out.println("Start recording");
            System.out.println("isline open : " + line.isOpen());
            System.out.println("isFileFOrmat support: " + AudioSystem.isFileTypeSupported(fileType));
            int recordResult = AudioSystem.write(ais, fileType, wavFile);
            System.out.println("writeResult : " + recordResult);
        } catch (LineUnavailableException ex) {
            ex.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    void finish() {
        line.stop();
        line.close();
        System.out.println("Finished");
    }

    public static void main(String[] args) {
        final RecordingTest recorder = new RecordingTest();
        Thread stopper = new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(RECORD_TIME);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
                recorder.finish();
            }
        });
        stopper.start();
        recorder.start();
    }
}

执行上述代码后,该位置的文件如下:

-rw-r--r--。 1 root root 78654 六月 11 10:47 RecordedFile.wav

操作系统:centos6

java版本:1.8

提前致谢。

最佳答案

问题很可能是您只完成了一次写入,因此仅存储了记录的裸露开头。返回值recordResult将显示记录的字节数。它与每秒 16000 字节的预期值相比如何? (8000 fps x 每帧 2 字节)

write 命令应该放置在某种循环中。使用 while 循环和一个 boolean 来指示何时停止是处理录音的常见方法。

关于java - 为什么我无法收听录音文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62330836/

相关文章:

java - 字节数组 : how to know exactly numbers of byte received

Java 应用程序后处理在 Eclipse Tomcat 中有效,但在本地 Tomcat 服务器上无效

java - Android - Eclipse : Syntax error on token "(", 此标记后应有表达式

node.js - Nodejs mp3 流式传输

java - 简单的静音问题?

java - 如何使用 spring 动态跟踪数据库更改?

javascript - 自定义HTML5音频控件不起作用

java - 清除Java应用程序的缓存

java - 退出时嗡嗡作响

java - 在 Java 中播放采样率 96Khz 及以上的音频