Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从WAV文件读取原始音频样本_Ios_Core Audio - Fatal编程技术网

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

Ios 从WAV文件读取原始音频样本,ios,core-audio,Ios,Core Audio,从WAV文件中获取原始音频样本(理想情况下为浮点数)而不修改文件采样率的最简单方法是什么 我遵循了上的示例,但我不确定如何从缓冲区中提取浮动。仅仅做buffer[n]是不起作用的。根据basicDescription.mFormatFlags文件是kAudioFormatFlagIsSignedInteger和kaudioFormatFlagisPack 我设法用ExtAudioFileRef提取数据(如floats),但这需要指定所需的输出格式,但我不想更改采样器。e、 你能做什么 Audio

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

我遵循了上的示例,但我不确定如何从
缓冲区中提取浮动。仅仅做
buffer[n]
是不起作用的。根据
basicDescription.mFormatFlags
文件是
kAudioFormatFlagIsSignedInteger
kaudioFormatFlagisPack

我设法用
ExtAudioFileRef
提取数据(如
float
s),但这需要指定所需的输出格式,但我不想更改采样器。e、 你能做什么

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文档()我需要的属性ID是
kExtAudioFileProperty\u FileDataFormat
,它是只读的-
文件的数据格式。值是只读的AudioStreamBasicDescription结构。
-因此我无法对其进行修改添加
mFormatFlags=KlineAppCMFormatFlagisFloat


所以我想我可以做上面的工作,创建一个新的ASBD并复制所有内容,但这一切似乎太复杂了,所以我想知道我是不是找错了方向?有更简单的方法吗

最常见的.WAV文件只是一个44字节的头文件,后跟16位或2字节的little-endian原始PCM音频样本。如果您有这些类型的文件之一,在一个小小的endian CPU(x86、ARM等)上,您只需要跳过前44个字节,然后读取短整数并将其转换为浮点。

正如您所发现的,为此,您需要首先获取文件的数据格式,然后以文件的采样率创建客户机数据格式,但要使用所需的样本大小和类型。它实际上可以归结为一个额外的函数调用,在核心音频的世界里,这并不多。

苹果公司不使用44字节的头,存储、播放和读取44字节头的RIFF/.wav文件就可以了。它可能不会创建这种格式的文件,这取决于API,但这是一个不同的问题。