Audio Server und Client

  • 7 Antworten
  • Letztes Antwortdatum
J

joniwa

Neues Mitglied
0
Hallo zusammen,
Ich habe vor kurzem einen Android Chat programmiert.Diesen Android Chat wollte ich nun erweitern indem man auch Audio Nachrichten versenden kann.
Dazu habe ich erstmal ein neues Programm erstellt.Dieses nimmt erst eine Nachricht auf und Sendet sie danach an meinen Server dort wird sie dann fast live abgespielt.Das hatte schon mal perfekt funktioniert allerdings nur im lokalen Netzwerk.Wenn ich die IP Adresse nun in meine Öffentliche IP von meinem Server änder funktioniert es einfach nicht.Ich habe keine Idee mehr woran das liegen könnte.Den Port hab ich natürlich freigeschalten.
Hier der Code von meinem Client:
Code:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;

public class MainActivity extends Activity {
    private static String TAG = "AudioClient";
    private static final String SERVER = "elektra.synology.me";
    private static final int PORT = 5555;
    private static final int RECORDING_RATE = 44100;
    private static final int CHANNEL = AudioFormat.CHANNEL_IN_MONO;
    private static final int FORMAT = AudioFormat.ENCODING_PCM_16BIT;
    private Button sendAudioButton;
    private AudioRecord recorder;
    private static int BUFFER_SIZE = AudioRecord.getMinBufferSize(
            RECORDING_RATE, CHANNEL, FORMAT);

    private boolean currentlySendingAudio = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.i(TAG, "Creating the Audio Client with minimum buffer of "
                + BUFFER_SIZE + " bytes");

   
    
        sendAudioButton = (Button) findViewById(R.id.btnStart);
        sendAudioButton.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()) {

                case MotionEvent.ACTION_DOWN:
                    startStreamingAudio();
                    break;

                case MotionEvent.ACTION_UP:
//                    stopStreamingAudio();
                    break;
                }

                return false;
            }
        });
    }



    private void startStreamingAudio() {

        Log.i(TAG, "Starting the audio stream");
        currentlySendingAudio = true;
        startStreaming();
    }

    private void stopStreamingAudio() {

        Log.i(TAG, "Stopping the audio stream");
        currentlySendingAudio = false;
        recorder.release();
    }

    private void startStreaming() {

        Log.i(TAG, "Starting the background thread to stream the audio data");

        Thread streamThread = new Thread(new Runnable() {

            @Override
            public void run() {
                try {

                    Log.d(TAG, "Creating the datagram socket");
                    DatagramSocket socket = new DatagramSocket();

                    Log.d(TAG, "Creating the buffer of size " + BUFFER_SIZE);
                    byte[] buffer = new byte[BUFFER_SIZE];

                    Log.d(TAG, "Connecting to " + SERVER + ":" + PORT);
                    final InetAddress serverAddress = InetAddress
                            .getByName(SERVER);
                    Log.d(TAG, "Connected to " + SERVER + ":" + PORT + "inetaddress" + serverAddress);

                    Log.d(TAG, "Creating the reuseable DatagramPacket");
                    DatagramPacket packet;

                    Log.d(TAG, "Creating the AudioRecord");
                    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                            RECORDING_RATE, CHANNEL, FORMAT, BUFFER_SIZE * 10);

                    recorder.startRecording();
                    Log.d(TAG, "AudioRecord recording...");
                

                    while (currentlySendingAudio == true) {

                        int read = recorder.read(buffer, 0, buffer.length);

                    
                        packet = new DatagramPacket(buffer, read,
                                serverAddress, PORT);
                    
                    

                        socket.send(packet);
                    }

                    Log.d(TAG, "AudioRecord finished recording");

                } catch (Exception e) {
                    Log.e(TAG, "Exception: " + e);
                    Log.d(TAG, "fehler");
                }
            }
        });

        streamThread.start();
    }
}

Und hier noch der Code von meinem Server:


Code:
import java.io.ByteArrayInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

import javax.jws.Oneway;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.SourceDataLine;


