Frage

Ich versuche, Audiodaten über Audioqueue zu lesen. Wenn ich dies tun, kann ich bestätigen, dass die Bit-Tiefe der Datei 16-Bit ist. Aber wenn ich die tatsächlichen Beispieldaten zu bekommen, bin ich nur Werte von -128 bis 128 zu sehen, aber ich bin auch verdächtig sehen verschachtelten Daten suchen, die macht mich ziemlich sicher, dass ich nur die Daten nicht lesen richtig.

So beginnen, kann ich überprüfen, ob die Quelldatei 44100, 16-Bit, Mono WAV-Datei.

ist mein Puffer zugeordnet thusly:

char *buffer= NULL;
buffer = malloc(BUFFER_SIZE);
assert(buffer);

Alle relevanten Werte werden festgelegt und verwendet in:

AudioFileReadPackets(inAudioFile,false,&bytesRead,NULL,packetNum,&numPackets,buffer);       

Als Test, so nur, dass ich die Daten abgerufen sehen kann, ich laufe:

for(int i=0;i<BUFFER_SIZE;i++){
  NSLog(@"%i", buffer[i]);
}

Jetzt weiß ich meine Quelldatei Spitzen ganz über den Platz, aber die Werte sehe ich nur max bei -128 und 128, da dies zu sein, ist eine 16-Bit-Datei, würde ich erwarten, dass die Werte stattdessen würden -32768 sein 32768.

Darüber hinaus scheint es zwei Muster in den Daten zu sein. Hier ist ein Beispiel der Daten zurückgegeben:

70
-13
31
-11
-118
-9
-15
-7
116
-4
31
-1
28
1
84
2
-123
3
-97
4
110
5
54
6
126

Jetzt bei jeder zweiten Reihe einen Blick mit der zweiten Zeile beginnen: -13. Sehen Sie, wie es erhöht, nicht gleichmäßig, aber zumindest glatt? Die ungeraden Zeilen sind nicht irgendwo in der Nähe, dass glatt.

Mein erster Gedanke wäre, dass diese verschachtelten Stereo-Daten, aber nein, es ist nur ein Kanal, so sollte es keine Verschachtelung sein, nicht wahr?

Meine beste Vermutung ist, dass ich die Daten falsch bin nur zu lesen, so dass die Beispieldaten werden über zwei zurückkehrt aufgespannt werden. Jede Idee, wie man es richtig lesen?

Vielen Dank für die durch die ganze Frage zu lesen, und für jede Einsicht Sie bieten können.

War es hilfreich?

Lösung

char *buffer= NULL;

Das ist der Grund. Sie sind über unterzeichnet Bytes laufen, keine 16-Bit-Samples.

Deklarieren die Variable als einen Zeiger auf Zwei-Byte-Werte hält statt:

SInt16 *buffer = NULL;

Dann iterieren halb so viele Proben wie Bytes:

for(int i=0;i < (BUFFER_SIZE / sizeof(*buffer));i++){
  NSLog(@"%i", buffer[i]);
}

Ich würde umbenennen BUFFER_SIZE BUFFER_SIZE_BYTES es zu klären.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top