簡體   English   中英

如何在java中通過UDP發送音頻流?

[英]How to send audio stream via UDP in java?

我有一個問題,我已將MediaLocator設置為麥克風輸入,然后創建了播放器。 我需要從麥克風中獲取聲音,將其編碼為較低質量的流,並通過UDP將其作為數據報包發送。 這是代碼,我在網上找到了大部分代碼,並將其改編為我的應用:

public class AudioSender extends Thread {

private MediaLocator ml = new MediaLocator("javasound://44100");
private DatagramSocket socket;
private boolean transmitting;
private Player player;
TargetDataLine mic;
byte[] buffer;
private AudioFormat format;


private DatagramSocket datagramSocket(){
    try {
        return new DatagramSocket();
    } catch (SocketException ex) {
        return null;
    }
}

private void startMic() {
    try {
        format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 8000.0F, 16, 2, 4, 8000.0F, true);
        DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
        mic = (TargetDataLine) AudioSystem.getLine(info);
        mic.open(format);
        mic.start();
        buffer = new byte[1024];
    } catch (LineUnavailableException ex) {
        Logger.getLogger(AudioSender.class.getName()).log(Level.SEVERE, null, ex);
    }
}

private Player createPlayer() {
    try {
        return Manager.createRealizedPlayer(ml);
    } catch (IOException ex) {
        return null;
    } catch (NoPlayerException ex) {
        return null;
    } catch (CannotRealizeException ex) {
        return null;
    }
}

private void send() {
    try {
        mic.read(buffer, 0, 1024);
        DatagramPacket packet = 
            new DatagramPacket(
                buffer, buffer.length, InetAddress.getByName(Util.getRemoteIP()), 91);
        socket.send(packet);
    } catch (IOException ex) {
        Logger.getLogger(AudioSender.class.getName()).log(Level.SEVERE, null, ex);
    }
}

@Override
public void run() {
    player = createPlayer();
    player.start();
    socket = datagramSocket();
    transmitting = true;
    startMic();
    while (transmitting) {
        send();
    }  
}

public static void main(String[] args) {
    AudioSender as = new AudioSender();
    as.start();
}

}

而且只有當我運行接收器類時才會發生這種情況,我是從發送器類中聽到這個播放器的。 我似乎無法看到TargetDataLine和Player之間的聯系。 基本上,我需要獲得聲音形式播放器,並以某種方式將其轉換為bytes [],因此我可以將其作為數據報發送。 有任何想法嗎? 一切都是可以接受的,只要它有效:)

你不是這里的Player類,你想使用javax.sound.sampled中的類。 據我所知,播放器是播放聲音,而不是訪問其內容。

我沒有對此進行過測試,但是嘗試在要創建的TargetDataLine上使用.read來填充緩沖區,然后將緩沖區發送到其他主機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM