Mikrofonaudio über Java Server an Webbrowser streamen

T

Twister21

Gast
Hallo,

ich möchte das Audio von einem an meinem Raspberry Pi angeschlossenen Mikrofon live über einen Java HTTP-Server an einen Webbrowser streamen, der auf diesen Server zugreift.

Dazu wäre es sicherlich sinnvoller das UDP-Protokoll zu nutzen, um die Datenübertragung schnell zu ermöglichen. Jedoch habe ich mich damit noch nicht wirklich auseinandergesetzt, weshalb mein derzeitiger Ansatz auf dem TCP-Protokoll basiert. Jedoch scheint der derzeitige Ansatz nicht wirklich sinnvoll zu sein.

Ich habe dazu folgende Klasse:
Code:
private Socket client;
private DataOutputStream output;
private TargetDataLine microphone;

public HTTPServer(Socket client, TargetDataLine microphone) {
    this.client = client;
    this.microphone = microphone;
}

public void run() {
    try {
        System.out.println("The Client " + client.getInetAddress() + ":" + client.getPort() + " is connected");
        output = new DataOutputStream(client.getOutputStream());

        sendResponse();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void sendResponse() throws Exception {
    String statusLine = "HTTP/1.1 200 OK\r\n";
    String serverDetails = "Server: HTTP-Server\r\n";
    String contentTypeLine = "Content-Type: audio/mpeg\r\n";
    String contentLengthLine = "Content-Length: " + microphone.getBufferSize() + "\r\n";

    output.writeBytes(statusLine);
    output.writeBytes(serverDetails);
    output.writeBytes(contentTypeLine);
    output.writeBytes(contentLengthLine);
    output.writeBytes("\r\n");

    int numBytesRead;
    int bufferSize = microphone.getBufferSize() / 5;
    bufferSize += 512;

    microphone.open();
    microphone.start();

    byte[] targetData = new byte[bufferSize];

    while (true) {
        numBytesRead = microphone.read(targetData, 0, targetData.length);

        if (numBytesRead == -1) break;
        output.write(targetData, 0, numBytesRead);
    }
}

Leider erscheint beim Aufrufen der URL zwar ein Element zum Abspielen einer Audio-Datei, jedoch kann der Play-Button nicht angeklickt werden. Edge zeigt zudem auch an, dass der Audiodateityp nicht unterstützt wird. Der Java-Server gibt in der Konsole "java.net.SocketException: Broken pipe" aus.

Wie kann ich weiter vorgehen bzw. muss ich meinen Ansatz überarbeiten?
 

JuKu

Top Contributor
Ich selbst habe noch nie Audios über HTTP streamen müssen, also kann ich es dir nicht genau sagen.
Aber ob das so funktioniert, wie du das gerade darstellst, ist für mich sehr fraglich.

Leider lässt es sich nicht ganz aus dem Code entnehmen, ob du einen Websocket oder eine Anfrage verwendest.
Meiner Meinung nach eine einfache HTTP Anfrage.
Auch ist die Content-Length nicht die Puffergröße, wenn ich mich nicht irre.

Und die Exception kommt vermutlich dadurch zustande, dass du immer nur schreibst, aber nie flushest. Und vermutlich schließt der Browser die Verbindung auch nach einem Timeout, wenn du nicht mit normalen Requests arbeitest. Ich glaube dieser ganze Ansatz funktioniert so nicht. Aber wie gesagt, ich habe das selbst noch nicht gemacht.
 
T

Twister21

Gast
Hallo,

ich habe auch großen Zweifel daran, ob es über diesen Ansatz überhaupt zu einer Lösung des Problems kommen kann. Ich denke, dass ich mir verschiedene Web Server für Java anschauen werden. Eventuell haben diese bereits eine Streaming-Lösung integriert.
 
T

Twister21

Gast
Hallo,

wie genau würdest du einen der angegebenen Streaming-Protokolle in Java implementieren? Ich würde am liebsten auf ein Webinterface über einen Webserver zugreifen können, der auf dem Raspberry Pi gehostet wird. Damit sollen dann neben dem Streamen des Mikrofonaudios auch noch weitere Funktionen zur Verfügung stehen. Dieses Problem ist aber derzeit meine einzige Schwierigkeit.
 

JuKu

Top Contributor
Wie gesagt, ich habe es selbst noch nie gemacht, kann dir da also nicht wirklich einen brauchbaren Tipp geben.
Aber vllt. weiß ja jemand anders Rat?
(@mrBrown ?)

Am besten suchst du dir irgendeine fertige Java Library, die das schon kann.
 
T

Twister21

Gast
Das Problem ist, dass ich nicht wirklich weiß, wo ich nach so einer Library suchen kann. Auf GitHub konnte ich noch nichts dieser Art finden.
 

JuKu

Top Contributor
Wie kommst du denn an die Daten des Mikrofons?
Erhälst du diese als Byte Stream? Oder welches Protokoll verwendet denn dein Mikrofon / die dazugehörige Api?
 
T

Twister21

Gast
Hier ist der entsprechende Abschnitt:

Code:
ServerSocket server = null;
        try {
            server = new ServerSocket(8888);
        } catch (IOException e) {
            e.printStackTrace();
        }
        AudioFormat format = getAudioFormat();
        DataLine.Info micInfo = new DataLine.Info(TargetDataLine.class, format);
        TargetDataLine mic = null;
        try {
            mic = (TargetDataLine) AudioSystem.getLine(micInfo);
        } catch (LineUnavailableException e) {
            e.printStackTrace();
        }
        System.out.println("TCPServer Waiting for client on port 8888");
        while (true) {
            Socket connected = null;
            try {
                connected = server.accept();
            } catch (IOException e) {
                e.printStackTrace();
            }
            new HTTPServer(connected, mic).start();
        }

public AudioFormat getAudioFormat(){
    float sampleRate = 48000.0F;
    int sampleSizeInBits = 16;
    int channels = 1;

    boolean signed = true;
    boolean bigEndian = false;

    return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian);
}
 
T

Twister21

Gast
Es liefert Daten, da ich so auch für meine Spracherkennung auf das Mikrofon zugreife. Dabei schicke ich die Daten aber direkt an den Google Server. Ich kann sie wahrscheinlich jedoch nicht direkt per HTTP streamen.
 

Manuel.R

Bekanntes Mitglied
Was ist denn mit den Standard-Protokollen für das Streamen:
RTP, RTSP(2.0), RTMP
Die Definition zu den Protokollen sagt nichts dazu aus, dass nur Videoformate damit übertragen werden können. Ob TCP oder UDP genutzt wird, ist bereits in den Streaming-Protokollen implementiert.

Gängie Audioformate für das Streaming sind:
MP3, AAC, Ogg Vorbis

Guck dir mal den GStreamer an: https://github.com/gstreamer-java
 
T

Twister21

Gast
Hallo,

danke für die Hilfe, aber ich werde nun erstmal Icecast in Verbindung mit Darkice nutzen, um mein Mikrofon zu streamen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Tabelle im Web über Listener aufrufen Netzwerkprogrammierung 1
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
B Zip Dateien über FTP laden Netzwerkprogrammierung 2
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
L Webbasierte Anwendung - Authentifizierung über LDAP/ActiveDirectory Netzwerkprogrammierung 5
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
T Broadcast-message über spez. Netzwerk-Schnittstelle Netzwerkprogrammierung 1
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
T VPN-Verbindung über Java Netzwerkprogrammierung 4
V Einfachen Javaserver über das Internet erreichbar machen Netzwerkprogrammierung 2
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
Thallius Java Application über ZScaler benutzer? Netzwerkprogrammierung 0
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
antonbracke Multiuser Software über XMPP Server Netzwerkprogrammierung 1
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
cezary Socket ServerSocket starten über GUIIm unterstehenden Code versuche Netzwerkprogrammierung 6
I ASCII über serielle Schnittstelle Netzwerkprogrammierung 1
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
L Mit Java über PHP in MySQL anmelden (Login script) Netzwerkprogrammierung 3
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
T Socket Methoden über Internet aufrufen Netzwerkprogrammierung 1
S Socket Kommunikation über Internet Netzwerkprogrammierung 1
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S Datei schreiben über Applet Netzwerkprogrammierung 8
G Klassen über Netzwerk kommunizieren lassen Netzwerkprogrammierung 6
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
A TCP über UDP Verbindung? Netzwerkprogrammierung 10
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Class über Netzwerk verschicken Netzwerkprogrammierung 2
D JNLP über Webstart funktioniert nicht... Netzwerkprogrammierung 2
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
A Computer über Internet verbinden Netzwerkprogrammierung 12
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
c_sidi90 ideale Lösung, Screen Capture über Netzwerk Netzwerkprogrammierung 3
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
C Verbindung zu einem Hostrechner über das Internet herstellen Netzwerkprogrammierung 15
M Map über Webservice übertragen Netzwerkprogrammierung 3
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
Z Socket Connection reset by peer nur per IP nicht über localhost Netzwerkprogrammierung 13
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
G Klassen über JMX per URLClassloader laden? Netzwerkprogrammierung 2
E Zwei PCs über das Internet miteinander verbinden? Netzwerkprogrammierung 3
E Socketverbindung über das Internet - Timeout? Netzwerkprogrammierung 28
M Socket Bilder über das Netzwerk übertragen Netzwerkprogrammierung 4
E Java über Socket ins Internet? Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5
M Socket JavaProg über einen Clienten steuern Netzwerkprogrammierung 5
M Mail über Exchange versenden Netzwerkprogrammierung 13
F C/S über HTTPS Netzwerkprogrammierung 2
D ...class.getResourceAsStream("/meine.properties") funktioniert nicht über RMI? Netzwerkprogrammierung 3
M ganymed-ssh2.har: ftp-Verbindung über ftp-Proxy Netzwerkprogrammierung 2
J Probleme bei RSA mit byte[] bei Versand über RMI Netzwerkprogrammierung 2
Z File über Socket lesen Netzwerkprogrammierung 3
A HTTP Binärdaten über PHP-Skript in Datenbank schreiben bzw auslesen Netzwerkprogrammierung 2
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
P FTP isFile() über FTP Netzwerkprogrammierung 3
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
N String als byte Array über Socket versenden Netzwerkprogrammierung 8
M Objekt über socket senden/empfangen Netzwerkprogrammierung 3
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12
A UCP Connection über Proxy möglich? Netzwerkprogrammierung 7
V Verbindung zweier Rechner über das Internet mit Sockets Netzwerkprogrammierung 8
F Char über Netzwerk senden Netzwerkprogrammierung 6
S HTTP Login mit CAS Authentisierung über SSL Netzwerkprogrammierung 2
C Befehle über ein GUI an Server senden Netzwerkprogrammierung 15
M Socket Datei über Socket versenden Netzwerkprogrammierung 5
I Objekte über das Netzwerk Netzwerkprogrammierung 5
M Google Translate über Java ansprechen? Netzwerkprogrammierung 13
F Socket ImageIcon über Socket --> Fehler Netzwerkprogrammierung 14
N Datenaustausch zwischen Java-GUI und PHP-Programm über SOAP Netzwerkprogrammierung 19
L RMI Informationen über die Clients herausfinden Netzwerkprogrammierung 5
R HTTP Problem bei Authentifizierung über (Http)UrlConnection Netzwerkprogrammierung 2
1 Kommunikation mit externem Programm über TCP Netzwerkprogrammierung 2
U Informationen über Netzwerkclients herausfinden Netzwerkprogrammierung 2
J Socket Erreichbarkeit eines Java Servers (Socket-Lösung) über das Internet Netzwerkprogrammierung 3
T E-Mail über javax.mail.Message Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben