java - 如何录制声音并将其设置为Java文件?

标签 java file audio audio-streaming microphone

我正在尝试此代码,但是在测试5和测试9之后,该代码似乎在audioStream.write()处停止运行。

没事

AudioSystem.write(audioStream, AudioFileFormat.Type.WAVE, audioFile);

由程序执行。如何解决此问题,或者还有另一种方式来记录我的声音?
import javax.sound.sampled.*;
import java.io.*;

public class Mic{



    public static void main(String[] args){
        System.out.println("Sound test starting");

        try {
            AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100, 16, 2, 4, 44100, false);

            DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
            if(!AudioSystem.isLineSupported(info))
            {
                System.err.println("Line is not supported");
            }

            final TargetDataLine targetLine = (TargetDataLine)AudioSystem.getLine(info); 
            targetLine.open();

            System.out.println("Recording voice");
            targetLine.start();

            Thread thread = new Thread();

            {
                //@Override public void run();

                {

                    AudioInputStream audioStream = new AudioInputStream(targetLine);
                    File audioFile = new File("Recording.wav");
                    System.out.println("test5");
                    try { System.out.println("test9");
                        AudioSystem.write(audioStream, AudioFileFormat.Type.WAVE, audioFile);
                        System.out.println("audio writing test");
                    }

                    catch(IOException e){
                        e.printStackTrace();
                    }
                    System.out.println("test6");
                    System.out.println("Recording Stopped");

                }
            };
            thread.start();
            Thread.sleep(5000);
            targetLine.stop();
            targetLine.close();

            System.out.println("Ended sound test");
        }
        catch(InterruptedException ie){
            ie.printStackTrace();
        }
        catch(LineUnavailableException e){
            e.printStackTrace();
        }

    }



}

最佳答案

可能发生两种情况:

  • write调用可能永远阻塞。
  • write调用可能引发一些未经检查的异常,该异常未报告。

  • 暂时更改此:
        catch (IOException e) {
               e.printStackTrace();
        }
    

    对此:
        catch (Throwable e) {
               e.printStackTrace();
        }
    

    并向我们​​显示现在获取输出的stacktrace(如果有)。

    还有另外两种可能性:

    您正在调用的write操作实际上是从audioStream到文件的副本:
  • 如果未正确设置源(audioStream),则实际上可能会阻止write从输入设备读取数据。
  • 您检查输出文件了吗?有没有写任何东西?可能是录制过程正在运行...

  • 无论哪种方式,我接下来要做的都是在调试器下运行它,并尝试弄清write调用在(显然)被阻止时正在做什么。

    关于java - 如何录制声音并将其设置为Java文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30825393/

    相关文章:

    java - Hibernate 无法创建唯一键约束

    java - 调整图像文件的大小

    c++: long long int 不会写入文件

    html - html5音频标签会占用资源吗

    java - thymeleaf 中 String 对象的 #strings.replace() 实用方法是否替换了提供的字符串中的所有匹配项?

    java - 构造函数总是必须是公共(public)的吗?

    c++ - 如何使用TagLib-C++从MP3文件读取XingHeaders,VBRIHeaders和sampleCount

    php - 将音频上传到服务器PHP android

    java - Ionic 4,Android Studio,Gradle,Java jdk或Cordova错误

    mysql - 从本地软件将数据导入远程 MySQL 的最佳文件格式