java - 如何录制我的声音并将其制作成java文件?

Posted

技术标签:

【中文标题】java - 如何录制我的声音并将其制作成java文件?【英文标题】:How do I record my voice and make it a file in java? 【发布时间】:2015-06-14 02:19:44 【问题描述】:

我正在尝试这段代码,但在测试 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();
        

    




【问题讨论】:

如果编译运行,"System.out.println("audio writing test");"永远不会执行,但会执行打印测试“test5”和“Test9”。我对 audiosystem.write 方法做错了什么? audioFile.canWrite() 是否返回 true 这是我运行代码时发生的情况。 gyazo.com/8d5d2db0f061d30cac0411b17ccab3c1 @PatrickRoberts 是的,它返回 true 我唯一能想到的就是你在做一些不是线程安全的事情。 【参考方案1】:

可能会发生两种情况:

write 调用可能永远被阻塞。

write 调用可能会引发一些未经检查的异常,即未报告。

暂时改变这个:

    catch (IOException e) 
           e.printStackTrace();
    

到这里:

    catch (Throwable e) 
           e.printStackTrace();
    

并向我们展示现在得到输出的堆栈跟踪(如果有的话)。


这里还有另一种可能性:

您调用的write 操作实际上是从audioStream 到文件的副本:

如果源 (audioStream) 未正确设置,write 实际上可能会被阻止从您的输入设备读取数据。

您检查过输出文件吗?有没有写过什么?可能是录制过程正在运行...

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

【讨论】:

gyazo.com/36a9edec772ce76a47b6b8727041cf03 这是更改catch错误前后运行代码的截图。在这两种情况下,程序都会永远运行,我必须强制退出它。您知道为什么 write 调用会永远阻塞吗?

以上是关于java - 如何录制我的声音并将其制作成java文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何录制声音并将其从 Web 应用程序发送到服务器?

如何使用Javascript / PHP录制用户的声音? [关闭]

如何在 iOS 中录制声音?

如何使用 Java 从 USB 麦克风录制声音

急!!!!如何通过python制作一个简单的录音机,录制自己的声音采用8k采样,16位量化编码,观察其数值?

在 Java 中,如何录制发送到扬声器的声音输出? [复制]