2009-08-08 6 views
6

Je tente de lire des données audio via AudioQueue. Quand je le fais, je peux vérifier que la profondeur de bit du fichier est de 16 bits. Mais quand j'obtiens les données d'échantillon réelles, je ne vois que des valeurs comprises entre -128 et 128. Mais je vois aussi des données entrelacées à l'apparence suspecte, ce qui me garantit que je ne lis pas les données correctement. Donc, pour commencer, je peux vérifier que le fichier source est 44100, 16 bits, fichier wav mono.Lecture de données de tampon audio avec AudioQueue

Mon tampon est alloué ainsi:

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

Toutes les valeurs pertinentes sont définies et utilisées dans:

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

Comme un test, juste pour que je puisse voir les données récupérées, je lance :

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

maintenant, je sais que mes pics de fichier source dans tous les sens, mais les valeurs que je vois max à -128 une nd 128. Etant donné qu'il s'agit d'un fichier 16 bits, je m'attendrais à ce que les valeurs soient à la place de -32768 à 32768.

En outre, il semble y avoir deux modèles dans les données. Voici un exemple des données retournées:

 
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 

Maintenant, jetez un oeil à tous les autres rangs en commençant par la deuxième ligne: -13. Voyez-vous comment cela augmente, pas uniformément, mais au moins en douceur? Les rangées impaires ne sont pas proches de ce point. Ma première pensée serait que ce soit des données stéréo entrelacées, mais non, c'est seulement un canal, donc il ne devrait pas y avoir d'entrelacement, non?

Ma meilleure estimation est que je ne fais que lire les données incorrectement, de sorte que les données d'échantillon sont réparties sur deux retours. Toute idée comment le lire correctement?

Merci d'avoir lu toute la question, et pour tout aperçu que vous pouvez offrir.

Répondre

8
char *buffer= NULL; 

C'est la raison. Vous itérez des octets signés, pas des échantillons 16 bits.

déclarer la variable comme tenant un pointeur sur les valeurs de deux octets au lieu:

SInt16 *buffer = NULL; 

Ensuite, itérer plus de la moitié autant d'échantillons sous forme d'octets:

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

je serais renommer BUFFER_SIZE-BUFFER_SIZE_BYTES à clarifier.

+0

Merci encore Peter! –

Questions connexes