Воспроизвести фоновый звук с помощью AVPlayer в MonoTouch?

Во-первых, я понимаю, что это копия аналогичного объективного вопроса на языке C, но ответа на него не было.

Я использую AVPlayer для звука в своем приложении. У меня он воспроизводит звук, правильно настраивая его аудиосеанс (я думаю, значок воспроизведения появляется в строке состояния, когда я воспроизводю аудиодорожки в моем приложении, а значок моего приложения появляется рядом с элементами управления плеером в многозадачной док-станции). Однако я не могу заставить его продолжать играть в фоновом режиме, когда я нажимаю кнопку «Домой». Музыка просто затихает и останавливается.

В моем info.plist есть следующий ключ:

<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>

В моем классе, который обрабатывает воспроизведение, у меня есть:

AVAudioSession audioSession = AVAudioSession.SharedInstance();
NSError error;
audioSession.SetCategory(AVAudioSession.CategoryPlayback.ToString(),out   error);
audioSession.SetActive(true,out error);

UIApplication.SharedApplication.BeginReceivingRemoteControlEvents();

int taskID = 0;
taskID = UIApplication.SharedApplication.BeginBackgroundTask(delegate
{
    if(taskID !=0)
    {
        UIApplication.SharedApplication.EndBackgroundTask(taskID);
        taskID = 0;
    }
});


PlaylistManager = new ApolloPlaylistManager();
AudioPlayer = new AVPlayer();

Не уверен, нужна ли мне эта часть BeginBackgroundTask, но она не работает, если она включена или нет, я на самом деле почти уверен, что она мне не нужна. Любые советы приветствуются, так как я застрял на этом несколько дней :-(


person Dermot    schedule 13.09.2011    source источник
comment
Где в вашей программе размещен приведенный выше код?   -  person Dimitris Tavlikos    schedule 13.09.2011
comment
Он находится в классе AudioPlaybackManager, который управляет воспроизведением звука (как ни странно!). Это свойство класса Singleton с именем AppContext, которое находится в AppDelegate. Он инициализируется из метода FinishedLaunching ().   -  person Dermot    schedule 13.09.2011


Ответы (4)


Хорошо, я чувствую себя немного глупо. Оказывается, перед моим ключевым UIApplicationModes было место. Дох!

Что ж, всем, у кого есть подобные проблемы, убедитесь, что ваш info.plist выглядит так

<key>UIBackgroundModes</key>
<array>
 <string>audio</string>
</array>

и настройте код воспроизведения следующим образом (помните, это Monotouch):

AVAudioSession audioSession = AVAudioSession.SharedInstance();
NSError error;
audioSession.SetCategory(AVAudioSession.CategoryPlayback.ToString(),out error);
        audioSession.SetActive(true,out error);

        UIApplication.SharedApplication.BeginReceivingRemoteControlEvents();

        AudioPlayer = new AVPlayer();
person Dermot    schedule 13.09.2011

Похоже, вы неправильно настроили AVAudioSession. Взгляните на this и это.

Надеюсь, эти советы направят вас в правильном направлении.

person Fran Sevillano    schedule 13.09.2011

У меня была аналогичная проблема, когда одно представление записывало, а другое представление воспроизводило эту запись. Запись работала только иногда (создавались файлы размером 5 КБ), которые были пустыми. Сообщение об ошибке не отображается. После нескольких часов разочарования я наткнулся на вышеуказанный пост Дермота и заставил его работать, добавив AVAudioSession перед AVAudioRecorder:

AVAudioSession audioSession = AVAudioSession.SharedInstance ();

            audioSession.SetCategory (AVAudioSession.CategoryRecord,out error);
            audioSession.SetActive(true, out error);


        recorder = AVAudioRecorder.ToUrl (url, settings, out error);

И тот же код, но измененный с CategoryRecord на CategoryPlayback.

audioSession.SetCategory (AVAudioSession.CategoryPlayback,out error);
person jamesoram    schedule 02.04.2012

Я знаю, что это старый вопрос, но просто добавлю то, что я испытал:

  1. AVAudioSession.SharedInstance (); не работал на моем устройстве, но создание нового экземпляра делает AVAudioSession audiosession = new AVAudioSession ();

  2. В info.plist значение RequiredBackgroundModes теперь равно "Audible content", а не "Audio".

Надеюсь, это поможет.

person jamesoram    schedule 12.08.2013