Java Sound: WAVE Format17 einlesen.

HalloWelt_

Mitglied
Hallo.
Ich versuche im Moment WAVE Dateien in Java zu dekodieren, welche im Format: 17 (DIALOGIC OKI ADPCM) komprimiert sind einzulesen, da das Java-Sound nicht von sich aus kann. Ich habe nun einen eigenen Decoder geschrieben... Leider klappt der nicht. Das wird wohl daran liegen, dass das anderes ADPCM ist als ich dachte.
Im Internet konnte ich nichts dazu finden, außer fertige Codecs für zum Beispiel. Windows Media-Player...
Gibt es vielleicht eine fertige Java-Library (nicht native), welche das Format unterstützt? Oder hat jemand eine Beschreibung zu diesem Format?

Mein nicht funktionierender Decoder sieht so aus:
Java:
public class ADPCMInputStream extends FilterInputStream {

    private static final int[] step_table = {
        7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
        19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
        50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
        130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
        337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
        876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
        2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
        5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
        15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
    };
    private static final int index_table[] = {
        -1, -1, -1, -1, 2, 4, 6, 8,
        -1, -1, -1, -1, 2, 4, 6, 8
    };
    private byte buf = 0;
    private int buf_off = 0;

    public ADPCMInputStream(InputStream in) {
        super(in);
    }

    private int getBit() throws IOException {
        if (buf_off >= 8) {
            int r = super.read();
            if (r == -1) {
                throw new EOFException();
            }
            buf = (byte) r;
            buf_off = 0;
        }
        boolean b = (buf & 1 << buf_off) != 0;
        buf_off++;
        return b ? 1 : 0;
    }

    private int clip(int i, int min, int max) {
        if (i < min) {
            return min;
        }
        if (i > max) {
            return max;
        }
        return i;
    }

    private int bits = 1 << 3;      // 4 bits per sample
    private int j = bits - 1;
    private int k = bits >> 1;
    private int index = 0;
    private int predicted = 0;

    @Override
    public int read() {
        throw new UnsupportedOperationException("Can't read a single byte from this stream!");
    }
    
    @Override
    public int read(byte[] buf) throws IOException {
        return read(buf, 0, buf.length);
    }
    
    @Override
    public int read(byte[] buf, int off, int len) throws IOException {
        int avail = in.available();
        if (avail <= 1) {
            return -1;
        }
        int cnt = Math.min(avail * 2, len);
        cnt -= cnt % 2;
        
        for (int i = off; i < off + cnt;) {
            int nib = 0;
            for (int b = 0; b < 4; b++) {
                nib |= (getBit() << b);
            }
            int to = step_table[index];
            int i1 = 0;
            for (int i2 = k; i2 > 0; i2 >>= 1) {
                if ((nib & i2) != 0) {
                    i1 += to;
                }
                to >>= 1;
            }
            i1 += to;

            predicted += ((nib & bits) != 0 ? -i1 : i1);
            short sample = (short) clip(predicted, Short.MIN_VALUE, Short.MAX_VALUE);
            buf[i++] = (byte) (sample & 0xFF);
            buf[i++] = (byte) ((sample >> 8) & 0xFF);
            
            index += index_table[(nib & j)];
            index = clip(index, 0, 88);
        }
        return cnt;
    }
}

Danke!
 

HalloWelt_

Mitglied
Danke!
Mein halbwegs funktionierender Decoder ist jetzt fertig.
Das Problem ist nur, dass die Qualität, vor allem wenn man das Sample mit einem Faktor multipliziert, ziemlich schlecht ist.
Wenn ich das Sample nicht multipliziere, und die Lautstärke an der Stereo-Anlage aufdrehe, leidet die Qualität nicht...
Außerdem habe ich habe die Datei mal in einem "echten" Musik-Player abgespielt und der hörte sich irgendwie besser an. :|
Java:
public class ADPCMInputStream extends FilterInputStream {

