Mehrere Audioclips gleichzeitig wiedergeben

Status
Nicht offen für weitere Antworten.

Nerowinger

Mitglied
Kann keine 2 Audioclips gleichzeitig wiedergeben. Zwei Clips sollen zeitversetzt gestartet werden, aber der erste Clip ist so lang, dass der 2. erst garnicht drankommt.

Die Clips sollen in einer richtigen Java-Applikation, nicht in einem Applet wiedergegeben werden.


Brauche dringend Hilfe.


Gruß
Nerowinger
 
Hab jetzt die Audioclips jeweils in einen Thread gepackt und die Threads nacheinander laufen lassen. Das Problem ist aber immer noch dasselbe, obwohl die Clips alle in verschiedenen Threads laufen, wird der 2. Sound gar nicht wiedergegeben, solange der alte noch läuft. Er kommt auch nicht später. Ich glaube das hat nichts mit den Threads zu tun, das Problem muss irgendwie in der Art liegen, wie Java Sounds wiedergibt.
Ein weiteres Problem ist nämlich, dass ich eine 35MB große Datei überhaupt nicht vernünftig wiedergeben kann, man hört nur Gestottere, nichts weiter.

Kann man nicht irgendwie auf das Java-Soundsystem zugreifen und irgendwelche Soundeinstellungen korrigieren?

Gruß Nerowinger
 
Ich weiß wirklich nicht, warum das nicht funktioniert. Laut Java-Buch sollte es möglich sein, mehrere Audioclips gleichzeitig abzuspielen.
 
Hi,
es ist möglich, man muss nur einen anderen Mixer nehmen der Standart-Mixer kann das nicht, aber die 'Java Sound Audio Engine' unterstützt das.


Schau dir das mal an:
Code:
public static void main(String[] args) throws Exception{
		final AudioInputStream a1=  AudioSystem.getAudioInputStream(new File("d:\\bunny_troubles.wav"));
		DataLine.Info lineInfo1 = new DataLine.Info( SourceDataLine.class, a1.getFormat());
		
		final AudioInputStream a2 = AudioSystem.getAudioInputStream(new File("d:\\borg.wav"));
		DataLine.Info lineInfo2 = new DataLine.Info( SourceDataLine.class, a2.getFormat());
		
		Mixer.Info[] mis = AudioSystem.getMixerInfo(); 
		for(int i = 0; i < mis.length; i++){
			
			Mixer.Info mi = mis[i];
			if(mi.getName().equals("Java Sound Audio Engine")){
				
				Mixer m = AudioSystem.getMixer(mi);
				final SourceDataLine sourceDataLine1 = (SourceDataLine )m.getLine(lineInfo1);
				final SourceDataLine sourceDataLine2 = (SourceDataLine )m.getLine(lineInfo2);
				
				
				Thread t1 = new Thread(){
					public void run(){
						byte[] buf = new byte[1024];
						
						try {
							int l;
							while((l = a1.read(buf))!= -1){
								
								sourceDataLine1.write(buf, 0, l);
							}
							while(sourceDataLine1.isActive()){
								try {
									Thread.sleep(100);
								} catch (InterruptedException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
							}
							sourceDataLine1.close();
							
							
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				};
				t1.setDaemon(true);
				
				Thread t2 = new Thread(){
					public void run(){
						byte[] buf = new byte[1024];
						
						try {
							int l;
							while((l = a2.read(buf))!= -1){
								
								sourceDataLine2.write(buf, 0, l);
							}
							while(sourceDataLine2.isActive()){
								try {
									Thread.sleep(100);
								} catch (InterruptedException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
							}
							sourceDataLine2.close();
							
							
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				};
				t2.setDaemon(true);
				
				
				sourceDataLine1.open();
				sourceDataLine1.start();
				t1.start();
				
				sourceDataLine2.open();
				sourceDataLine2.start();
				t2.start();
		
				t1.join();
				t2.join();
				
				break;
				
			}
		}
	}

Und wenn du Fragen hast, frag 🙂
 
Ich hab's noch mal mit dem Standart Mixer probiert, und dort ging es bei mir auch, hatte zwar gelesen dass es nicht gehen soll, aber vielleicht hängt das auch vom Treiber ab ???:L oder wir bauen einfach allesamt nur Mist :roll:
Aber kannst ja mal probieren:
Code:
public static void main(String[] args) throws Exception{
	      final AudioInputStream a1=  AudioSystem.getAudioInputStream(new File("d:\\bunny_troubles.wav"));
	      DataLine.Info lineInfo1 = new DataLine.Info( SourceDataLine.class, a1.getFormat());
	      
	      final AudioInputStream a2 = AudioSystem.getAudioInputStream(new File("d:\\borg.wav"));
	      DataLine.Info lineInfo2 = new DataLine.Info( SourceDataLine.class, a2.getFormat());
	      
	   
            final SourceDataLine sourceDataLine1 = (SourceDataLine )AudioSystem.getLine(lineInfo1);
            final SourceDataLine sourceDataLine2 = (SourceDataLine )AudioSystem.getLine(lineInfo2);
            
	            
            Thread t1 = new Thread(){
               public void run(){
                  byte[] buf = new byte[1024];
                  
                  try {
                     int l;
                     while((l = a1.read(buf))!= -1){
                        
                        sourceDataLine1.write(buf, 0, l);
                     }
                     while(sourceDataLine1.isActive()){
                        try {
                           Thread.sleep(100);
                        } catch (InterruptedException e) {
                           // TODO Auto-generated catch block
                           e.printStackTrace();
                        }
                     }
                     sourceDataLine1.close();
                     
                     
                  } catch (IOException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                  }
               }
            };
            t1.setDaemon(true);
            
            Thread t2 = new Thread(){
               public void run(){
                  byte[] buf = new byte[1024];
                  
                  try {
                     int l;
                     while((l = a2.read(buf))!= -1){
                        
                        sourceDataLine2.write(buf, 0, l);
                     }
                     while(sourceDataLine2.isActive()){
                        try {
                           Thread.sleep(100);
                        } catch (InterruptedException e) {
                           // TODO Auto-generated catch block
                           e.printStackTrace();
                        }
                     }
                     sourceDataLine2.close();
                     
                     
                  } catch (IOException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                  }
               }
            };
            t2.setDaemon(true);
            
            
            sourceDataLine1.open();
            sourceDataLine1.start();
            t1.start();
            
            sourceDataLine2.open();
            sourceDataLine2.start();
            t2.start();
			
            t1.join();
            t2.join();
	            
	
	   }
 
Danke erstmal

Hab das mal ausprobiert, aber es funktioniert nur mit bestimmten Wave-Dateien. Sobald ich eine bestimmte Wave-Datei durch eine andere ersetzte, hab ich wieder das alte Problem.

Gruß Nerowinger
 
Kannst mir die Datei ja mal per Mail an s.glasow(Anti_Spam)freenet.de schicken, dann guck ich mir das am Wochenende an. Außer die ist mehrer MB gross dann stell sie mal in's Netz, das Mail-Postfach bei freenet ist nämlich recht klein.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben