我真的需要帮助解决这个问题。我正在开发一个带有音频单元的iOS应用程序,录制的音频需要使用alaw格式以8bit/8000赫兹的采样率。我怎么会从扬声器里听到失真的声音。
我在网上看到了这个样本:
http://www.stefanpopp.de/2011/capture-iphone-microphone/comment-page-1/
当我试着调试我的应用程序时,我在他的应用程序中使用了我的audioFormat,我得到了同样失真的声音。我想我要么有不正确的设置,要么我需要做一些其他的事情来使它工作。考虑到链接中的应用程序和下面的音频格式,有人能告诉我我是做错了什么还是遗漏了什么吗?我对这些东西了解不多,谢谢。
音频格式:
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 8000;
audioFormat.mFormatID = kAudioFormatALaw;
audioFormat.mFormatFlags = kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1;
audioFormat.mBitsPerChannel = 8;
audioFormat.mBytesPerPacket = 1;
audioFormat.mBytesPerFrame = 1;
最终使其正确播放。我在这里发帖是为了帮助其他面临类似问题的人。
我面临的主要问题是模拟器和实际设备之间存在巨大差异。在设备上运行该应用程序,音质更好,但它每隔一秒或两秒就跳过一次,我发现了一个似乎可以解决这个问题的设置,以及一个更改缓冲区大小/持续时间的设置。(持续时间设置在模拟器上不起作用,我的一些问题是需要它以一定的速率运行才能与其他东西同步,这导致了声音失真)
status = AudioSessionInitialize(NULL, kCFRunLoopDefaultMode, NULL, audioUnit);
UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord;
status = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory);
[self hasError:status:__FILE__:__LINE__];
Float32 preferredBufferSize = 0.005805; // in seconds
status = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(preferredBufferSize), &preferredBufferSize);
[self hasError:status:__FILE__:__LINE__];
status = AudioSessionSetActive(true);
第一个音频会话属性阻止了跳过,使其播放更加流畅。第二个调整缓冲区持续时间,这是以秒为单位的回调触发频率,并将为您提供不同的缓冲区大小。它尽了最大努力,这意味着它将尽可能接近你提供的价值,但它似乎有一个可用尺寸的列表,并选择最接近的尺寸。
请参阅我在问题中链接的帖子,以获得一个非常好的教程/示例程序来开始使用这些东西。