Подтвердить что ты не робот

Как заставить проигрыватель AVPlayer играть в фоновом режиме?

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

То, что я сделал до сих пор: Добавлены UIBackgroundModes, аудио в plist файл.

Сначала этот код:

radioAudio = [[AVAudioSession alloc] init];
[radioAudio setCategory:AVAudioSessionCategoryPlayback error:nil];
[radioAudio setActive:YES error:nil];

Затем это:

NSString *radioURL = @"http://xxx.xxx.xxx/radio.m3u";
radioPlayer = [[AVPlayer playerWithURL:[NSURL URLWithString:radioURL]] retain];

Но как только пользователь нажимает кнопку "домой", мой звук умирает.

Я также нашел это, но еще не добавил, что некоторые вещи, которые я прочитал, говорят, что это не нужно;

newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
     if (newTaskId != UIBackgroundTaskInvalid && bgTaskId != UIBackgroundTaskInvalid)
        [[UIApplication sharedApplication] endBackgroundTask: bgTaskId];
bgTaskId = newTaskId;

Прямо сейчас я понятия не имею, куда я должен пойти, чтобы мой AVPlayer позволил радио петь, пока пользователь делает другие вещи по телефону. Я тестирую это на iPhone 4 с 4.2. Построить его для 4.0.

У кого-нибудь есть предложения, что я должен делать?

4b9b3361

Ответ 1

Имел ту же проблему, но нашел решение для этого.

Смотрите здесь: https://devforums.apple.com/message/395049#395049

Содержимое приведенной выше ссылки:


Замените APPNAME своим собственным именем приложения!

Im на iOS 4.2.1

EDIT: работа с iOS5 + 6 + 7 до сих пор

Добавьте UIBackgroundModes в APPNAME-Info.plist, при этом приложение App воспроизводит аудио

Затем добавьте фреймворк AudioToolBox в рамки фреймов.

В APPNAMEAppDelegate.h добавить:

#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>

чтобы он выглядел следующим образом:

...
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
...

В APPNAMEAppDelegate.m добавьте следующее:

// Set AudioSession
NSError *sessionError = nil;
[[AVAudioSession sharedInstance] setDelegate:self];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];

/* Pick any one of them */
// 1. Overriding the output audio route
//UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
//AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);

// 2. Changing the default output audio route
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute);

в

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

но перед двумя строками:

[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];

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

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

Ответ 2

ОБНОВЛЕНИЕ IOS 11.2 с Swift 4:

Теперь, если вы используете AVPlayer для воспроизведения музыкальных файлов, вы также должны настроить MPNowPlayingInfoCenter.default(), чтобы отображать информацию о воспроизведении на экране блокировки.

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

Если вы также хотите контролировать работу, вы должны проверить проект образца яблока здесь: https://developer.apple.com/library/content/samplecode/MPRemoteCommandSample/Introduction/Intro.html#//apple_ref/doc/uid/TP40017322

Пример кода Apple охватывает все, но я нахожу его запутанным.

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

ВАЖНОЕ ПРИМЕЧАНИЕ: Если вы используете НЕ, используя AVPlayer для воспроизведения звука. Если вы используете некоторые сторонние библиотеки для создания звука или воспроизведения звукового файла, вы должны читать комментарии внутри кода. Также, если вы используете ios simulator 11.2, вы не сможете увидеть какие-либо элементы управления на экране блокировки. Вы должны использовать устройство, чтобы он работал.


1- Выбрать проект → capabilites → установить фоновые режимы ВКЛ → тик Audio, AirPlay и картинка в картинке

ios 11 background audio setting

2- Файл AppDelegate.swift должен выглядеть следующим образом:

import UIKit

import AVFoundation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
{

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
    {
        // Override point for customization after application launch.

        do
        {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

         //!! IMPORTANT !!
         /*
         If you're using 3rd party libraries to play sound or generate sound you should
         set sample rate manually here.
         Otherwise you wont be able to hear any sound when you lock screen
         */
            //try AVAudioSession.sharedInstance().setPreferredSampleRate(4096)
        }
        catch
        {
            print(error)
        }
        // This will enable to show nowplaying controls on lock screen
        application.beginReceivingRemoteControlEvents()

        return true
    }
}

