2009-08-08 19 views
6

Próbuję odczytać dane audio przez AudioQueue. Kiedy to zrobię, mogę sprawdzić, czy głębia bitowa pliku jest 16-bitowa. Ale kiedy dostaję rzeczywiste przykładowe dane, widzę tylko wartości od -128 do 128. Ale widzę również podejrzane, przeplatane dane, co sprawia, że ​​jestem po prostu nie czytam poprawnie danych.Odczytywanie danych bufora audio za pomocą AudioQueue

Po pierwsze, mogę sprawdzić, czy plik źródłowy to 44100, 16-bitowy plik mono wav.

Mój bufor jest alokowana wygląda następująco:

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

Wszystkie odpowiednie wartości są ustawione i używane:

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

Jako test, po prostu tak, że mogę zobaczyć pobierane dane, biegnę :

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

Teraz wiem, że mój plik źródłowy osiąga wartości szczytowe w całym miejscu, ale wartości widzę tylko max przy -128 a nd 128. Będąc jako 16-bitowy plik, oczekiwałbym, że zamiast tego wartości będą wynosić od -32768 do 32768.

Ponadto wydaje się, że w danych występują dwa wzory. Oto przykład zwróconych danych:

 
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 

Teraz spójrz na co drugi rząd, zaczynając od drugiego rzędu: -13. Zobacz, jak rośnie, nie równo, ale co najmniej płynnie? Wiersze o numerach nieparzystych nie są w pobliżu tak gładkie.

Moja pierwsza myśl to, że są to przeplecione dane stereo, ale nie, to tylko jeden kanał, więc nie powinno być żadnego przeplatania, prawda?

Moje najlepsze przypuszczenie jest takie, że po prostu odczytuję dane niepoprawnie, więc przykładowe dane są łączone za pomocą dwóch zwrotów. Masz pomysł, jak poprawnie odczytać?

Dziękuję za przeczytanie całego pytania i za każdy wgląd, jaki możesz zaoferować.

Odpowiedz

8
char *buffer= NULL; 

To jest powód. Wykonujesz iterację po podpisanych bajtach, a nie 16-bitowych próbkach.

zadeklarować zmienną jako posiadający wskaźnik do wartości dwu-bajtowych zamiast:

SInt16 *buffer = NULL; 

Następnie iteracyjne ponad pół jak wielu próbek w bajtach:

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

chciałbym zmienić nazwę BUFFER_SIZE do BUFFER_SIZE_BYTES do wyjaśnij to.

+0

Jeszcze raz dziękuję Peter! –

Powiązane problemy