32Bit float Audio aufnehmen

Hough

Mitglied
Hallo,

es geht darum, von einem angeschlossenen Audiointerface die Audiodaten (Samples) auszulesen und weiterzuverarbeiten. Grundsätzlich sieht Java die Möglichkeit vor, mit 32bit-float-kodierten Audiodaten umzugehen. Entsprechendes Encoding ist im AudioFormat mit der Konstante PCM_FLOAT einstellbar.

Wenn ich nun ein Audiointerface, welches 32bit Float liefern kann, an den Rechner anschließe, wird dieses auch vom Rechner als solches erkannt, und Audioprogramme können 32bit float-Audiodaten vom Interface holen (getestet mit Logic Pro und Audacity).

Java scheint an dieser Stelle Schwierigkeiten zu haben: 24bit Integer ist kein Problem, 32bit Float jedoch wird nicht unterstützt: Der Versuch, eine TargetDataLine mit entsprechendem 32bit-Audioformat zu öffnen/zu starten, wirft dann folglich auch eine LineUnavailableException (sonstige Parameter wie Sample-Rate und Kanalanzahl sind korrekt).
Ich habe es unter Linux und MacOS probiert, mit JRE 8, 13 und 17.

Gibt es evtl. externe Bibliotheken, die solche Audiointerfaces unterstützen?
Danke für alle Tipps!
 

Hough

Mitglied
Hier noch ein SKB (ausprobieren ergibt freilich nur Sinn, wenn man ein entsprechendes Audiointerface hat).



Java:
import java.util.stream.Stream;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.TargetDataLine;

public class SKB {

    public static void main(String [] args) throws Exception {
        
          Mixer audioInterface = Stream.of(AudioSystem.getMixerInfo())
           .filter(info -> info.getDescription().toLowerCase().contains("zoom f6"))
           .filter(info -> info.getDescription().startsWith("Direct"))
           .findFirst()
           .map(info -> AudioSystem.getMixer(info))
           .orElseThrow(() -> new Exception("Audio interface not found"));

          AudioFormat Float32 = new AudioFormat(Encoding.PCM_FLOAT,  44100f, 32, 6, 24, 44100f, false);
          AudioFormat Int24   = new AudioFormat(Encoding.PCM_SIGNED, 44100f, 24, 6, 18, 44100f, false);
                  
          
          DataLine.Info lineInfo = new DataLine.Info(TargetDataLine.class, Float32); // Verwendung von Int24
          TargetDataLine tdl = (TargetDataLine) audioInterface.getLine(lineInfo);        // führt hier nicht zu einer Exception, Float32 schon
          
          tdl.open();
          tdl.start();
          
          tdl.stop();
          
          tdl.close();
          audioInterface.close();
    }
}
 

Hough

Mitglied
Wird wohl auf die Benutzung von ffmpeg hinauslaufen:
Java:
import java.io.IOException;
import java.io.InputStream;

public class SKB2 {

    public static void main(String [] args) throws IOException {

        // ffmpeg-Aufruf unter MacOS
        String [] command = new String[] {
                "/Users/xxxx/bin/ffmpeg",
                "-nostdin",
                "-f", "avfoundation",
                "-i", ":ZOOM F6 Audio",
                "-c:a", "pcm_f32le",
                "-f", "f32le",
                "-"};


        Process exec = Runtime.getRuntime().exec(command);

        InputStream input = exec.getInputStream();

        byte [] buffer = new byte[6*32/8*1024];
        
        long t0 = System.currentTimeMillis();
        
        int read;

        while ((read = input.read(buffer)) != -1) {
            // Weiterverarbeitung der Rohdaten

            long t1 = System.currentTimeMillis();
            if (t1-t0 > 5000) break;
        }
        
        input.close();
    }

}
 

Ähnliche Java Themen


Oben