4

ユーザーが特定のボタンをタップしたときに短い音を鳴らそうとしています。しかし、問題は、インスタンスオブジェクトに設定されていないオブジェクト参照を常に受け​​取ることです。Nullを意味します!

私は最初にMonoTouch.AudioToolBox.SystemSoundを試しました。

MonoTouch.AudioToolbox.AudioSession.Initialize();   
MonoTouch.AudioToolbox.AudioSession.Category = MonoTouch.AudioToolbox.AudioSessionCategory.MediaPlayback;   
MonoTouch.AudioToolbox.AudioSession.SetActive(true);   

var t = MonoTouch.AudioToolbox.SystemSound.FromFile("click.mp3");
t.PlaySystemSound();

「click.mp3」がルートソリューションフォルダにあり、コンテンツとしてフラグが付けられていることに注意してください。他のアプローチはMonoTouch.AVFoundation.AVAudioPlayerです。

var url = NSUrl.FromFilename("click.mp3");
AVAudioPlayer player = AVAudioPlayer.FromUrl(url);
player.FinishedPlaying += (sender, e) => { player.Dispose(); };
player.Play();

しかし、同じエラー。私はそれをグーグルで検索しました、そして私は多くの人々がこの問題を抱えているのを見ます。それがバグかどうかを知る必要があります。

4

3 に答える 3

7

使用SystemSoundMP3については、この質問と回答を参照してください:モノタッチでサウンドを再生する

AVAudioPlayer次のパターンは危険であることに注意してください。

AVAudioPlayer player = AVAudioPlayer.FromUrl(url);
player.FinishedPlaying += (sender, e) => { player.Dispose(); };
player.Play();

Playは非同期なので。これは、管理対象playerインスタンスが発生する前にスコープから外れる可能性があることを意味しFinishedPlayingます。つまり、これはスコープ外であり、GCがすでにインスタンスを収集している可能性があることを意味します。

これを修正する方法は、playerローカル変数を型フィールドに昇格させることです。これにより、サウンドの再生中にGCがインスタンスを収集しないようになります。

于 2012-03-28T12:50:32.017 に答える
4

あなたのコードは正しいように見えます(オーディオを再生できるここのコードと比較しました)。

問題になる可能性があるのは、オーディオファイルがアプリバンドルに含まれていないことです。このコードで簡単に確認できます。

if (!System.IO.File.Exists ("click.mp3"))
    Console.WriteLine ("bundling error");
于 2012-03-28T10:47:28.330 に答える
1

ほとんどの場合、それはFile存在しません。あなたが私のようで、ファイルが存在することを確認した場合。次のことを確認してください。

  1. ファイルのパスはrelativeクラスへのパスである必要があります(例:Sounds\beep.wav)(シミュレータでは絶対パスが機能しませんでした)
  2. SoundSystemで定義していることを確認してくださいclass level。これは、MTには非常に攻撃的であり、再生を開始する前にGarbage Collectorあなたを処分する可能性があるためです。SoundSystemこの質問を参照してください
于 2013-05-30T00:30:43.473 に答える