2011-01-22 2 views
23

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

Что я сделал до сих пор: Добавлен 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]; 

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

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

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

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

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

+0

Смотрите мой ответ в этом Que, вы найдете ваше решение [Нажмите здесь для просмотра ответа] [1 ] [1]: http: // stackoverflow.com/questions/15470452/is-it-possible-to-play-video-using-avplayer-in-background –

ответ

40

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

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

Содержание ссылки:


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

Im на прошивкой 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]; 

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

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

+2

Спасибо Patrick R! ! :) –

+0

Ваш прием :) –

+0

Спасибо Patrik R! Работает! –

10

Я успешно сделал аудио работать в фоновом режиме, добавив следующую строку в мой 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]; 
+0

Это не работает для меня, я, должно быть, испортил материал фона где-то еще в коде. Единственное, что я могу придумать, это то, что у меня NSNotificationCenter работает, чтобы проверять различные состояния приложения. Я ничего не делаю с ними, просто читая разные состояния. –

+0

Что я должен был сделать, чтобы я ничего не нашел в сети, которая заявляет об этом, заключается в том, чтобы зарегистрировать мой звук в AVAudioSession как активный, например: [[AVAudioSession sharedInstance] setActive: ДА error: NULL]; –

+0

Так оно работает с '[[AVAudioSession sharedInstance] setActive: ДА error: NULL];'? Интересно знать, запомнит это на будущее :) – atomoil

1

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

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

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

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

AudioServicesPlaySystemSound(soundId);

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

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

(я не смог заставить его работать с AVPlayer, так что я fallbacked к AudioToolbox)

23

UPDATE 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 -> набор режимов фона ON -> галочка Аудио, 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 ОТВЕТ IOS 8.2:

ответ Патрика совершенно прав.

Но я буду писать то, что я делаю для ИОС 8.2:

добавить свои приложения Info.plist необходимые режимы фона , как показано ниже:

enter image description here

И в моей AppDelegate.h i add these import:

#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; 
} 

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

+1

решение работало, но jyfi в Swift и ios 8.4 Мне не нужно было импортировать AudioToolbox – longbow

+0

easest. Благодаря! –

3

IOS 9 Swift

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

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

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

Q: How do I ensure my media will continue playing when using AV Foundation while my application is in the background?

A: You must declare your app plays audible content while in the background, and assign an appropriate category to your audio session. See also Special Considerations for Video Media .

Смежные вопросы