1

だから、私はいくつかのオーディオ*.cafファイルを逆にする必要があります、

私はそれを行う方法が次のようになるべきであることを見てきました:

バイトデータを逆にすることはできません。CoreAudioとAudioUnitsを使用して同じ効果を達成しました。ExtFileReader C APIを使用してファイルをlPCMバッファーに読み込み、必要に応じてバッファーを逆にすることができます。

しかし、私はの使用に関するドキュメントを見つけることができません

ExtFileReader C API

したがって、*。cafファイルがある場合、それをリニアPCMに読み込むにはどうすればよいですか? Core Audioの概要を確認しましたが、これを実現する方法が見つかりませんか?

次に、cafファイルを線形PCMに読み取るにはどうすればよいですか?

ありがとう!

4

1 に答える 1

2

ExtendedAudioFileはAudioToolboxフレームワークにあります。ファイルを好きな形式に読み込むのは非常に簡単です。これは、32ビット浮動小数点非インターリーブ線形PCMへの読み込みの簡単な(コンパイルされますが、テストされていません)例です。

    #import <AudioToolbox/AudioToolbox.h>

..。

    ExtAudioFileRef audioFile = NULL;
    CFURLRef url = NULL;
    OSStatus err = ExtAudioFileOpenURL(url, &audioFile);

    AudioStreamBasicDescription asbd;
    UInt32 dataSize = sizeof(asbd);
    // get the audio file's format
    err = ExtAudioFileGetProperty(audioFile, kExtAudioFileProperty_FileDataFormat, &dataSize, &asbd);

    // now set the client format to what we want on read (LPCM, 32-bit floating point)
    AudioStreamBasicDescription clientFormat = asbd;
    clientFormat.mFormatID = kAudioFormatLinearPCM;
    clientFormat.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsNonInterleaved | kAudioFormatFlagIsPacked;
    clientFormat.mBitsPerChannel = 32;
    clientFormat.mBytesPerPacket = 4;
    clientFormat.mFramesPerPacket = 1;
    clientFormat.mBytesPerFrame = 4;

    err = ExtAudioFileSetProperty(audioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(clientFormat), &clientFormat);

    // okay, now the ext audio file is set up to convert samples to LPCM on read
    // get the total number of samples
    SInt64 numFrames = 0;
    dataSize = sizeof(numFrames);
    err = ExtAudioFileGetProperty(audioFile, kExtAudioFileProperty_FileLengthFrames, &dataSize, &numFrames);

    // prepare an audio buffer list to hold the data when we read it from the file

    UInt32 maxReadFrames = 4096; // how many samples will we read in at a time?
    AudioBufferList *bufferList = (AudioBufferList *)malloc(sizeof(AudioBufferList) + sizeof(AudioBuffer) * (asbd.mChannelsPerFrame - 1));
    bufferList->mNumberBuffers = asbd.mChannelsPerFrame;
    for (int ii = 0; ii < bufferList->mNumberBuffers; ++ii) {
        bufferList->mBuffers[ii].mDataByteSize = maxReadFrames * sizeof(float);
        bufferList->mBuffers[ii].mData = malloc(bufferList->mBuffers[ii].mDataByteSize);
        bzero(bufferList->mBuffers[ii].mData, bufferList->mBuffers[ii].mDataByteSize);
        bufferList->mBuffers[ii].mNumberChannels = 1;
    }

    while(numFrames > 0) {
        UInt32 framesToRead = (maxReadFrames > numFrames) ? numFrames : maxReadFrames;
        err = ExtAudioFileRead(audioFile, &framesToRead, bufferList);
        // okay, your LPCM audio data is in `bufferList` -- do whatever processing you'd like!
    }

    // clean up
    for (int ii = 0; ii < bufferList->mNumberBuffers; ++ii) {
        free(bufferList->mBuffers[ii].mData);
    }
    free(bufferList);
    ExtAudioFileDispose(audioFile);
于 2013-01-03T22:16:19.493 に答える