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

问题描述

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

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,data.length);
            out.write(data,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个字节。

我的猜测是,这与获得“线路不可用”异常一致。可能还有其他问题。但是拥有Java支持的AudioFormat仍然是必要的第一步。

如果您需要使用较低的采样率,可以在附近使用11025,并且系统可能会支持。另外,也许是8000。也许是16,000。但是我还没有深入研究替代采样率。

教程Using Files and Format Converters

中提供了有关测试是否支持音频格式的信息。

对于笔记本电脑的麦克风(在使用此笔记本电脑的默认设置时),我使用非常普通的香草设置,有时也称为“ CD质量”。规格如下:

  • 编码:AudioFormat.Encoding.PCM_SIGNED
  • 采样率:44100
  • 样本大小(以位为单位):16
  • 渠道:2
  • 框架大小:4
  • 大端:错误

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