    private static int[] stepTable = {
        16, 17, 19, 21, 23, 25, 28, 31,
        34, 37, 41, 45, 50, 55, 60, 66,
        73, 80, 88, 97, 107, 118, 130, 143,
        157, 173, 190, 209, 230, 253, 279, 307,
        337, 371, 408, 449, 494, 544, 598, 658,
        724, 796, 876, 963, 1060, 1166, 1282, 1411,
        1552
    };
    private static int[] adjusts = {
        -1, -1, -1, -1, 2, 4, 6, 8
    };
    // ---------------------------------------------
    private int stepIndex = 0;
    private int last = 0;

    public ADPCMInputStream(InputStream in) {
        super(in);
    }

    @Override
    public int read() {
        throw new UnsupportedOperationException("Can't read a single byte from this stream!");
    }

    @Override
    public int read(byte[] buf) throws IOException {
        return read(buf, 0, buf.length);
    }

    short decodeOKI(int code) {
        int E = (2 * (code & 0x7) + 1) * stepTable[stepIndex] / 8;
        int diff = (code & 0x08) != 0 ? -E : E;
        int samp = last + diff;
        // Clip the values to +/- 2^11 (supposed to be 12 bits)
        if (samp > 2048) {
            samp = 2048;
        }
        if (samp < -2048) {
            samp = -2048;
        }
        last = samp;
        stepIndex += adjusts[code & 0x07];
        if (stepIndex < 0) {
            stepIndex = 0;
        }
        if (stepIndex >= stepTable.length) {
            stepIndex = stepTable.length - 1;
        }
        // * 16 effectively converts 12-bit input to 16-bit output
        return (short) (samp * 16); // that doesn't worked well for me. try a smaller number...
    }

