2009-08-08 10 views
6

Sto tentando di leggere i dati audio tramite AudioQueue. Quando lo faccio, posso verificare che la profondità di bit del file sia 16 bit. Ma quando ottengo i dati effettivi del campione, vedo solo valori compresi tra -128 e 128. Ma vedo anche dati intercalati sospetti che mi sembrano abbastanza sicuri di non aver letto correttamente i dati.Lettura dei dati del buffer audio con AudioQueue

Quindi, per cominciare, posso verificare che il file sorgente sia 44100, 16 bit, file mono wav.

mio buffer è allocato nel seguente modo:

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

Tutti i valori rilevanti vengono impostate e utilizzate in:

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

Come test, solo in modo che posso vedere i dati recuperati, corro :

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

Ora, so che il mio picchi file di origine in tutto il luogo, ma i valori vedo solo max a -128 un nd 128. Trattandosi di un file a 16 bit, mi aspetterei che i valori sarebbero invece da -32768 a 32768.

Inoltre, sembra che ci siano due modelli nei dati. Ecco un esempio dei dati restituiti:

 
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 

Ora un'occhiata a tutte le altre righe a partire dalla seconda fila: -13. Vedi come aumenta, non in modo uniforme, ma almeno senza intoppi? Le file dispari non sono neanche lontanamente così agevoli.

Il mio primo pensiero sarebbe che si tratta di dati stereo interlacciati, ma no, è solo un canale, quindi non dovrebbe esserci alcun interleaving, giusto?

La mia ipotesi migliore è che sto solo leggendo i dati in modo errato, quindi i dati di esempio vengono suddivisi su due ritorni. Qualche idea su come leggerlo correttamente?

Grazie per aver letto l'intera domanda e per eventuali approfondimenti che puoi offrire.

risposta

8
char *buffer= NULL; 

Questa è la ragione. Stai iterando su byte firmati, non campioni a 16 bit.

dichiarare la variabile come in possesso di un puntatore a valori a due byte invece:

SInt16 *buffer = NULL; 

Poi, scorrere oltre la metà di tutti i campioni byte:

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

Vorrei rinomina BUFFER_SIZE a BUFFER_SIZE_BYTES a chiarirlo.

+0

Grazie ancora Peter! –

Problemi correlati