C++ 如何使用coreAudio将规范化浮点值数组写入AIFF?
我尝试了以下代码,但在执行时出现了“fmt”错误,它告诉我“此文件类型不支持数据格式”。不幸的是,我在任何地方都找不到解释AudioStreamBasicDescription在写入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"; /
// 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之间的所有数据值