无法找到或弄清楚什么是正确的 .mFormatFlags 标志,用于通过
成功创建32位浮点线性PCM aif (实际上是aifc)文件AudioFileCreateWithURL (url,
outfileType,
&streamFormat,
kAudioFileFlags_EraseFile,
&outfile)
其中streamFormat的类型为AudioStreamBasicDescription。用于创建outfileType kAudioFileCAFType 文件
streamFormat.mFormatFlags =
kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved;
按预期工作,但是对于创建outfileType kAudioFileAIFCType ,将返回不支持的格式错误。我知道这与字节序问题有关 - 在OSX“native endian”中不支持Float32 aif但只支持“big endian”。 CalculateLPCMFlags 实用程序也没有给出任何结果。
通过反复试验我发现了不会返回格式错误的标志设置:
outFormat.mFormatFlags =
kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked | kAudioFormatFlagIsBigEndian;
仍然存在“可怕的”字节交换问题,如果在NSData中传递音频字节,我不知道如何修复:
if(outfileType == kAudioFileAIFCType){
Float32 valA;
for(UInt32 i = 0; i < size; i += sizeof(Float32)){
memmove((void*)&valA, data.bytes +i, sizeof(Float32));
Float32 valB = CASwapFloat32HostToBig(*valA);
memmove((void*)data.bytes + i, &valB, sizeof(Float32));
}
}
出于某种原因,这没有任何作用。我怀疑是犯了一些微不足道的错误。有人可以建议修理吗?
提前致谢!