class Server {

AudioInputStream audioInputStream;
static AudioInputStream ais;
static AudioFormat format;
static boolean status = true;
static int port = 5555;
static int sampleRate = 44100;

static DataLine.Info dataLineInfo;
static SourceDataLine sourceDataLine;

public static void main(String args[]) throws Exception {

    @SuppressWarnings("resource")
    DatagramSocket serverSocket = new DatagramSocket(port);



    byte[] receiveData = new byte[4096];

    format = new AudioFormat(sampleRate, 16, 1, true, false);
    dataLineInfo = new DataLine.Info(SourceDataLine.class, format);
    sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
    sourceDataLine.open(format);
    sourceDataLine.start();
    System.out.println("Server gestartet");

    FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
    volumeControl.setValue(1.00f);

    DatagramPacket receivePacket = new DatagramPacket(receiveData,
            receiveData.length);
    ByteArrayInputStream baiss = new ByteArrayInputStream(
            receivePacket.getData());
    while (status == true) {
        serverSocket.receive(receivePacket);
        ais = new AudioInputStream(baiss, format, receivePacket.getLength());
    
   
    
        toSpeaker(receivePacket.getData());
    
    }
    sourceDataLine.drain();
    sourceDataLine.close();
}

public static void toSpeaker(byte soundbytes[]) {
    try {
        sourceDataLine.write(soundbytes, 0, soundbytes.length);
    } catch (Exception e) {
        System.out.println("Not working in speakers...");
        e.printStackTrace();
    }
}
}



Habt ihr einen Fehler im Code gefunden oder habt ihr eine Idee woran es liegen könnte?
Wäre für jede Hilfe dankbar.

In der LogCat kommt kein Fehler

Joniwa
 
Hat den keiner eine Idee woran das liegen könnte?
 
Versuch den Server mal ein und wieder auszuschalten :p

haha ne aber schonmal die Ports etwas höher gelegt? vllt 23456?

Und was genau funktioniert dann cniht: Kommt ncihts an? Schreib mal eine Routine wo der Server dir etwas zurückschickt mit allen Infos : angekommen...abgespielt...zurückgewiesen etc. pp.
also-> hunt the bug ;)
 
  • Danke
Reaktionen: joniwa
Danke Jaiel für die Antwort.
Den Server aus und wieder an geschaltet hab ich jetzt gefühlte 100 mal :)

Leider hilft es nichts wenn ich den Port höher lege.
Wenn ich einen String zum Server schicke kommt er dort ohne Probleme an und kann auch wieder zurück geschickt werden. Mein Problem ist das ich über meine öffentliche IP aus irgend einem Grund die Audio Datei nicht verschicken kann. Im Lokalen Netzwerk habe ich damit keine Probleme.
Vllt braucht man dazu eine extra Permission hättest du eine Idee welche?
Ich dachte erst das es etwas mit der Firewall zu tun hat aber da ich die Firewall jetzt ausgemacht habe und es immer noch nicht geht muss das Problem wo anders liegen.

Ich habe jetzt mal meinen Code mit vielen Ausgaben versehen und bin aber immer noch nicht schlauer.
Mein Smartphone behauptet die Audio Nachricht zu versenden und mein Server sagt das nichts ankommt. Die frage ist jetzt wo verschwindet die Nachricht?
Hat jemand eine Idee wie man genauer nachverfolgen kann was passiert?
 
Ok Alles klar.

Versuch mal die Sample Rate von 44,1kHz auf 16 oder 8 kHz zu legen vllt ist das einfach eine zu hohe SampleRate beim versenden :)
 
Nein leider hilft es nicht es kommt immer noch nichts an außer wenn ich meine lokale IP angebe.
Vielleicht liegt es ja an meinem Client Code und das Smartphone versendet gar nichts aus irgend einem Grund. Entdeckst du etwas in meinem Client Code was nur im Lokalen Netzwerk geht?
 
Hast du den Port auch am Router korrekt weitergeleitet? (Port Forwarding, Virtual Server, oder wie das sonst bei deinem router heißt)
 
Ja hab ich gemacht.Ich denke sonst würde die Textnachricht auch nicht bei mir ankommen.
Habe es immer noch herausgefunden wo das Problem liegt und auch nicht nach weiterem suchen im Internet also wenn mir jemand noch einen Tipp geben könnte wäre ich sehr dankbar.
 
Zurück
Oben Unten