3- ViewController.swift должен выглядеть следующим образом:

import UIKit

import AVFoundation
import MediaPlayer

class ViewController: UIViewController
{

    var player : AVPlayer = AVPlayer()

    override func viewDidLoad()
    {
        super.viewDidLoad()


        let path = Bundle.main.path(forResource: "music", ofType: "mp3")
        let url = URL(fileURLWithPath: path!)

        // !! IMPORTANT !!
        /*
            If you are using 3rd party libraries to play sound 
            or generate sound you should always setNowPlayingInfo 
            before you create your player object.

            right:
            self.setNowPlayingInfo()
            let notAVPlayer = SomePlayer()

            wrong(You won't be able to see any controls on lock screen.):
            let notAVPlayer = SomePlayer()
            self.setNowPlayingInfo()
         */

        self.setNowPlayingInfo()
        self.player = AVPlayer(url: url)

    }


    func setNowPlayingInfo()
    {
        let nowPlayingInfoCenter = MPNowPlayingInfoCenter.default()
        var nowPlayingInfo = nowPlayingInfoCenter.nowPlayingInfo ?? [String: Any]()

        let title = "title"
        let album = "album"
        let artworkData = Data()
        let image = UIImage(data: artworkData) ?? UIImage()
        let artwork = MPMediaItemArtwork(boundsSize: image.size, requestHandler: {  (_) -> UIImage in
            return image
        })

        nowPlayingInfo[MPMediaItemPropertyTitle] = title
        nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = album
        nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork

        nowPlayingInfoCenter.nowPlayingInfo = nowPlayingInfo
    }

    @IBAction func startPlayingButtonPressed(_ sender: Any)
    {
        self.player.play()
    }

OLD ANSWER IOS 8.2:

Ответ Патрика абсолютно прав.

Но я напишу, что я делаю для ios 8.2:

Я добавляю свое приложение info.plist требуемые фоновые режимы как показано ниже:

enter image description here

И в моем AppDelegate.h я добавляю следующие импорты:

#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>

Затем в моем AppDelegate.m я написал приложение didFinishLaunchingWithOptionsthis, как показано ниже:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

    return YES;
}

Теперь приложение продолжает воспроизводить музыку, даже если экран заблокирован:)

Ответ 3

Я успешно выполнил аудиозапись в фоновом режиме, добавив следующее к моему applicationDidFinishLaunching

// Registers this class as the delegate of the audio session.
[[AVAudioSession sharedInstance] setDelegate: self];    
// Allow the app sound to continue to play when the screen is locked.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

Ответ 4

iOS 9 Swift

Все, что вам нужно, это добавить следующее к вашему didFinishLaunchingWithOptions

do  {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch {
    //TODO
}

Ответ 5

У вас есть хороший пример приложения GPS-фона, которое воспроизводит звуки, даже если в фоновом режиме:

http://www.informit.com/articles/article.aspx?p=1646438&seqNum=5

В этом примере используется AudioToolbox.

Я сам выполнил тест, и он работает: создайте простой проект, который контролирует сообщение GPS ( UIBackgroundModes location)), и каждая полученная позиция x воспроизводит звук, используя

<КОД > AudioServicesPlaySystemSound (soundId);

Затем, если вы помещаете audio как часть вашего UIBackgroundModes и звуки будут воспроизводиться, даже если приложение больше не находится на переднем плане.

Я сделал такой тест, и он работает нормально!

(мне не удалось заставить его работать с AVPlayer, поэтому я отступил в AudioToolbox)

Ответ 6

У меня та же проблема, и я нашел решение в Apple Docs: https://developer.apple.com/library/ios/qa/qa1668/_index.html

В: Как обеспечить сохранение медиафайлов при использовании AV Foundation, когда мое приложение находится в фоновом режиме?

A: Вы должны объявить, что ваше приложение воспроизводит звуковой контент в фоновом режиме и назначает соответствующую категорию вашему сеансу аудио. См. Также Специальный Рекомендации для видеоматериалов.