MonoTouch: воспроизведение звука - PullRequest
4 голосов
/ 28 марта 2012

Я пытаюсь воспроизвести короткий звук, когда пользователь нажимает на определенную кнопку.Но проблема в том, что я всегда получаю Ссылку на объект, не установленную для объекта экземпляра .означает 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» находится в моей корневой папке решения и помечен как Content.Другой подход - MonoTouch.AVFoundation.AVAudioPlayer.

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

Но та же ошибка.Я погуглил это, и я вижу, что у многих людей есть эта проблема.Нам нужно знать, является ли это ошибкой или нет.

Ответы [ 3 ]

7 голосов
/ 28 марта 2012

Об использовании SystemSound и MP3 см. Этот вопрос и ответ: Воспроизведение звука с Monotouch

Для AVAudioPlayer имейте в виду, что следующий шаблонопасно:

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

, поскольку Play является асинхронным.Это означает, что управляемый экземпляр player может выйти из области действия до того, как произойдет FinishedPlaying.В свою очередь, это вне области действия означает, что сборщик мусора мог уже собрать экземпляр.

Способ исправить это - добавить локальную переменную player в поле типа.Это гарантирует, что GC не будет собирать экземпляр во время воспроизведения звука.

4 голосов
/ 28 марта 2012

Ваш код выглядит правильно (я сравнил с кодом здесь , который умеет воспроизводить аудио).

Возможно, проблема в том, что аудиофайл не включен в комплект приложения. Вы можете легко проверить это с помощью этого кода:

if (!System.IO.File.Exists ("click.mp3"))
    Console.WriteLine ("bundling error");
1 голос
/ 30 мая 2013

В большинстве случаев это будет File не существует.Если вы похожи на меня, и вы убедились, что файл существует.Убедитесь в следующем:

  1. Путь к файлу должен быть relative к вашему классу (т.е.: Sounds\beep.wav) (абсолютный путь не работал для меня на симуляторе)
  2. Убедитесь, что вы определяете SoundSystem в class level.Это связано с тем, что MT имеет агрессивный Garbage Collector и может избавиться от вашего SoundSystem еще до того, как он начнет играть.смотри этот вопрос
...