这些是我传入的值,这是我得到的唯一值组合。

dataFormat.mSampleRate = 44100;
dataFormat.mFormatID = kAudioFormatLinearPCM;
dataFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsBigEndian;
dataFormat.mBytesPerPacket = 4;
dataFormat.mFramesPerPacket = 1;
dataFormat.mBytesPerFrame = 4;
dataFormat.mChannelsPerFrame = 2;
dataFormat.mBitsPerChannel = 16;

status = AudioQueueNewInput(  &dataFormat, AudioInputCallback, self, NULL, NULL,  0,
                   &queue);

status = AudioFileCreateWithURL(fileUrl, kAudioFileCAFType, &dataformat, kAudioFileFlags_EraseFile, &audioFile

录音有效,但是在录音过程中和播放时会产生很多噪音。它可以与此代码有关系吗?

最佳答案

我可以看到两个可能的错误。首先,正如@invalidname指出的那样,立体声录音可能无法在iPhone等单声道设备上正常工作。好吧,它可能会起作用,但是如果可以,那么无论如何您都将获取双单声道立体声流,那么为什么要打扰呢?您最好将流配置为单声道工作,并节省CPU开销。

第二个问题可能是声音失真的根源。流描述格式标志应为:

kAudioFormatFlagIsSignedInteger |
kAudioFormatFlagsNativeEndian |
kAudioFormatFlagIsPacked

另外,不要忘记将mReserved标志设置为0。尽管可能会忽略此标志的值,但是为了确保将其显式设置为0也没有什么害处。

编辑:在iPhone上调试音频的另一个更通用的技巧-如果您收到失真,剪切或其他怪异的效果,请从手机中获取数据有效载荷,并在Wave编辑器中查看录音。能够缩小并查看单个样本将为您提供很多出问题的线索。

为此,您需要打开“整理器”窗口,在手机上单击,然后展开应用程序旁边的小箭头(在通常将其卸载的位置)。现在,您将看到一个向下的箭头,如果单击它,Xcode会将数据有效负载从您的应用程序复制到硬盘上的某个位置。如果要将录音转储到磁盘,则会在此处找到提取的文件。

10-08 08:31