iPhone向后播放caf音频

时间:2012-08-11 06:39:20

标签: iphone objective-c ios audio caf

我正在编写一个应用程序,我需要录制音频并向后播放。我已经使用AVAudioRecorder将音频录制到caf文件中,并且我已经能够使用AVAudioPlayer和MPMoviePlayerController向前播放它。我尝试将MPMoviePlayerController.currentPlaybackRate设置为-1但它不会产生任何噪音。从研究中我发现我需要逐字节地反转音频文件,但我不知道该怎么做。有没有办法将caf文件读取到数组并从数组中写入?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我参与了一个示例应用,它会记录用户说的内容并向后播放。我使用CoreAudio来实现这一目标。 Link to app code

每个样本的大小为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);

希望这会有所帮助。