Stream encodierrn und decodieren mit JSpeex

Status
Nicht offen für weitere Antworten.
T

tuxedo

Gast
Hallo,
habe ne kleine Anwendung die nen AudioStream encodieren und decodieren soll mit jSpeex.

Encodieren und Decodieren tu ich folgendermaßen:

Code:
...
Pcm2SpeexAudioInputStream enc = new Pcm2SpeexAudioInputStream(2,10,in, audioFormat, AudioSystem.NOT_SPECIFIED);
...
Speex2PcmAudioInputStream dec = new Speex2PcmAudioInputStream(in, audioFormat, AudioSystem.NOT_SPECIFIED);
...

Klappt auch ohne Fehler. Doch beim abspielen, also beim lesen vom Stream passiert folgendes:

java.io.StreamCorruptedException: The given stream does not appear to be Ogg.
java.io.StreamCorruptedException: The given stream does not appear to be Ogg.
at org.xiph.speex.spi.Speex2PcmAudioInputStream.initialise(Unknown Source)
at org.xiph.speex.spi.Speex2PcmAudioInputStream.fill(Unknown Source)
at org.xiph.speex.spi.FilteredAudioInputStream.read(Unknown Source)
at javax.sound.sampled.AudioInputStream.read(Unknown Source)

Und ich hab kein Plan wasich falsch mache.
Was schon geklappt hat ist das lesen des Eingabestroms in ein byte[], dann mit jspeex in dieser Form encodieren und decodieren und schreiben in den Ausgabestrom. Das klappt. braucht allerdings auch recht viel CPU-Last wie ich festgestellt habe.

Deshalb wollt ich mal die oben gezeigte Variante testen ob das schneller und einfacher geht. Einfachr ja, ist ja nur je eine Zeile. Aber funktionieren tut's nicht.

Scheint fast so als ob der Stream irgendwie verstümmelt wird.
Weiß jemand weiter?

Gruß
Alex
 
T

tuxedo

Gast
Okay, bin ein Stück weiter. Ich depp hab das Ding zwei mal encodiert. Hab das jetzt aber korrigiert.
Jetzt kommt aber immernoch der Fehler:

java.io.StreamCorruptedException: Lost Ogg Sync
at org.xiph.speex.spi.Speex2PcmAudioInputStream.readOggPageHeader(Speex2PcmAudioInputStream.java:496)
at org.xiph.speex.spi.Speex2PcmAudioInputStream.fill(Speex2PcmAudioInputStream.java:283)
at org.xiph.speex.spi.FilteredAudioInputStream.read(FilteredAudioInputStream.java:369)
at javax.sound.sampled.AudioInputStream.read(Unknown Source)

Die entsprechende Codestelle in der Library die den Fehler wirft sieht so aus:

Code:
 if (!(new String(prebuf, prepos, 4).equals("OggS"))) {
    	  System.out.println(new String(prebuf, 0, 4));
        throw new StreamCorruptedException("Lost Ogg Sync");
      }
Den Sysout hab ich eingebaut. tatsächlich kommt da kein "OggS" dabei raus sondern lauter lustige Sonderzeichen.

Also muss irgendwas den Stream verfälschen. Any ideas ?

- Alex
 
T

tuxedo

Gast
Bin doch selbst drauf gekommen. Für alle die vielleicht das gleiche Problem mal haben sollten hier meine Lösung:

Ich encodiere den Stream den ich von Mikrofon bekomme und schreibe diesen auf einen Netzwerk-Socket:

Code:
Thread audioToSocket = new Thread(){
			@Override
			public void run() {
				super.run();
				
				int	nBytesRead = 0;
				OutputStream out = csst.getSendingStream();
				AudioInputStream in = audioProcessor.getMic().getStream();
				
				Pcm2SpeexAudioInputStream enc = new Pcm2SpeexAudioInputStream(2,5,in, audioFormat, AudioSystem.NOT_SPECIFIED);
								
				byte[] temp = new byte[ClientConfig.BUFFER];
				
				try {
					while (nBytesRead != -1) {
						
						nBytesRead = enc.read(data, 0, data.length);
						
//						temp = codec.filterForSending(data);
						temp=data;
							
						if (nBytesRead >= 0) {
							out.write(temp, 0, temp.length);
						}
					}
				} catch (IOException e)	{
					e.printStackTrace();
				}
			}
		};

