Java Sound registrare l'audio che si sta ascoltando

di Anonimizzato8686 il
5 risposte
Salve a tutti sono nuovo del forum e diciamo anche delle programmazione in java. Avrei un problema da sottoporvi. Vorrei catturare l'audio che in un qualsiasi momento si sta ascoltando sul proprio pc . Per registare da microfono sono riuscito usando questo codice preso in parte dalla rete e adattato un pochino per vedere il suo funzionamento
	public void run() {
		
		AudioFormat tmpAf = null;
		DataLine.Info info = null;
		
			tmpAf = SetFileAudio.setAudio();
			 info= new DataLine.Info(TargetDataLine.class,
					tmpAf);
			
				if (!AudioSystem.isLineSupported(info))
				{System.out.println("La linea " +info+ " non e'supportata.");
				}
				else
				try {
				target= (TargetDataLine) AudioSystem.getLine(info);
				
				target.open();
				} catch (LineUnavailableException ex) {
				System.out.println("Impossibile aprire la linea: "+ ex);
				return;
				}
		//esecuzione 
				ByteArrayOutputStream out = new ByteArrayOutputStream();
				int frameSizeInBytes= tmpAf.getFrameSize();
				int bufferSubLength= (int)(target.getBufferSize()/8); //frazione buffer
				int bufferLengthInBytes= bufferSubLength* frameSizeInBytes;
			
				byte[] data = new byte[bufferLengthInBytes];
				int numBytesRead;
				File f = new File("C:/Documents and Settings/UTENTE/Desktop/Università/prova.wav");
				try {
					f.createNewFile();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				target.start();
				int n=0;
				while (thread!=null) {
				if((numBytesRead= target.read(data, 0,
				bufferLengthInBytes)) ==-1) 
				{break;}
				
				out.write(data, 0, numBytesRead);
				for(Byte sel : data)
					System.out.print(sel+",");
				System.out.print("\n");
				
				
				byte audioBytes[] = out.toByteArray();
				ByteArrayInputStream bais= new ByteArrayInputStream(audioBytes);
				
				int frameSizeInByte= tmpAf.getFrameSize();
				long lenInFrames = audioBytes.length / frameSizeInByte;
				AudioInputStream ais= new AudioInputStream(bais, // InputStream contenente tutti i campioni
				tmpAf, // formato audio dello stream
				lenInFrames); // numero di frame dello stream
				
				System.out.println(saveAudioFile(ais,AudioSystem.getAudioFileTypes()[0],f));
				DataInputStream prova = new DataInputStream(ais);
				
				}
				target.stop();
				target.close();
			

	}
Il codice apre la targetline registra e poi salva tutto in un file nella mia cartella dell uni. Qui tutto funziona per il meglio ma io vorrei che invece di registare dal microfono registrasse direttamente da qeullo che viene mandato alle casse. Questa funzione c'è gia in windows infatti impostando da pannello di controllo Audio - Mixaggio Stereo il programma legge effettivamente quello che sento dalle casse . Io vorrei che questa scelta venisse fatta internamente al programma ... come faccio ? ho visto in giro che ci son programmi che ti permettono di fare cio .. è possibile in java cambiare il target o il sorce ( non ho capito bene XD ) del mixer? oppure bisogna usare un programma di terze parti ( che però nn ho idea di come poter usare nel mio prog XD ) ... grazie mille per l'ascolto spero che qualcuno abbia la soluzione anke perchè son giorni che leggo girandoci sempre attorno

5 Risposte

  • Ciao, hai già provato a dare un occhiata alla Java Sound API ?

    Nel caso ecco il link:

    http://www.oracle.com/technetwork/java/index-139508.html
    Grazie mille non sapevo che ci fosse è stato utile ma per altre cose... il problema rimane pare che java prenda come input quello del sistema... dite che non ce modo di toccare le opzioni dell'audio ?
  • Ciao,
    hai provato a controllare l ingresso che usa win nel pannello di controllo del audio?
  • Si gia guardato l'input è Mixaggio Stereo ... però non so come dire a java di usare quello
  • Possibile che non c'è nessun modo per fare quello che semplicemente faccio con il mouse?? ho girato mezzo web XD . Non esiste un modo manuale per settare l'audio di windows ? magari con un programma dos oppure anche con il C ? Sono aperto a tutte le soluzioni possibili XD
Devi accedere o registrarti per scrivere nel forum
5 risposte