c++ - 如何使用 coreAudio 将标准化浮点值数组写入 AIFF?

标签 c++ xcode audio core-audio audiotoolbox

我试过下面的代码,但在执行它时给出了'fmt?'错误告诉我“此文件类型不支持数据格式”。不幸的是,我无法在任何地方找到解释如果要写入 AIFF 应该如何设置 AudioStreamBasicDescription 的引用。

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

//  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;
}

最佳答案

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

Big Endian 和 float 互不兼容,不要指定 bigEndian。

关于c++ - 如何使用 coreAudio 将标准化浮点值数组写入 AIFF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12159418/

相关文章:

python - 如何将 C++ 中的类类型转换为 PyObject 类型?

swift - 有没有办法可以识别与 viewController 关联的 .storyboard?

actionscript-3 - 如何在AS3中缓存音频流数据并访问它

javascript - 如何将自定义音频播放器的总时间转换为分钟数?

php - 使用php播放任何视频中的音频

c++ - 使用 boost 在 memcpy 中重叠源和目标 block

c++ - Visual Studio : "str() is not a member of std::ostringstream"

c++ - 从 cygwin g++ 使用 STL std::transform 的问题

Xcode:测试与调试预处理器宏

ios - 您的 iPhone 不可用。请选择其他设备并重试