0

オーディオを録音して逆再生する必要があるアプリケーションを作成しています。AVAudioRecorder を使用して音声を caf ファイルに録音しましたが、AVAudioPlayer と MPMoviePlayerController の両方で再生できました。MPMoviePlayerController.currentPlaybackRate を -1 に設定しようとしましたが、ノイズは発生しません。調査の結果、オーディオファイルをバイトごとに逆にする必要があることがわかりましたが、その方法がわかりません。caf ファイルを配列に読み取り、配列から書き込む方法はありますか? どんな助けでも大歓迎です。

4

1 に答える 1

0

ユーザーの発言を記録して逆再生するサンプルアプリを作成しました。これを実現するために CoreAudio を使用しました。アプリ コードへのリンク

各サンプルのサイズは 16 ビット (2 バイト) (モノチャンネル) であるため (これは、録音に使用したプロパティによって異なります)。録音の最後から開始して逆方向に読み取ることにより、サンプルを別のバッファにコピーすることで、一度に各サンプルをロードできます。データの先頭に到達すると、データが逆になり、再生が逆になります。

// set up output file
AudioFileID outputAudioFile;

AudioStreamBasicDescription myPCMFormat;
myPCMFormat.mSampleRate = 16000.00;
myPCMFormat.mFormatID = kAudioFormatLinearPCM ;
myPCMFormat.mFormatFlags =  kAudioFormatFlagsCanonical;
myPCMFormat.mChannelsPerFrame = 1;
myPCMFormat.mFramesPerPacket = 1;
myPCMFormat.mBitsPerChannel = 16;
myPCMFormat.mBytesPerPacket = 2;
myPCMFormat.mBytesPerFrame = 2;


AudioFileCreateWithURL((__bridge CFURLRef)self.flippedAudioUrl,
                       kAudioFileCAFType,
                       &myPCMFormat,
                       kAudioFileFlags_EraseFile,
                       &outputAudioFile);
// set up input file
AudioFileID inputAudioFile;
OSStatus theErr = noErr;
UInt64 fileDataSize = 0;

AudioStreamBasicDescription theFileFormat;
UInt32 thePropertySize = sizeof(theFileFormat);

theErr = AudioFileOpenURL((__bridge CFURLRef)self.recordedAudioUrl, kAudioFileReadPermission, 0, &inputAudioFile);

thePropertySize = sizeof(fileDataSize);
theErr = AudioFileGetProperty(inputAudioFile, kAudioFilePropertyAudioDataByteCount, &thePropertySize, &fileDataSize);

UInt32 dataSize = fileDataSize;
void* theData = malloc(dataSize);

//Read data into buffer
UInt32 readPoint  = dataSize;
UInt32 writePoint = 0;
while( readPoint > 0 )
{
    UInt32 bytesToRead = 2;

    AudioFileReadBytes( inputAudioFile, false, readPoint, &bytesToRead, theData );
    AudioFileWriteBytes( outputAudioFile, false, writePoint, &bytesToRead, theData );

    writePoint += 2;
    readPoint -= 2;
}

free(theData);
AudioFileClose(inputAudioFile);
AudioFileClose(outputAudioFile);

お役に立てれば。

于 2013-02-06T07:56:12.640 に答える