    @Override
    public int read(byte[] buf, int off, int len) throws IOException {
        int avail = in.available() * 4; // needed bytes: (1 input-byte) ~ (2 16-bit samples) ~ (4 output-bytes)
        if (avail < 4) {                // can just read 2-samples at once
            return -1;
        }

        int cnt = Math.min(avail, len);
        cnt -= cnt % 4;
        for (int i = off; i < off + cnt;) {
            int data = in.read();
            short sa = decodeOKI(((data >> 4) & 0x0f));
            short sb = decodeOKI(((data) & 0x0f));
            buf[i++] = (byte) (sa & 0xFF);
            buf[i++] = (byte) ((sa >> 8) & 0xFF);
            buf[i++] = (byte) (sb & 0xFF);
            buf[i++] = (byte) ((sb >> 8) & 0xFF);
        }
        return cnt;
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Sound in Java Spiel Spiele- und Multimedia-Programmierung 5
D Java sound pulseaudio Spiele- und Multimedia-Programmierung 0
C virtueller stereomix (java sound API) Spiele- und Multimedia-Programmierung 0
S Java Sound-API stagniert Spiele- und Multimedia-Programmierung 16
Kr0e Java Sound API - DataLine Spiele- und Multimedia-Programmierung 2
S Java Sound - Skipping in .mp3 Files und Bug (Bitte überprüfenl) Spiele- und Multimedia-Programmierung 14
C Java Sound API Clip.Close() Problem Spiele- und Multimedia-Programmierung 1
M Java Sound API : Zuordnung Port-Mixer zu Input-Mixer Spiele- und Multimedia-Programmierung 9
P Java Sound OutOfMemoryError Spiele- und Multimedia-Programmierung 2
T Java Sound Probleme Spiele- und Multimedia-Programmierung 8
Dragonfire Java Sound API - Lautstärke ändert sich nicht Spiele- und Multimedia-Programmierung 2
DEvent Java sound Bibliothek Spiele- und Multimedia-Programmierung 11
P Sound Datein mit JAVA zusammenstellen?! Spiele- und Multimedia-Programmierung 3
M Sound-Lösung für Java/JMF Spiele- und Multimedia-Programmierung 8
xFearofdarkness Feinde überlappen sich in Java Spiel Spiele- und Multimedia-Programmierung 3
A Minecraft Java Buch fehlermeldung Spiele- und Multimedia-Programmierung 61
yakazuqi Minecraft java.lang.Error: Watchdog Spiele- und Multimedia-Programmierung 3
L Fehler bei "Nochmal Spielen" (Java) Spiele- und Multimedia-Programmierung 1
N Minecraft Java Error Spiele- und Multimedia-Programmierung 6
M "Java Datei" Cannot be resolved to a variable Spiele- und Multimedia-Programmierung 2
1Spinne Minecraft Fabric Modding Java Error Spiele- und Multimedia-Programmierung 2
Joris Minecraft Minecraft Java Server Spiele- und Multimedia-Programmierung 6
Shanic Minecraft Minecraft Forge Server "Falsche Java Version" Spiele- und Multimedia-Programmierung 6
O Browser-basiertes online Pokerspiel mit Java Spiele- und Multimedia-Programmierung 1
M Spiel Mühle-Programmierung Java Spiele- und Multimedia-Programmierung 9
G VST-Plugins in Java verwenden Spiele- und Multimedia-Programmierung 0
P Audio Visualizer mit OpenGL in Java? Spiele- und Multimedia-Programmierung 4
P Snake Java Hilfe Spiele- und Multimedia-Programmierung 4
D Minecraft [Minecraft] Java Start Fehler (Core-Dump) Spiele- und Multimedia-Programmierung 1
T Welche packages aus der java api doku ist hilfreich zur Android Spieleprogrammierung Spiele- und Multimedia-Programmierung 2
A Programmieren eines Memorys mit Java (in Eclipse) Spiele- und Multimedia-Programmierung 5
C Java findet FluidSynth nicht Spiele- und Multimedia-Programmierung 2
I Java Andere Fenster in Borderless-Mode setzen Spiele- und Multimedia-Programmierung 16
leon_krys Java-Bußgeldrechner Spiele- und Multimedia-Programmierung 5
G [Java/KryoNet/LibGDX] Mutliplayer Packet Frage Spiele- und Multimedia-Programmierung 2
P Website mit Java Backend? Spiele- und Multimedia-Programmierung 1
D Java Bild bewegen funktioniert nicht Spiele- und Multimedia-Programmierung 8
J Fertigungstechnik.. PLS HALP.. Quellcode vom Text in java-Klasse speichern Spiele- und Multimedia-Programmierung 2
E Kalah Java Implementation Spiele- und Multimedia-Programmierung 1
G [Java] Vereinfachung von Boolean Abfragen Spiele- und Multimedia-Programmierung 3
G [LibGDX/Java] ArrayList Object Speicher Spiele- und Multimedia-Programmierung 3
T Java 3D Spiele- und Multimedia-Programmierung 2
A Spielfelder erstellen mit Jogl Java durch ein Koordinaten Array Spiele- und Multimedia-Programmierung 1
J Java Buttons Spiele- und Multimedia-Programmierung 6
T Java Kalender Spiele- und Multimedia-Programmierung 5
Ice4P4rty Java Optische Oberfläche Spiele- und Multimedia-Programmierung 2
MABY Eine mp3 Datei in Java abspielen Spiele- und Multimedia-Programmierung 14
D Java Bomberman Probleme java.lang.NullPointerException Spiele- und Multimedia-Programmierung 1
N Spiele-Menü in Java Spiele- und Multimedia-Programmierung 9
J HDMI Ausgänge mit Java programmieren? Spiele- und Multimedia-Programmierung 18
H Yu-Gi-Oh! Mit Java was tun? Spiele- und Multimedia-Programmierung 6
G Component System Java 2D Game LibGDX Spiele- und Multimedia-Programmierung 6
S Pong java.lang.StackOverflowError Spiele- und Multimedia-Programmierung 3
C Java aus Klasse rausgehen Spiele- und Multimedia-Programmierung 2
MaxG. Java Internet Radio Spiele- und Multimedia-Programmierung 6
G [Java Server] Allgemeine Frage zum Thema Networking in Videospielen Spiele- und Multimedia-Programmierung 15
P java.lang.NoClassDefFoundError: in Greenfoot Spiele- und Multimedia-Programmierung 0
G Java Achsen invertieren Spiele- und Multimedia-Programmierung 2
G Java 2D Spiel mit LWJGL verbinden Spiele- und Multimedia-Programmierung 1
$ Einstieg in Java Game Development Spiele- und Multimedia-Programmierung 11
BraunBerry Java Game Pixel "einfärben" Spiele- und Multimedia-Programmierung 6
BraunBerry Java Game verbesserte Kollisionserkennung Spiele- und Multimedia-Programmierung 18
BraunBerry Java Game Waypoint System Spiele- und Multimedia-Programmierung 3
S Hilfe bei Java Gui Spiele- und Multimedia-Programmierung 2
David Schwarzbeck Java 3 dimensionale Kollisions Abfrage Spiele- und Multimedia-Programmierung 2
M Gesellschaftsspiel Mühle in Java programmieren Spiele- und Multimedia-Programmierung 3
beatles Java Minesweeper - OS X und Win7 Unterschied Spiele- und Multimedia-Programmierung 2
D Minecraft Java JDK installiert - Minecraft läuft nichtmehr in 64 Bit Spiele- und Multimedia-Programmierung 2
E TMX - Dateien in Java laden Spiele- und Multimedia-Programmierung 1
K Erstellen eines Fotoalbums mit Java Spiele- und Multimedia-Programmierung 8
windl MoviePlayer in Java Spiele- und Multimedia-Programmierung 0
S 2D-Render Probleme LWJGL 2 (Java) Spiele- und Multimedia-Programmierung 1
F Klausurersatz: Ein Java-Programm erstellen und dieses präsentieren. Spiele- und Multimedia-Programmierung 2
E Java Jump and Run Map zu groß Spiele- und Multimedia-Programmierung 14
P java lwjgl Game Spiele- und Multimedia-Programmierung 0
J programm mit java-plugin Spiele- und Multimedia-Programmierung 2
D Java Webgame, welche Frameworks oder Techs sind von Nöten? Spiele- und Multimedia-Programmierung 5
P Java 2D Bug? Spiele- und Multimedia-Programmierung 8
T Problem mit Eclipse (java)-(minecraft) Spiele- und Multimedia-Programmierung 3
R Java App sendet Midi Daten über Flash Spiele- und Multimedia-Programmierung 3
O Java Zeile aus Textdatei zufällig ausgeben Spiele- und Multimedia-Programmierung 8
K Bestes Bildformat für Spielegrafiken und deren Einbindung in Java Spiele- und Multimedia-Programmierung 2
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Spiele- und Multimedia-Programmierung 1
T Alle Referenzen zu einer Klasse aus Java Bytecode ersetzt, JVM sucht trotzdem diese Klasse Spiele- und Multimedia-Programmierung 1
J Java Kollisionsabfrage Spiele- und Multimedia-Programmierung 21
Flo. android java tastatureingaben abfangen. Spiele- und Multimedia-Programmierung 1
J Java Steuerberechnung hilfe Spiele- und Multimedia-Programmierung 17
C Export als .jar funktioniert nicht richtig (JAVA 3D) Spiele- und Multimedia-Programmierung 5
P Java Grafiken mit Rechnungen verknüpfen Spiele- und Multimedia-Programmierung 4
U Minecraft Mit Java auf Minecraft Server anmelden Spiele- und Multimedia-Programmierung 11
F Das sag mir einer Java ist plattform unabhänig ! Spiele- und Multimedia-Programmierung 10
S Engine2D - Java 2D Engine Spiele- und Multimedia-Programmierung 20
J Java Game performance Probleme Spiele- und Multimedia-Programmierung 7
C Java Kollisionserkennung Spiele- und Multimedia-Programmierung 4
U Blender in Java Spiele- und Multimedia-Programmierung 8
J Java Fussballspiel Player-KI in der Bewegungsphase Spiele- und Multimedia-Programmierung 4
K Java 15/Slide/Boss Puzzle Spiele- und Multimedia-Programmierung 2
T Java 3D - Step oder IGES Spiele- und Multimedia-Programmierung 1
H 3D Spiele mit Java - Diskussion Spiele- und Multimedia-Programmierung 35
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1

Ähnliche Java Themen

Neue Themen


Oben