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:
Und hier noch der Code von meinem Server:
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
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