Воспроизведение музыки в фоновом режиме с помощью AVAudioplayer - PullRequest
38 голосов
/ 01 октября 2011

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

Я использовал следующий код: -

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Day At The Beach"  ofType: @"mp3"];

NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];

NSError *error;
playerTemp = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
playerTemp.numberOfLoops = 0;
AudioSessionSetActive(true);
[playerTemp play];

Ответы [ 12 ]

79 голосов
/ 01 октября 2011

Я решил этот вопрос, сославшись на Фоновые задачи приложения iOS

и внес некоторые изменения в .plist файл нашего приложения.

Обновление

записать этот код в виде вашего контроллера сделал метод загрузки, как это

- (void)viewDidLoad
{
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"in-the-storm" ofType:@"mp3"]];
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    [[AVAudioSession sharedInstance] setActive: YES error: nil];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [audioPlayer play];
    [super viewDidLoad];
}
32 голосов
/ 10 ноября 2011

Я просто хотел добавить примечание к ответу Мехула. Эта строка:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

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

Добавление строки кода выше позволило сделать так, чтобы мой звук запускался, даже если приложение было в фоновом режиме.

6 голосов
/ 01 октября 2011

Вам нужно установить 'audio' как один из ваших UIBackgroundModes в Info.plist. У Apple есть документация по этому вопросу .

4 голосов
/ 15 ноября 2013

Запишите эту строку в plist для фонового запуска ...

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

Напишите этот код, где вы хотите использовать

AVAudioPlayer*  audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.urlForConevW error:&error];
audioPlayer.delegate = self;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
audioPlayer.numberOfLoops =  1;       
[audioPlayer play];
3 голосов
/ 07 октября 2014

Step1

Внести следующие изменения в info.plist

  1. Приложение не работает в фоновом режиме: НЕТ

  2. Необходимые фоновые режимы

    item0 :App plays audio or streams audio/video using AirPlay

Шаг 2 Не забудьте добавить следующие вещи в MainViewController.h файл

  1. #import <'AVFoundation/AVAudioPlayer.h>
  2. @interface MainViewController:<'AVAudioPlayerDelegate>

  3. AVAudioPlayer *H_audio_player;

Шаг 3 Добавьте следующий код в игровое действие вашего MainViewController класса.

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d-%d",C_CID, C_SID] ofType:@"mp3"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
H_audio_player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
H_audio_player.delegate = self;
H_audio_player.numberOfLoops = -1;
3 голосов
/ 06 июня 2012

Также важно, если вы используете MPMusicPlayerController: Вы должны использовать:

[MPMusicPlayerController iPodMusicPlayer] 

а не

[MPMusicPlayerController applicationMusicPlayer] 

Также, если вы не хотите, чтобы ваше приложение stop music, которое воспроизводилось при запуске приложения, посмотрите здесь AVAudioPlayer выключает iPod - как обойтись?

3 голосов
/ 01 октября 2011

Вы можете использовать MPMoviePlayerController даже для воспроизведения соло-аудио фильмов.Если вам это нравится, прочтите подробные технические вопросы и ответы по библиотеке Apple:

Технические вопросы по библиотеке для разработчиков iOS QA1668

2 голосов
/ 01 марта 2016

Из всех ответов отсутствует этот код для управления плеером при пробуждении пользователем устройства:

- (BOOL)canBecomeFirstResponder {
        return YES;
    }

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
    switch (event.subtype) {

        case UIEventSubtypeRemoteControlPlay:

            [_audioPlayer play];
            break;

        case UIEventSubtypeRemoteControlPause:

            [_audioPlayer pause];
            break;

        default:
            break;
    }
}

И у вас есть все эти варианты:

UIEventSubtypeRemoteControlPlay                 = 100,
UIEventSubtypeRemoteControlPause                = 101,
UIEventSubtypeRemoteControlStop                 = 102,
UIEventSubtypeRemoteControlTogglePlayPause      = 103,
UIEventSubtypeRemoteControlNextTrack            = 104,
UIEventSubtypeRemoteControlPreviousTrack        = 105,
UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
UIEventSubtypeRemoteControlEndSeekingBackward   = 107,
UIEventSubtypeRemoteControlBeginSeekingForward  = 108,
UIEventSubtypeRemoteControlEndSeekingForward    = 109,
2 голосов
/ 13 мая 2013

Я использую приведенный ниже код. Это работает для меня, и вызов по нажатию кнопки метода экземпляра аудиоплеера.

NSError *error; NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music" ofType:@"mp3"]]; 
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
[[AVAudioSession sharedInstance] setActive:YES error: &error]; 
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self.player prepareToPlay];
2 голосов
/ 01 октября 2011

Если даже после установки звука в качестве одного из UIBackgroundModes в списке воспроизведения звук останавливается при переходе в фоновый режим, попробуйте setting ваш application's audio session до media playback.

Вот соответствующая ссылка: https://developer.apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Introduction/Introduction.html

Вот как будет выглядеть код:

NSError *activationError = nil;
[[AVAudioSession sharedInstance] setActive: YES error: &activationError];

NSError*setCategoryError = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];
...