Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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文件?_Java_File_Audio_Audio Streaming_Microphone - Fatal编程技术网

如何录制我的语音并使其成为java文件?

如何录制我的语音并使其成为java文件?,java,file,audio,audio-streaming,microphone,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 stati

我正在尝试这段代码,但在测试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
调用(显然)被阻止时在做什么。

如果编译并运行,“System.out.println(“音频写入测试”);”永远不会执行,但是打印测试“test5”和“Test9”会执行。audiosystem.write方法有何错误?是否
audioFile.canWrite()
返回
true
?这是我运行代码时发生的情况@PatrickRoberts是的,它返回的是真的。我能想到的唯一一件事是,你正在做一些线程不安全的事情。这是更改捕获错误前后运行代码的屏幕截图。这两种情况下,程序都会永远运行,我必须强制退出。你知道为什么写调用会永远阻塞吗?