0

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

1 回答 1

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);

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

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

于 2012-08-09T12:24:53.100 回答