我的iOS应用程序使用8000赫兹采样率的音频单元,返回失真的声音



我真的需要帮助解决这个问题。我正在开发一个带有音频单元的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);

第一个音频会话属性阻止了跳过,使其播放更加流畅。第二个调整缓冲区持续时间,这是以秒为单位的回调触发频率,并将为您提供不同的缓冲区大小。它尽了最大努力,这意味着它将尽可能接近你提供的价值,但它似乎有一个可用尺寸的列表,并选择最接近的尺寸。

请参阅我在问题中链接的帖子,以获得一个非常好的教程/示例程序来开始使用这些东西。

相关内容

  • 没有找到相关文章

最新更新