java - 音频流 - 捕获和读取麦克风数据

标签 java audio audio-streaming microphone

我正在尝试从我的默认麦克风获取麦克风数据,并将其发送到我计算机上的另一个程序。发送有效,但我没有从麦克风读取任何数据,这是输出。无论我是否读取数据,输出都是相同的。

Output:
 This program: [B@ec7777
 Reciever program: b'\x00\x00\x00\x00\x00\x00\.....
import java.lang.*;
import java.util.*;

import java.net.SocketException;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.zip.DataFormatException;

import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.DatagramPacket;

import javax.sound.sampled.*;
import javax.sound.sampled.TargetDataLine;
import javax.sound.sampled.AudioSystem.*;
import java.io.ByteArrayOutputStream;

class mainclass {
    public static int buffer = 1472;
    public static byte[] data = new byte[buffer]; 
    private static AudioFormat format = new AudioFormat(10100.0f, 16, 1, true, true);
    

    public static void main(String[] args) throws SocketException, UnknownHostException,IOException, DataFormatException, InterruptedException, LineUnavailableException  {
        DatagramSocket socket = new DatagramSocket();
        InetAddress address = InetAddress.getByName("my.ipa.ddr.ess");

        TargetDataLine microphone = AudioSystem.getTargetDataLine(format);
        int numBytesRead;
        DatagramPacket packet;
        microphone.start();
        ByteArrayOutputStream out  = new ByteArrayOutputStream();

        for(int i=0;i<10;i++){
            numBytesRead = microphone.read(data, 0, data.length);
            out.write(data,0,numBytesRead);
            System.out.println(data);
            packet = new DatagramPacket(data, data.length, address, myport);
            socket.send(packet);
        }
        microphone.stop();
        microphone.close();
    }
}
如果我不抛出它,我会得到一个 LineUnavailableException。
aud2.java:115: error: unreported exception LineUnavailableException; must be caught or declared to be thrown 
   TargetDataLine microphone = AudioSystem.getTargetDataLine(format);
//                                                          ^ pointing at (

最佳答案

AudioFormat您列出的似乎不太可能有效。
44100 是更常见的采样率。此外,如果您使用 16 位编码并录制单声道,则每帧将有 2 个字节,而不是指定的 1 个字节。
我的猜测是,这与获得“线路不可用”异常一致。可能还有其他问题。但是有一个 AudioFormat Java 支持仍然是必要的第一步。
如果您需要使用较慢的采样率,11025 就在附近,您的系统可能支持它。另外,也许是 8000。也许是 16,000。但我还没有深入研究替代采样率。
教程 Using Files and Format Converters 中有关于测试是否支持音频格式的信息
对于我的笔记本电脑的麦克风(在这台笔记本电脑上使用默认设置时),我使用非常普通的设置,有时称为“CD 质量”。规范如下:

  • 编码:AudioFormat.Encoding.PCM_SIGNED
  • 采样率:44100
  • 以位为单位的样本大小:16
  • channel :2
  • 帧大小:4
  • 大端:假

  • 如果确定您有单声道,则 channel 为 1,帧大小为 2。

    关于java - 音频流 - 捕获和读取麦克风数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64159889/

    相关文章:

    asp.net - 使用 ASP.NET 实时流式传输音频

    android - 为了使我的应用成为视频播放器,我需要执行哪些具体的 list 条目?

    android - 在 android 媒体播放器上流式传输音频时出现异常,在 okhttp 缓冲上

    java - 嵌入式系统的Web服务器

    java运行包括来自终端的类路径

    html5 音频 api - frequencyBinCount 在 Safari 上不返回任何内容

    PHP 从 mySQL 数据库查询音频文件

    java - 将字符串 append 到 native Java 数组

    java - 具有不同类型对象的复合模式

    java - 在java中播放音频文件