14

当应用程序在后台且未录制时,我无法在我的应用程序中隐藏红色的“正在录制”状态栏。

在此处输入图像描述

我碰巧在使用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 坚持使用某些东西,它无法禁用麦克风。我没有向控制器添加任何输入,所以我不知道它可能是什么。

4

4 回答 4

4

已解决,见编辑 2

只要麦克风在使用中,无论是否录音,该条都不会消失。这是一种安全措施,让用户知道某个应用正在收听麦克风,而不是显示手机正在录音。

让它消失的唯一方法是从输入接收器中移除麦克风

我看到你的麦克风没有被移除,一定有一些错误。

关键是,只要打开麦克风,您就无法隐藏红色条。

如果你想暂时禁用它,你可以试试这个吗?

[audioController setInputEnabled:NO]

你到底想完成什么?可能有更好的处理方式

编辑 1:添加了其他解决方法

我不知道 setInputEnabled 是只读的,抱歉。

好吧,要尝试的另一件事是完全停止控制器,试试这个:

[audioController stop]

如果没有,如果您不使用 ARC,请尝试释放它,或者干脆

audioController = Nil;

希望能解决问题。但我宁愿尝试找出为什么它没有mic从输入接收器中删除..mic当你打电话时也许是 Nil [audioController removeInputReceiver:mic]

编辑 2:添加解决方案

当您使用inputEnabledset初始化时会出现问题YES,因为它是readOnly,您无法禁用输入,唯一的方法是实际释放audioController。如果您使用的是 ARC,只需将其设置为Nil,否则,只需[audioController release]

于 2013-06-11T18:27:34.803 回答
4

停止录制时尝试关闭音频服务:

AudioSessionSetActive(false);
于 2013-06-10T15:03:43.583 回答
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;
    }
    }
    
于 2017-07-10T12:04:20.643 回答
0

我知道这个问题有点老了,但如果其他人遇到和我一样的问题,我给出了我的最终解决方案。在这样的录制情况下出现了问题:

  1. 开始录音

[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

  1. 停止录制

[session setCategory:AVAudioSessionCategoryPlayback error:&error];

当我评论将会话类别重置为播放的代码时,问题消失了。我还将开始录制代码更改为:

[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];

这样声音从接收器播放到扬声器。

于 2017-10-09T12:33:53.557 回答