C++ 如何使用coreAudio将规范化浮点值数组写入AIFF?

C++ 如何使用coreAudio将规范化浮点值数组写入AIFF?,c++,xcode,audio,core-audio,audiotoolbox,C++,Xcode,Audio,Core Audio,Audiotoolbox,我尝试了以下代码,但在执行时出现了“fmt”错误,它告诉我“此文件类型不支持数据格式”。不幸的是,我在任何地方都找不到解释AudioStreamBasicDescription在写入AIFF时应如何设置的参考 我已经在谷歌上搜索了这个问题,并阅读了我能找到的所有文档,但都没有用。以前有人做过这种事吗?知道我做错了什么吗 // This path is just for testing char * filePath = "/Users/user/Desktop/reverb.aiff"; /

我尝试了以下代码,但在执行时出现了“fmt”错误,它告诉我“此文件类型不支持数据格式”。不幸的是,我在任何地方都找不到解释AudioStreamBasicDescription在写入AIFF时应如何设置的参考

我已经在谷歌上搜索了这个问题,并阅读了我能找到的所有文档,但都没有用。以前有人做过这种事吗?知道我做错了什么吗

//  This path is just for testing
char * filePath = "/Users/user/Desktop/reverb.aiff";

//  This value will actually be set by earlier code depending on how many mics are defined    
int channels = 1;

CFURLRef audioFileURL = CFURLCreateFromFileSystemRepresentation(NULL,
                                                                (const UInt8 *)filePath,
                                                                strlen(filePath),
                                                                false);

AudioStreamBasicDescription audioFileDescription = {0};
audioFileDescription.mFormatID         = kAudioFormatLinearPCM;
audioFileDescription.mFormatFlags      = kLinearPCMFormatFlagIsFloat | kLinearPCMFormatFlagIsBigEndian;
audioFileDescription.mBitsPerChannel   = sizeof(float) * 8;
audioFileDescription.mChannelsPerFrame = channels;
audioFileDescription.mBytesPerFrame    = (audioFileDescription.mBitsPerChannel / 8) * audioFileDescription.mChannelsPerFrame;
audioFileDescription.mFramesPerPacket  = 1;
audioFileDescription.mBytesPerPacket   = audioFileDescription.mBytesPerFrame * audioFileDescription.mFramesPerPacket;

AudioFileID audioFileID = 0;

OSStatus createFileStatus = AudioFileCreateWithURL(audioFileURL,
                                                   kAudioFileAIFFType,
                                                   &audioFileDescription,
                                                   kAudioFileFlags_EraseFile,
                                                   &audioFileID);

if (createFileStatus != 0) {
    cout << "Error creating output file" << endl;
    cout << "Error code: " << createFileStatus << ", ";

    //  hacky way of converting number back to kinda-readable enum code
    char chars[5];
    for (int i = 3; i >= 0; i--) {
        chars[i] = (char)createFileStatus;
        createFileStatus = createFileStatus >> 8;
    }
    char[4] = '\0';
    cout << chars << endl;
    return 1;
}
//此路径仅用于测试
char*filePath=“/Users/user/Desktop/reverb.aiff”;
//此值实际上将由早期代码根据定义的麦克风数量进行设置
int通道=1;
CFURLRef audioFileURL=CFURLCreateFromFileSystemRepresentation(NULL,
(const UInt8*)文件路径,
strlen(文件路径),
假);
AudioStreamBasicDescription audioFileDescription={0};
audioFileDescription.mFormatID=kAudioFormatLinearPCM;
audioFileDescription.mFormatFlags=KlinearPCFormatFlagisFloat | KlinearPCFormatFlagisBigendian;
audioFileDescription.mBitsPerChannel=sizeof(float)*8;
audioFileDescription.mChannelsPerFrame=频道;
audioFileDescription.mBytesPerFrame=(audioFileDescription.mbitspperchannel/8)*audioFileDescription.mChannelsPerFrame;
audioFileDescription.mFramesPerPacket=1;
audioFileDescription.mBytesPerPacket=audioFileDescription.mBytesPerFrame*audioFileDescription.mFramesPerPacket;
AudioFileID AudioFileID=0;
OSStatus createFileStatus=AudioFileCreateWithURL(audioFileURL,
考迪奥菲利夫型,
&音频文件描述,
kAudioFileFlags_擦除文件,
&音频文件ID);
如果(createFileStatus!=0){

AIFF类型不支持浮点数据,您需要创建一个AIFF-C文件。因此,当您调用
AudioFileCreateWithURL
时,使用
kAudioFileAIFCType


Big-endian和float互不兼容,请不要指定bigEndian。

AIFF类型不支持float数据,您需要创建一个AIFF-C文件。因此,当您调用
AudioFileCreateWithURL
时,使用
KaudioFileIfcType


Big-endian和float是互不兼容的,请不要指定bigEndian。

一看:尝试将
KaudiofFormatFlagisBigendian
添加到您的格式标志中。很遗憾,在重新编译时没有更改输出。更改计划-我只是打算使用一个更简单的库,如WRAIFFPP,因为我很懒。您真的想使用32位floa吗在你的AIFF中是什么?理想情况下,是的。这样我可以在必要时将采样降低到16位或24位,并且我可以生成+/-1.0之间的所有数据。一眼就能看到:尝试将
kaudioformaflagisbigendian
添加到格式标志中。完成了,但在重新编译时没有更改输出。计划的更改-我只是要使用一个更简单的libr我喜欢Wraiffp,因为我很懒。你真的想在你的AIFF中使用32位浮点吗?理想情况下,是的。这样我可以在必要时将采样减少到16位或24位,并且我可以生成+/-1.0之间的所有数据值