Audio: Abspielen eines OutputStreams

Status
Nicht offen für weitere Antworten.

xysawq

Bekanntes Mitglied
Hallo, ich glaube ich habe direkt 2 Probleme:

Ich möchte Pakete empfangen deren Inhalte in einem Byte-Array abgespeichert werden (bei jedem Empfang wird das Array überschrieben). Dieses Array wird nach dem Empfang an einem Stream angehängt, der dauerhaft lokal abgespielt wird.

1. Problem: Ich kann mit einem BufferedOutputStream Byte-Arrays zu einem Stream hinzufügen, diesen aber nicht abspielen.

2. Problem: Ich kann einen InputStream abspielen, aber keine Byte-Arrays hinzufügen.

Wenn jemand eine noch bessere Lösung hat als die mit den Streams hätte ich nichts dagegen. Und vorher eine Datei draus machen oder so hatte ich nicht vor, weil ich wenig Delay zwischen Empfang und Abspielen haben möchte.


Falls noch Infos fehlen bitte fragen. Code poste ich mal nicht, da es glaube ich sehr sinnfrei ist zu zeigen wie ein Byte-Array gemacht wird oder wie man einen Stream nicht benutzen kann.


Vielen Dank im Voraus.
 
So, da mir hier ja niemand helfen wollte musste ich den ganzen Tag googlen und hab viel Zeit für ein paar Zeilen Code verbraten.

Trotzdem bin ich so nett und gebe mal den Code bekannt, der, ganz ohne Stream, die empfangenen Daten, die in einem Byte-Array gespeichert werden abspielen kann.


Zuerst einmal vom Empfänger der Pakete:

Variablen:
Code:
private int LENGTH = 65535;
private byte[] buffer = new byte[LENGTH];
private byte[] data = null;
private DatagramPacket RtpPacket = new DatagramPacket(buffer, LENGTH);
private DatagramSocket dataSocket = null;

Empfang:
Code:
dataSocket.receive(RtpPacket);

//12 ist die RTP-Headergröße bei mir
data = new byte[RtpPacket.getLength()-12];

for(int i=0; i<(RtpPacket.getLength()-12); i++)
{
	data[i] = buffer[i+12];
}

//gibt dem MediaPlayer bescheid, dass neue Daten im Array data angekommen sind
newData();


Und der eigentliche Player:
Code:
	private class MediaPlayer extends Thread
	{
		private boolean play = true;
		private boolean run = false;
		private boolean init = false;
		private boolean newData = false;
		
		private SourceDataLine line = null;
		private DataLine.Info info = new DataLine.Info(SourceDataLine.class, getAudioFormat());
				
		public void run()
		{
			while(play)
			{
				if(!init && newData)
				{
					try
					{				
						line = (SourceDataLine) AudioSystem.getLine(info);
						line.open(getAudioFormat());				
					}
					catch (NotRealizedError e)
					{
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					catch (LineUnavailableException e)
					{
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					init = true;
				}
				
				
				if(newData)
				{
					if(!run)
					{
						line.start();
						run = true;
					}
					line.write(data, 0, data.length);
					
					newData = false;					
				}
				
				
				
			}
		}
		
		public void stopPlaying()
		{
			play = false;
		}
		
		public void newData()
		{
			newData = true;
		}
		
		private AudioFormat getAudioFormat()
		{
			AudioFormat.Encoding encoding = AudioFormat.Encoding.PCM_UNSIGNED;
			float sampleRate = 16000.0F;
			int sampleSizeInBits = 8;
			int channels = 1;
			int frameSize = 1;
			int frameRate = 16000;
			boolean bigEndian = false;
			
//			float sampleRate = 8000.0F;
//			int sampleSizeInBits = 8;
//			int channels = 1;
//			int frameSize = 1;
//			int frameRate = 8000;
//			boolean bigEndian = false;
			
			return new AudioFormat(encoding,
								   sampleRate,
								   sampleSizeInBits,
								   channels,
								   frameSize,
								   frameRate,
								   bigEndian);
		}
	}


Wenn es jemand gebrauchen kann soll er es nehmen, bei mir klappts wunderbar 😉.
 
xysawq hat gesagt.:
So, da mir hier ja niemand helfen wollte

Du hast dir hier ein sehr spezielles Thema ausgesucht. Evtl. KONNTE dir niemand helfen!? Zudem ich auch beobachten konnte, dass wir hier für manche Themen keine wirklichen Spezialisten haben (u. a. Audio 🙁 ).

xysawq hat gesagt.:
musste ich den ganzen Tag googlen

Das sollte generell deine erste Anlaufstation sein - selbst auf die Suche nach einer Lösung machen. Wenn dir hier jemand geholfen hätte, hätte er vermutlich auch den ganzen Tag googeln müssen ... und du würdest auf der faulen Haut liegen, findst das nicht ein bisschen unfair 😉 ?

xysawq hat gesagt.:
und hab viel Zeit für ein paar Zeilen Code verbraten.

Ein sehr schönes Beispiel, dass man keinen Preis für eine Codezeile verallgemeinern kann 🙂 . Manchmal muss man sich eben ein bisschen mehr anstrengen um an die Lösung zu kommen. Dabei ist es dann umso schöner, wenn es letztendlich funktioniert 🙂 .

xysawq hat gesagt.:

So funktionieren nunmal Foren - jeder trägt das bei, was er kann. Wenn alle nur fordern, fordern und nochmal fordern würden, ohne selbst etwas beizutragen, könnten wir hier dicht machen ...

xysawq hat gesagt.:
bin ich so nett und gebe mal den Code bekannt

Ich benötige es zwar nicht, aber dankeschön im Namen der User, die es mal gebrauchen können 🙂 .

Thread abhaken nicht vergessen!
 
xysawq hat folgendes geschrieben::
musste ich den ganzen Tag googlen


Das sollte generell deine erste Anlaufstation sein - selbst auf die Suche nach einer Lösung machen. Wenn dir hier jemand geholfen hätte, hätte er vermutlich auch den ganzen Tag googeln müssen ... und du würdest auf der faulen Haut liegen, findst das nicht ein bisschen unfair 😉?

Und jetzt rate mal, was ich die Tage davor gemacht habe 😉


xysawq hat folgendes geschrieben::
Trotzdem


So funktionieren nunmal Foren - jeder trägt das bei, was er kann. Wenn alle nur fordern, fordern und nochmal fordern würden, ohne selbst etwas beizutragen, könnten wir hier dicht machen ...

Leider sehe ich oft genug abgehakte Threads wo nur drunter steht "ok, habs selber hinbekommen"... deswegen ein 'vorlautes' Trotzdem.


xysawq hat folgendes geschrieben::
bin ich so nett und gebe mal den Code bekannt


Ich benötige es zwar nicht, aber dankeschön im Namen der User, die es mal gebrauchen können 🙂.

Bitte, und auch bitte an die, die sich freuen nicht tagelang googlen zu müssen ^^.
Und merkt euch, wenn ihr selber die Lösung habt, behaltet dieses 'tolle Geheimnis' nicht für euch, sondern zeigt es anderen die sich auch so quälen wie ihr 😉.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben