繁体   English   中英

从WAV文件读取原始音频样本

[英]Reading raw audio samples from WAV files

从WAV文件中获取原始音频样本(理想情况下为浮动)的最简单方法是什么,而无需修改文件的采样率?

我已经按照https://stackoverflow.com/a/4572990/1116197上的示例进行操作,但是我不确定如何从buffer提取浮点数。 仅执行buffer[n]不起作用。 根据basicDescription.mFormatFlags ,文件为kAudioFormatFlagIsSignedIntegerkAudioFormatFlagIsPacked

我已经设法使用ExtAudioFileRef提取数据(作为float ),但是这需要指定所需的输出格式,但是我不想更改sampleRate。 例如你可以

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
),

我想我可以先使用ExtAudioFileGetProperty来获取AudioStreamBasicDescription文件,但是根据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. A file's data format. Value is a read-only AudioStreamBasicDescription struct. -因此我无法对其进行修改,添加mFormatFlags = kLinearPCMFormatFlagIsFloat

因此,我想我可以执行上述操作,然后创建一个新的ASBD并复制所有内容,但这一切似乎都非常复杂,所以我想知道我是否完全在树错了树吗? 有没有更简单的方法可以做到这一点?

最常见的.WAV文件只是一个44字节的标头,后跟16位或2字节的Little-endian原始PCM音频样本。 如果您拥有这些类型的文件之一,则在低端CPU(x86,ARM等)上,只需跳过前44个字节,然后读取并将short int转换为float。

如您所见,要执行此操作,您首先需要获取文件的数据格式,然后以文件的采样率创建具有所需采样大小和类型的客户端数据格式。 它实际上归结为一个额外的函数调用,在Core Audio的世界中并没有多少。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM