我目前能够反向录制和播放(感谢几个例子),但我想让用户能够从表格视图中选择以前录制的.AAC文件并将其反转。 我已经尝试将输入文件url更改为用户文件的url,但我得到静态或0.0持续时间的音频文件。 AAC文件是否可以进行这种反转?如果是这样,我如何更正我的设置以接受它?
recordedAudioUrl = [NSURL URLWithString:[savedURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSLog( @"url is %@", [recordedAudioUrl absoluteString]);
flippedAudioUrl = [NSURL URLWithString:[reverseURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSLog( @"url is %@", [flippedAudioUrl absoluteString]);
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)flippedAudioUrl,
kAudioFileCAFType,
&myPCMFormat,
kAudioFileFlags_EraseFile,
&outputAudioFile);
AudioFileID inputAudioFile;
OSStatus theErr = noErr;
UInt64 fileDataSize = 0;
AudioStreamBasicDescription theFileFormat;
UInt32 thePropertySize = sizeof(theFileFormat);
theErr = AudioFileOpenURL((__bridge CFURLRef)recordedAudioUrl, kAudioFileReadPermission, 0, &inputAudioFile);
thePropertySize = sizeof(fileDataSize);
theErr = AudioFileGetProperty(inputAudioFile, kAudioFilePropertyAudioDataByteCount, &thePropertySize, &fileDataSize);
UInt32 dataSize = fileDataSize;
void* theData = malloc(dataSize);
//Read data into buffer
SInt64 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);
}
答案 0 :(得分:2)
您的代码正在向后读取原始AAC数据(AudioFileReadBytes
甚至不尊重数据包边界,与AudioFileReadPacketData
不同),然后将其作为LPCM向前写入。难怪你听到静电。要反转AAC文件,您必须先将其解码为LPCM。建议您将阅读代码从AudioFile
切换为ExtendedAudioFile
或AVAudioFile
。
您的回读 - 写 - 转发方法仍应适用于上述更改。
所提到的API可以将AAC(以及其他内容)解码为LPCM,例如, decoding with AVAudioFile和decoding with ExtAudioFile
NB 示例不是在阅读AAC,但这并不重要,因为API会隐藏您的详细信息,因此您的代码无需关心源格式是什么。
答案 1 :(得分:0)
您需要做的是:
这会给你reverse.aac。