Das temp-byte[] hatte ich anfangs benutzt um den Stream zu encodieren. Aber mittels Pcm2Speex... gehts ja noch einfacher.
Das Problem war nun folgendes:
Beim schreiben in den Socket-Out-Stream habe ich wie oben gezeigt die länge des temp-arrays komplett reingeschrieben. Das ist jedoch verkehrt. Beim lesen weiter oben wird die gelesene Menge in nbytesRead gemerkt. Und genau diese Länge muss ja auch geschrieben werden. Sonst kommt der Stream durcheinander.
Das komische ist jetzt nur:
Das "data" Array und das "temp" Array haben die gleiche Größe, nämlich ClientConfig.BUFFER.
Soweit ich das verstanden habe wird beim lesen mit read die volle Array-Länge gelesen. Also sollte die wirklich eingelesene Menge doch so groß sein wie die Array-Größe, oder nicht?

Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
KonradN SonarLint: Resources should be closed bei Stream<T>? Allgemeine Java-Themen 6
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
looparda Stream mit Sonderbehandlung des ersten Elements Allgemeine Java-Themen 17
R Java Stream: Ist es möglich, einen stream zusammenzufassen Allgemeine Java-Themen 6
S Mittelwert anhand eines Stream berechnen Allgemeine Java-Themen 5
H Stream in ArrayList umwandeln Allgemeine Java-Themen 2
M stream.Collectors Fehlermeldung Allgemeine Java-Themen 1
C TCP Server und BufferedReader Leerstring im Stream? Allgemeine Java-Themen 5
G Neues Objekt aus List<JsonObject> mit Stream Allgemeine Java-Themen 4
Y Liste in Stream Packen Allgemeine Java-Themen 1
N Java stream filtern. Allgemeine Java-Themen 19
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
N javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1] Allgemeine Java-Themen 3
N [stream-api] Parameter pro Typ zählen Allgemeine Java-Themen 1
J Stream-basierter Cache Allgemeine Java-Themen 4
D IP-Cam live stream speichern Allgemeine Java-Themen 9
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
D Klassen Zeit aus NMEA-Stream in SimpleDateFormat Allgemeine Java-Themen 17
J Stream-Murks! Allgemeine Java-Themen 18
T Problem mit gzip Stream und Ende der Datei Allgemeine Java-Themen 2
JAVATUX Java Programm mit ATI Stream Unterstützung Allgemeine Java-Themen 3
X Audio Internet-Stream Allgemeine Java-Themen 2
B Stream Verständnisproblem Allgemeine Java-Themen 2
P Mime Type aus Stream lesen Allgemeine Java-Themen 5
C Bit Stream Klasse Allgemeine Java-Themen 9
dayaftereh Serializable und Object In/Out Stream Allgemeine Java-Themen 2
M PCL Stream lesen und schreiben Allgemeine Java-Themen 6
musiKk Stream zum Lesen von Dateien mit seek und peek Allgemeine Java-Themen 2
J Problem mit Scanner-Stream Allgemeine Java-Themen 2
O Stream unvollständig Allgemeine Java-Themen 3
0 Stream/Datei an VLC übergeben und abspielen Allgemeine Java-Themen 10
B getImage() vom Stream oder File Allgemeine Java-Themen 3
N Werte Von C++ nach Java über den Stream möglich? Allgemeine Java-Themen 8
S Stream ReadLine() Allgemeine Frage Allgemeine Java-Themen 5
S Stream ohne Referenz kopieren ? Allgemeine Java-Themen 4
D FileInputStream bzw. BufferedInput Stream Puffern Allgemeine Java-Themen 6
G Live-Stream einer WebCam importieren Allgemeine Java-Themen 3
T Mehrere Dateien byteweise durch stream schieben Allgemeine Java-Themen 9
R Stream Byte für Byte durchgehen Allgemeine Java-Themen 5
O Input stream geht net Allgemeine Java-Themen 2
N Speichern von binären Dateien (Zip-Archiv) per Stream? Allgemeine Java-Themen 6
T Bit-Stream Allgemeine Java-Themen 12
R Stream für alle Dateiarten Allgemeine Java-Themen 9
thE_29 API für transport stream Allgemeine Java-Themen 2
M Output Stream / Protokoll does not support output Allgemeine Java-Themen 2
D GetResourceAsStream - Stream closed exception Allgemeine Java-Themen 5
G Umwandlung in Stream Allgemeine Java-Themen 5
J Output Stream Allgemeine Java-Themen 4
perlenfischer1984 HTML Code decodieren Allgemeine Java-Themen 2
H Java Methode zum HTML encodieren/decodieren Allgemeine Java-Themen 2
T ASCII decodieren Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben