1

我刚刚开始在实际的 iPhone 设备上测试这个非常简单的录音应用程序,它是通过 Monotouch 构建的。我遇到了一个问题,似乎是第一次使用AVAudioRecorderandAVPlayer对象后的重用,我想知道如何解决它。

基本概述

该应用程序由以下三个部分组成:

  • 记录列表(TableViewController)
  • 记录细节(ViewController)
  • 新记录(视图控制器)

工作流程

创建录音时,用户将单击“录音列表”区域中的“添加”按钮,应用程序会推送新的录音视图控制器。

在 New Recording Controller 中,可以使用以下变量:

AVAudioRecorder recorder;
AVPlayer player;

每个都在使用之前初始化:

//Initialized during the ViewDidLoad event
recorder = AVAudioRecorder.Create(audioPath, audioSettings, out error);

//Initialized in the "Play" event
player = new AVPlayer(audioPath);

在 New Recording Controller 区域的初始加载中,这些工作中的每一项都按预期工作,但是任何进一步的尝试似乎都不起作用(没有音频播放

详细信息区域还有一个播放部分,允许用户播放任何录音,但是,与新录音控制器非常相似,播放在那里也不起作用。

处理

它们都按如下方式处理(退出/离开视图时):

if(recorder != null)
{
    recorder.Dispose();
    recorder = null;
}

if(player != null)
{
    player.Dispose();
    player = null;
}

我还尝试删除任何可能使任何对象保持“活动”状态的观察者,希望能够解决问题并确保它们在每次显示新录制区域时都被实例化,但是在之后我仍然没有收到音频播放初始录制会话。

如有必要,我很乐意提供更多代码。(这是使用 MonoTouch 6.0.6

4

1 回答 1

1

经过进一步调查,我确定问题是由AudioSession同一控制器中发生的录制和播放引起的。

我确定的两个解决方案如下:

解决方案 1 (AudioSessionCategory.PlayAndRecord)

//A single declaration of this will allow both AVAudioRecorders and AVPlayers
//to perform alongside each other.
AudioSession.Category = AudioSessionCategory.PlayAndRecord;

//Upon noticing very quiet playback, I added this second line, which allowed
//playback to come through the main phone speaker
AudioSession.OverrideCategoryDefaultToSpeaker = true;

解决方案 2 (AudioSessionCategory.RecordAudio & AudioSessionCategory.MediaPlayback)

void YourRecordingMethod()
{
     //This sets the session to record audio explicitly
     AudioSession.Category = AudioSessionCategory.RecordAudio;
     MyRecorder.record();  
}

void YourPlaybackMethod()
{
     //This sets the session for playback only
     AudioSession.Category = AudioSessionCategory.MediaPlayback;
     YourAudioPlayer.play();
}

有关使用 的更多信息AudioSession,请访问Apple 的 AudioSession 开发区。

于 2012-11-15T16:31:22.403 回答