Toon posts:

[Java] Systemmixer capturen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi!

Voor een project moet ik zorgen dat het geluid dat uit mijn boxen komt opgenomen wordt.

Nu heb ik deze code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public void captureAudio() {
        final int capturetime = 10; //seconds
        try {
              //Get the format
              final AudioFormat format = getFormat();
              DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
              final TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
              line.open(format);
              line.start();
              System.out.println("Recording Started");
              Runnable runner = new Runnable() {
                  int bufferSize = (int)format.getSampleRate() * format.getFrameSize();
                  byte buffer[] = new byte[bufferSize];
             
                  public void run() {
                      out = new ByteArrayOutputStream();
                      running = true;
                      int counter = 0;
                      try {
                          while (running) {
                              counter++;
                              System.out.println(counter);
                              System.out.println("Volume: "+line.getLevel());
                              int count = line.read(buffer, 0, buffer.length);
                              if (count > 0) {
                                  out.write(buffer, 0, count);
                              }
                              if(counter >= capturetime) {
                                  running = false;
                                  System.out.println("Recording Stopped");
                              }
                          }
                          out.close();
                          } catch (IOException e) {
                            System.err.println("I/O problems: " + e);
                            System.exit(-1);
                          }
                    }
              };
              
              Thread captureThread = new Thread(runner);
              captureThread.start();
            } catch (LineUnavailableException e) {
              System.err.println("Line unavailable: " + e);
              System.exit(-2);
            }
    }


Maar op een of andere manier neemt hij dus een verkeerde mixer op. Waarschijnlijk dus de microfoon.

Weet iemand of het mogelijk om gewoon de system mixer te pakken te krijgen?
Met deze methode krijg ik wel een lijst met mixers:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
public void listMixers(boolean bPlayback) {
        final AudioFormat format = getFormat();
        System.out.println("Available Mixers: ");
        Mixer.Info[] aInfos = AudioSystem.getMixerInfo();
        for(int i=0; i < aInfos.length; i++) {
            Mixer mixer = AudioSystem.getMixer(aInfos[i]);
            Line.Info lineInfo = new Line.Info(bPlayback ? SourceDataLine.class : TargetDataLine.class);
            
            if(mixer.isLineSupported(lineInfo)) {
                System.out.println(mixer.getMixerInfo().getName());
            }
        }
    }


En daar staat dan ook mijn normale output mixer in maar dit zijn dus SourceDataLines, en wanneer ik die in mijn andere methode invoer geeft hij errors dat hij niet kan lezen. TagertDataLines werken wel maar dit is alleen voor invoer.