当应用在后台并且没有录制时,我无法将红色“录制”状态栏隐藏在我的应用中。
我碰巧使用The Amazing Audio Engine,但我认为这个问题可以解决该库的问题。它设置如下:
audioController = [[AEAudioController alloc] initWithAudioDescription:desc inputEnabled:YES];
audioController.audioSessionCategory = kAudioSessionCategory_MediaPlayback;
当用户想要录制时,我会像这样打开麦克风:
[audioController addInputReceiver:mic];
audioController.audioSessionCategory = kAudioSessionCategory_PlayAndRecord;
当用户想要停止录制时,我将其关闭:
[audioController removeInputReceiver:mic];
audioController.audioSessionCategory = kAudioSessionCategory_MediaPlayback;
问题是,当应用程序没有录制时用户离开应用程序时,红色的“录制”状态栏仍会显示。我无法停止/处理audioController,因为该应用程序可能仍在播放音频。
如果我没有录制,我不希望显示红色录制状态栏。有任何想法如何做到这一点?
我设置了以下代码块,以便在我的应用中每2秒运行一次。
audioController.audioSessionCategory = kAudioSessionCategory_MediaPlayback;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError* error = nil;
[audioSession setActive:NO error: &error];
NSLog(@"error: %@", error);
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
此日志:
TAAE: Setting audio session category to MediaPlayback
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryEnableBluetoothInput) result 2003329396 77686174 what
Error Domain=NSOSStatusErrorDomain Code=560030580 "The operation couldn’t be completed. (OSStatus error 560030580.)"
显然,由于TAAE持有的东西,它无法禁用麦克风。我没有向控制器添加任何输入,所以我不知道它可能是什么。
答案 0 :(得分:4)
尝试在停止录制时关闭audio servicess:
AudioSessionSetActive(false);
答案 1 :(得分:4)
已解决,请参阅编辑2
只要麦克风正在使用,录音与否,该栏就不会消失。这是一项安全措施,允许用户知道应用正在收听麦克风,而不是显示手机正在录制。
让它消失的唯一方法是从输入接收器中移除麦克风
我看到你的麦克风没有被移除,必须有一些错误。
重点是,只要麦克风打开,就无法隐藏红色条。
如果你想暂时禁用它,你可以尝试这个吗?
[audioController setInputEnabled:NO]
无论如何,你想要完成什么?可能有更好的方法来处理事情
修改1:添加了其他解决方法
我不知道setInputEnabled是readonly,抱歉。
嗯,另外要尝试的是完全停止控制器,试试这个:
[audioController stop]
如果没有,请尝试释放它,如果您不使用ARC,或只是
audioController = Nil;
希望解决问题。但我宁愿试着找出它为什么不从输入接收器中删除mic
..当你调用mic
时,[audioController removeInputReceiver:mic]
可能是Nil?
编辑2:添加解决方案
当您将inputEnabled
设置为YES
进行初始化时出现问题,因为它是readOnly
,您无法禁用输入,唯一的方法是实际释放audioController
}。
如果你使用ARC,只需将其设置为Nil
,如果没有,只需[audioController release]
答案 2 :(得分:0)
我通过以下方式解决了问题:
[recordAudioController stop]
,当我想再次开始录制时,我重新启动了这个音频控制器。 从试图停止音频会话的AEAudioController.m
中删除一行代码,使TAAE仅停止AUGraph
:
- (void)stopInternal {
NSLog(@"TAAE: Stopping Engine");
checkResult(AUGraphStop(_audioGraph), "AUGraphStop");
if ( self.running ) {
// Ensure top IO unit is stopped (AUGraphStop may fail to stop it)
checkResult(AudioOutputUnitStop(_ioAudioUnit), "AudioOutputUnitStop");
}
// --- I removed the following section ---
if ( !_interrupted ) {
NSError *error = nil;
if ( ![((AVAudioSession*)[AVAudioSession sharedInstance]) setActive:NO error:&error] ) {
NSLog(@"TAAE: Couldn't deactivate audio session: %@", error);
}
}
processPendingMessagesOnRealtimeThread(self);
if ( _pollThread ) {
[_pollThread cancel];
while ( [_pollThread isExecuting] ) {
[NSThread sleepForTimeInterval:0.01];
}
_pollThread = nil;
}
}
答案 3 :(得分:0)
我知道问题有点老了,但是如果其他人遇到像我这样的问题,我给出了最后的解决方案。问题出现在这样的录音情况中:
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[session setCategory:AVAudioSessionCategoryPlayback error:&error];
当我评论将会话类别重置为播放的代码时,问题就消失了。我还将开始录制代码更改为:
[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];
使声音从接收器播放到扬声器。