1

次のコードを試してみましたが、実行すると「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;
}
4

1 に答える 1

1

Float データは AIFF 型ではサポートされていません。AIFF-C ファイルを作成する必要があります。したがって、呼び出すときはAudioFileCreateWithURLを使用しますkAudioFileAIFCType

ビッグ エンディアンと float は相互に互換性がありません。bigEndian を指定しないでください。

于 2013-02-28T02:16:03.540 に答える