iPhone 4,录音后的音频电平问题

Posted

技术标签:

【中文标题】iPhone 4,录音后的音频电平问题【英文标题】:iPhone 4, audio level issue after recording 【发布时间】:2013-09-07 07:13:14 【问题描述】:

我正在开发一个需要录制和播放音频的 ios 应用程序。我注意到在 iPhone 4 上录制后音频电平要低得多。 当我使用我在这里找到的代码时,这个问题得到了修复:iOS - iPhone sound level low after recording sound using AVFoundation

 if(!IS_IPHONE_5)
         UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
         AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
        UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
         AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
     

这很好用,但这会导致问题,如果用户将他的手机静音,仍然会播放音频(以及应用程序中的其他声音)

是否可以通过某种方式检测音频是否静音?如果是这样,那我们就不要执行上面的代码了。

【问题讨论】:

【参考方案1】:

也许你可以这样检查

CFStringRef state = nil;
UInt32 propertySize = sizeof(CFStringRef);
AudioSessionInitialize(NULL, NULL, NULL, NULL);
OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);

if (status == kAudioSessionNoError)

    return (CFStringGetLength(state) == 0);   // YES = silent

return NO;

修改后的方法是

-(BOOL)silenced 
     #if TARGET_IPHONE_SIMULATOR
         // return NO in simulator. Code causes crashes for some reason.
     return NO;
     #endif

    CFStringRef state;
    UInt32 propertySize = sizeof(CFStringRef);
    AudioSessionInitialize(NULL, NULL, NULL, NULL);
    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
    if(CFStringGetLength(state) > 0)
        return NO;
    else
        return YES;
    

【讨论】:

谢谢。我现在唯一的问题是,如果用户播放音频(收音机或 iTunes),然后他打开应用程序,那么音频就会停止。 @WouterDeRuyck:- 这是因为这是系统功能,所以音频控制器在启动时会滚动到它们。

以上是关于iPhone 4,录音后的音频电平问题的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 音频工具箱中的音频电平表是啥?

如何在iphone录音中设置电平表?

iPhone - AudioToolbox 和录音

iphone avTouch 示例代码 - 模拟器不显示音频电平表

如何在 iphone sdk 中同时进行输出音频电平测量和音高变化

iPhone应用程序内部录音