1

今日、実際のiPhoneデバイスでMonotouchを介して構築されたこの非常にシンプルなオーディオレコーディングアプリケーションのテストを開始しました。AVAudioRecorderとオブジェクトを最初に使用した後の再利用と思われる問題に遭遇しましたが、AVPlayerどうすれば解決できるのでしょうか。

基本的な概要

アプリケーションは、次の3つのセクションで構成されています。

  • 録音リスト(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領域の初期ロードで意図したとおりに機能しますが、それ以上の試行は機能しないようです(オーディオ再生なし

詳細領域には、ユーザーが任意の録音を再生できるようにする再生部分もありますが、新しい録音コントローラーと同様に、再生もそこでは機能しません。

廃棄

それらは両方とも次のように配置されます(ビューを終了/終了するとき):

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

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

また、問題を解決することを期待して、オブジェクトを「生きた」状態に保つことができるオブザーバーを削除しようとしました。また、新しい記録領域が表示されるたびにオブジェクトがインスタンス化されるようにしましたが、その後もオーディオの再生がありません。最初の録音セッション。

必要に応じて、さらに多くのコードを提供させていただきます。(これはMonoTouch 6.0.6を使用しています

4

1 に答える 1

1

さらに調査した結果、AudioSession録音と再生の両方が同じコントローラー内で行われていたことが原因であることが判明しました。

私が決定した2つの解決策は次のとおりです。

解決策 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();
}

の使用に関する追加情報についてはAudioSessionApple の AudioSession Development Area を参照してください。

于 2012-11-15T16:31:22.403 に答える