MonoTouch: Воспроизведение звука

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

Сначала я попробовал 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();

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


person Peyman    schedule 28.03.2012    source источник
comment
Примечание: верхние 3 строки выше устарели в iOS7 (Initialize, Category, SetActive) ... отлично работает без них.   -  person Ender2050    schedule 26.04.2014


Ответы (3)


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

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

if (!System.IO.File.Exists ("click.mp3"))
    Console.WriteLine ("bundling error");
person Rolf Bjarne Kvinge    schedule 28.03.2012
comment
Потрясающий! ты прав. Я попробовал ваш подход и вижу, что этого файла не существует. Итак, я снова проверил файл и теперь вижу, что он не помечен как содержимое. Меняю, но не работает. Я удалил папку obj, и проблема наконец-то решилась. Спасибо. - person Peyman; 28.03.2012
comment
Все еще не работает для меня. Звуковой файл существует. Ставлю точку останова. Моя строка sound.PlaySystemSound() срабатывает, а sound является действительным экземпляром SystemSound. Громкость моего устройства включена до упора. Мой звук не воспроизводится. Период. Я начинаю по-настоящему ненавидеть Xamarin.iOS за то, что он НИКОГДА не делает того, о чем говорит, даже в самых глупых простых сценариях. - person Perrin Larson; 02.02.2016

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

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

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

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

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

person poupou    schedule 28.03.2012
comment
Игрок не будет удален до того, как произойдет обратный вызов. ОС имеет живую ссылку на лямбду обратного вызова (она должна фактически выполнить обратный вызов после завершения воспроизведения). Пока эта ссылка не исчезнет, ​​сам игрок все еще находится в графе живых объектов. После вызова player.Dispose() игрок имеет право на сбор мусора, но не раньше этого момента. - person James Moore; 07.07.2016

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

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