2009-08-08 22 views
6

Tôi đang cố đọc dữ liệu âm thanh qua AudioQueue. Khi tôi làm như vậy, tôi có thể xác minh rằng độ sâu bit của tệp là 16 bit. Nhưng khi tôi nhận được dữ liệu mẫu thực tế, tôi chỉ thấy giá trị từ -128 đến 128. Nhưng tôi cũng thấy dữ liệu xen kẽ tìm kiếm đáng ngờ, điều này khiến tôi khá chắc chắn rằng tôi không đọc dữ liệu chính xác.Đọc dữ liệu đệm âm thanh với AudioQueue

Vì vậy, để bắt đầu, tôi có thể xác minh rằng tệp nguồn là tệp 44100, 16 bit, mono wav.

đệm của tôi được phân bổ thusly:

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

Tất cả các giá trị có liên quan được thiết lập và sử dụng trong:

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

Là một kiểm tra, chỉ để tôi có thể xem dữ liệu lấy ra, tôi chạy :

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

Bây giờ, tôi biết rằng tệp nguồn của tôi cao nhất ở mọi nơi, nhưng giá trị tôi chỉ thấy tối đa ở -128 một thứ 128. Vì đây là tệp 16 bit, tôi hy vọng rằng các giá trị thay vào đó sẽ là -32768 đến 32768.

Ngoài ra, có vẻ như có hai mẫu trong dữ liệu. Dưới đây là ví dụ về dữ liệu được trả lại:

 
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 

Bây giờ hãy xem mọi hàng khác bắt đầu bằng hàng thứ hai: -13. Xem cách nó tăng, không đồng đều, nhưng ít nhất là suôn sẻ? Các hàng được đánh số lẻ không ở bất kỳ đâu gần trơn tru.

Suy nghĩ đầu tiên của tôi là đây là dữ liệu âm thanh nổi xen kẽ, nhưng không, nó chỉ là một kênh, vì vậy không nên có bất kỳ sự xen kẽ nào, đúng không?

Dự đoán tốt nhất của tôi là tôi chỉ đọc dữ liệu không chính xác, vì vậy dữ liệu mẫu đang được trải rộng trên hai lần trả về. Bất kỳ ý tưởng làm thế nào để đọc nó một cách chính xác?

Cảm ơn bạn đã đọc qua toàn bộ câu hỏi và cho bất kỳ thông tin chi tiết nào bạn có thể cung cấp.

Trả lời

8
char *buffer= NULL; 

Đó là lý do. Bạn đang lặp qua các byte đã ký, chứ không phải các mẫu 16 bit.

Khai báo các biến như cầm một con trỏ đến giá trị hai byte thay vì:

SInt16 *buffer = NULL; 

Sau đó, lặp hơn một nửa như nhiều mẫu như byte:

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

tôi sẽ đổi tên BUFFER_SIZE-BUFFER_SIZE_BYTES để làm rõ nó.

+0

Cảm ơn Peter lần nữa! –