当前位置: 首页 > 知识库问答 >
问题:

Java:如何使用麦克风输入作为JavaFX媒体播放器的输入?

李敏学
2023-03-14

我想使用JavaFX媒体播放器实时播放麦克风输入(分析其频率)。问题是,MediaPlayer只接受字符串作为源。我知道如何将麦克风输入写入字节数组和文件。

使用字节数组作为MediaPlayer的源(对我来说)是不可能的。我尝试使用临时文件,但这会导致以下错误:

Exception in thread "JavaFX Application Thread" MediaException: MEDIA_UNSUPPORTED : Empty signature!

我想这是因为我使用一个文件作为输入,而我仍然在向其中写入新数据。我的完整代码到目前为止:

public class Music {

static AudioFormat format;
static DataLine.Info info;

public static void input(int i, int j, int pinState) {
    format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100, 16, 2, 4, 44100, false);

    try {
        info = new DataLine.Info(TargetDataLine.class, format);
        final TargetDataLine targetLine = (TargetDataLine) AudioSystem.getLine(info);
        targetLine.open();

        AudioInputStream audioStream = new AudioInputStream(targetLine);

        File temp = File.createTempFile("Input", ".wav");
        temp.deleteOnExit();

        Thread targetThread = new Thread() {
            public void run() {
                targetLine.start();
                try {
                    AudioSystem.write(audioStream, AudioFileFormat.Type.WAVE, temp);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };

        targetThread.start();

        Media media = new Media(temp.toURI().toURL().toString());
        MediaPlayer player = new MediaPlayer(media);
        player.setAudioSpectrumThreshold(-100);
        player.setMute(false);
        player.setAudioSpectrumListener(new AudioSpectrumListener() {
             @Override  
             public void spectrumDataUpdate(double timestamp, double duration, float[] magnitudes, float[] phases) {
                 if(Var.nodeController[i] == 3) { //testing if the targetLine should keep on capturing sound
                 } else {
                     targetLine.stop();
                     targetLine.close();
                     player.stop();
                 }
             }
        });
        player.play();
    } catch (LineUnavailableException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}    

}

我需要找到一个解决方案,将麦克风输入用作MediaPlayer输入,使用文件或字节数组或任何其他可能的解决方案。

共有1个答案

柳才良
2023-03-14

我将推测以下库可能会有所帮助。https://github.com/SzymonKatra/AudioAnalyzer

请注意,它使用了FFmpeg,它声称是:

一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频。

关键组件(根据我粗略的浏览)似乎是类FFTAnalyzer.java留档说它基于普林斯顿的FFT代码/算法

因此,基本计划(我相信)如下:

  1. 从targetdataline获取麦克风输入(字节流)

我不清楚到底需要多少图书馆。可能是因为您不处理视频或跨平台问题,所以只需要这个库中的一两个类。

 类似资料:
  • 我想直播Android麦克风,可以使用VLC播放器等听到。 Playstore主要提供IP摄像头应用,但这些应用是通过内部网络实现的。我想在互联网上播放流媒体。 可能吗? 我尝试了以下代码片段,但目前不起作用: 在VLC播放器前,我试着听(媒体)- 还有别的办法吗?

  • 问题内容: 我一直在尝试使用android模拟器上的语音识别来做某事。 最终安装了市场和Google语音搜索应用程序后,我已经非常接近使仿真器能够执行我想要的操作了- 可以识别我的语音。首先,我需要使仿真器能够记录音频,或者至少认为存在麦克风。 我相信adb曾经有-mic选项-但是我认为它不再存在。 有没有人做过,还是有人可以阐明它。 问题答案: 您看过本教程吗?看到评论: 你们还不能在模拟器中录

  • 问题内容: 我有一个应用程序可以点击麦克风,还可以根据麦克风输入播放声音(不必同时通过tho)。下面的代码有效。但是一个问题是输出在小型顶部扬声器而不是底部真实扬声器上播放。我可以通过 在播放器开始播放之前 将3行放在下面来奇怪地解决此问题,然后我可以听到扬声器上的声音。 但是,麦克风停止收听 !即使在播放器停止播放之后。基本上麦克风不喜欢 .defaultToSpeaker 任何想法? 这里也记

  • 问题内容: 我正在寻找一种将文件中的音频数据馈送到麦克风的方法,因此,当第三方应用程序(例如 arecord 或Chromium的“按语音搜索”功能)使用麦克风进行音频输入时,它们会从文件中接收音频数据代替。 这是我的情况 :我编写的一个应用程序记录了来自麦克风的音频数据(使用ALSA)并将其保存到文件(audioFile0.raw)中。在将来的某个未知时间点,某些未知的第三方应用程序(例如,我没

  • 我正在编写一个核心Java应用程序(JDK 11),它应该录制音频和视频。经过广泛的试验 然而,录制高质量的音频仍然是一个问题。我设法将录音作为短[]样本并对其进行编码,但由于某种原因,它们被TargetDataLine在振幅127处切断。我可以通过简单地将它们乘以一个因子来增加它们的编码,但是超过127的任何记录细节都会被噪声丢失。也就是说,我可以插入麦克风,并在事实发生后将其放大(大声或正常的

  • 这可能不是一个可以接受的问题,但我现在非常绝望。 我需要一个同步java媒体播放器与快速寻找和平衡修改。 脚本: 我有一个javaFX项目,我必须在循环中播放一个非常短(50-100毫秒)的媒体文件。问题是,在重新启动之前,我需要等待一些要求。 简而言之:播放声音- javafx提供了一个我修改过的媒体播放器。 如果有人能为我指出正确的方向(图书馆/我错过的东西),我将不胜感激 ps允许的java