2012-01-13 30 views
5

Nếu tôi mở một tập tin âm thanh với các dịch vụ tập tin âm thanh mở rộng, sử dụng định dạng dữ liệu khách hàng sau ...Làm cách nào để đọc các mẫu từ một AudioBufferList?

AudioStreamBasicDescription audioFormat; 
memset(&audioFormat, 0, sizeof(audioFormat)); 
audioFormat.mSampleRate = 44100.0; 
audioFormat.mFormatID = kAudioFormatLinearPCM; 
audioFormat.mFormatFlags = kAudioFormatFlagIsBigEndian | 
          kAudioFormatFlagIsSignedInteger | 
          kAudioFormatFlagIsPacked; 
audioFormat.mBytesPerPacket = 4; 
audioFormat.mFramesPerPacket = 1; 
audioFormat.mChannelsPerFrame = 2; 
audioFormat.mBytesPerFrame = 4; 
audioFormat.mBitsPerChannel = 16; 

Và cấu hình một AudioBufferList như vậy ....

AudioBufferList bufferList; 
bufferList.mNumberBuffers = 1; 
bufferList.mBuffers[0].mDataByteSize = bufferSize; 
bufferList.mBuffers[0].mNumberChannels = audioFormat.mChannelsPerFrame; 
bufferList.mBuffers[0].mData = buffer; //malloc(sizeof(UInt8) * 1024 * audioFormat.mBytesPerPacket) 

thế nào, sau đó , là dữ liệu được sắp xếp trong mData? Nếu tôi lặp qua các dữ liệu như vậy

for (int i = 0; i < frameCount; i++) { 
     UInt8 somePieceOfAudioData = buffer[i]; 
} 

thì somePieceOfAudioData là gì.

Đây có phải là mẫu hoặc khung (các kênh trái và phải) không? Nếu đó là mẫu thì kênh đó là mẫu gì? Nếu ví dụ đó là một mẫu từ kênh bên phải, bộ đệm [i + 1] có phải là mẫu cho kênh bên trái không?

Bất kỳ ý tưởng, liên kết nào? Cảm ơn bạn!

+0

"Các bộ đệm có thể đại diện cho hai loại khác nhau của âm thanh ... Một duy nhất, đơn âm, kênh noninterleaved của âm thanh [hoặc] Interleaved âm thanh với bất kỳ số lượng kênh nào - như được chỉ định bởi trường mNumberChannels ". Câu hỏi bây giờ, tôi đoán, là làm thế nào để tôi biết đó là cái gì, và tôi nên sử dụng nhiều hơn một bộ đệm âm thanh? ví dụ. bufferList.mNumberBuffers = audioFormat.mChannelsPerFrame –

Trả lời

9

Dữ liệu âm thanh được dự kiến ​​sẽ được xen kẽ trừ khi đặt kAudioFormatFlagIsNonInterleaved. Tôi đã tìm thấy rằng đối với các câu hỏi về Core Audio, nguồn tài liệu tốt nhất thường là các tiêu đề. CoreAudioTypes.h chứa những nhận xét sau đây:

Thông thường, khi một ASBD đang được sử dụng, các lĩnh vực mô tả bố trí đầy đủ các dữ liệu mẫu trong bộ đệm được đại diện bởi mô tả này - nơi thường những bộ đệm được đại diện bởi một AudioBuffer được chứa trong một AudioBufferList.

Tuy nhiên, khi một ASBD có cờ kAudioFormatFlagIsNonInterleaved, thì AudioBufferList có cấu trúc và ngữ nghĩa khác. Trong trường hợp này, trường ASBD sẽ mô tả định dạng MỘT trong số AudioBuffers được chứa trong danh sách VÀ mỗi AudioBuffer trong danh sách được xác định là có một (mono) kênh dữ liệu âm thanh. Sau đó, mChannelsPerFrame của ASBD sẽ cho biết tổng số AudioBuffers được chứa trong AudioBufferList - trong đó mỗi bộ đệm chứa một kênh. Điều này được sử dụng chủ yếu với đại diện AudioUnit (và AudioConverter) của danh sách này - và sẽ không tìm thấy trong việc sử dụng AudioHardware của cấu trúc này.

Trong trường hợp cụ thể của bạn, bộ đệm sẽ bao gồm quần short xen kẽ bắt đầu bằng kênh bên trái.

+0

Cảm ơn bạn, và có các tập tin tiêu đề đã rất hữu ích. Tôi thậm chí còn tìm thấy một số đơn vị âm thanh không có giấy tờ mới được cung cấp cho iOS! –

1

Vâng, bạn đang đọc một khung và đó là hai mẫu 16 bit, Trái và Phải. (Trên thực tế, tôi không chắc chắn cái nào là Trái và đó là Phải. Hmmm.)

Ngoài các tệp tiêu đề, các tham chiếu lớp được xây dựng vào Xcode là hữu ích. Tôi thấy tôi đang sử dụng "tùy chọn nhấp" và "nhấp vào lệnh" trong mã của tôi rất nhiều khi tôi sắp xếp các loại chi tiết này. (đối với những người mới sử dụng Xcode .. các nhấp chuột này giúp bạn có được thông tin và tài liệu và vị trí nhảy tới nguồn tương ứng.)

Cuốn sách sắp tới "Learning Core Audio: Hướng dẫn thực hành về lập trình âm thanh cho Mac và iOS "của Kevin Avila và Chris Adamson làm một công việc tốt đẹp để giải thích cách tất cả các công trình này.Nó có sẵn trong "Rough Cut" hình thức tại Safari Books Online:

http://my.safaribooksonline.com/book/audio/9780321636973

+0

Cảm ơn! Tôi sẽ thứ hai tất cả điều đó. Tôi đã đọc qua cuốn sách đó rồi, và nó khá hữu ích! Các tập tin tiêu đề cũng rất hữu ích, nhưng thường thì nó không rõ ràng ở đâu. Ví dụ trong trường hợp này, tôi tìm AudioStreamBasicDescription, AudioBuffer hoặc ExtAudioFileRead. Tôi cuối cùng đã tìm thấy câu trả lời của tôi mặc dù. –

Các vấn đề liên quan