【问题标题】:Audio and Recording Reuse on iPhone with Monotouch使用 Monotouch 在 iPhone 上重用音频和录音
【发布时间】:2013-12-10 15:01:10
【问题描述】:

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

基本概述

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

  • 记录列表(TableViewController)
  • 录制细节(ViewController)
  • 新录制(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 区域的初始加载时,每一项都按预期工作,但是任何进一步的尝试似乎都不起作用(没有音频播放

Details 区域也有一个播放部分,允许用户播放任何录音,但是,与 New Recording Controller 很相似,播放在那里也不起作用。

处置

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

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

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

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

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

【问题讨论】:

    标签: ios audio xamarin.ios recording


    【解决方案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's AudioSession Development Area.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 2017-07-02
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多