2013-07-04 4 views
1

Каков самый простой способ получить необработанные звуковые сэмплы (в идеале, как плавающие) из WAV-файла без изменения частоты дискретизации файла?Чтение исходных звуковых образцов из файлов WAV

Я следовал примеру в https://stackoverflow.com/a/4572990/1116197, но тогда я не уверен, как извлечь поплавки с buffer. Просто делать buffer[n] не работает. По basicDescription.mFormatFlags файл kAudioFormatFlagIsSignedInteger и kAudioFormatFlagIsPacked

Я сумел сделать извлечь данные (как float с) с использованием ExtAudioFileRef вместо этого, но это требует указания выходной формат, который вы хотите, но я не хочу, чтобы изменить частота дискретизации. например вы можете сделать

AudioStreamBasicDescription audioFormat; 
audioFormat.mSampleRate = 44100; 
audioFormat.mFormatID = kAudioFormatLinearPCM; 
audioFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat; 
audioFormat.mBitsPerChannel = sizeof(Float32) * 8; 
audioFormat.mChannelsPerFrame = 1; // Mono 
audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame * sizeof(Float32); // == sizeof(Float32) 
audioFormat.mFramesPerPacket = 1; 
audioFormat.mBytesPerPacket = audioFormat.mFramesPerPacket * audioFormat.mBytesPerFrame; // = sizeof(Float32) 


ExtAudioFileSetProperty(
    fileRef, 
    kExtAudioFileProperty_ClientDataFormat, 
    sizeof (AudioStreamBasicDescription), 
    &audioFormat 
), 

Я предполагаю, что я мог бы получить файлы AudioStreamBasicDescription первой помощи с использованием ExtAudioFileGetProperty, но в соответствии с Документами Apple (http://developer.apple.com/library/ios/#documentation/MusicAudio/Reference/ExtendedAudioFileServicesReference/Reference/reference.html) свойство ID мне нужно kExtAudioFileProperty_FileDataFormat, который предназначен только для чтения - A file’s data format. Value is a read-only AudioStreamBasicDescription struct. - так что я не могу изменить к нему добавить mFormatFlags = kLinearPCMFormatFlagIsFloat

Так что, я думаю, я мог бы сделать выше, и создать новый ASBD и скопировать все, но все это кажется очень сложным, поэтому я задаюсь вопросом, не лаю ли я неправильное дерево полностью? Есть ли более простой способ сделать это ?!

ответ

0

Как вы обнаружили, для этого вам нужно сначала получить формат данных файла, а затем создать формат данных клиента по частоте дискретизации файла, но с желаемым размером и типом выборки. Это действительно сводится к одному дополнительному вызову функции, который в мире Core Audio не так много.

+0

Я пойду с таким подходом, спасибо! – Mark

2

Наиболее распространенные .WAV-файлы - это всего лишь 44-байтовый заголовок, за которым следуют 16-разрядные или 2-байтовые малоформатные исходные образцы аудио PCM. Если у вас есть один из этих типов файлов, на процессоре little-endian (x86, ARM и т. Д.), Вам просто нужно пропустить первые 44 байта, а затем прочитать и преобразовать короткие ints в float.

+2

Apple не использует 44 байтовых заголовка –

+0

iOS хранит, воспроизводит и считывает 44-байтовый заголовок RIFF/.wav файлы просто отлично. Он может не создавать файлы в этом формате, в зависимости от API, но это другой вопрос. – hotpaw2

Смежные вопросы