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!
"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 –