2012-07-05 4 views
7

Ok, damit meine App Videos wiedergibt, möchte ich, dass der Ton im Hintergrund weiterspielt. Aber wenn ich den Home-Button drücke, stoppt die Wiedergabe. Ich teste auf iPhone 4s mit iOS 5.0.1AVPlayer: Der Hintergrundton stoppt, wenn die Home-Taste gedrückt wird, spielt aber mit gesperrtem Bildschirm

Was funktioniert?

  • Wenn das Video abgespielt wird und ich den Bildschirm sperren, es,
  • I die Wiedergabe von den Sperrbildschirm steuert Kann Kontrolle hält spielen: Vor, Zurück, Play, Pause.
  • Wenn ich drücke „Haus“, dann gehen Sie zu dem „Fernbedienungen“ aus der Multitask-Bar, es funktioniert.

Was ist los?

  • Ich möchte die App weiterzuspielen, wenn ich „Home“ -Taste drücken, denn wenn ich es tue, Audio stoppt.

Was habe ich getan:

  • Added "Audio" auf "Erforderliche Hintergrund-Modus" in meinem app.plist

addierten die folgenden Code Anwendung AppDelegate: didFinishLaunchingWithOptions:

NSError *setCategoryErr = nil; 
NSError *activationErr = nil; 
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];  
[[AVAudioSession sharedInstance] setActive:YES error:&activationErr]; 

Meiner Ansicht Controller habe ich die Methoden implementiert Fernbedienungen zu erhalten:

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 
- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
    [self becomeFirstResponder]; 
} 
- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    //End recieving events 
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; 
    [self resignFirstResponder]; 
} 

- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent { 
    if (receivedEvent.type == UIEventTypeRemoteControl) { 

     switch (receivedEvent.subtype) { 

      case UIEventSubtypeRemoteControlTogglePlayPause: 
       [self play:nil]; 
       break; 

      case UIEventSubtypeRemoteControlPreviousTrack: 
       [self actionPlaybackPreviousItem]; 
       break; 

      case UIEventSubtypeRemoteControlNextTrack: 
       [self actionPlaybackNextItem]; 
       break; 

      default: 
       break; 
     } 
    } 
} 

Wie alles kommen funktioniert, aber das?

Antwort

4

Stack Overflow wird immer weniger reaktionsfähig ... Hoffentlich ist es nicht so schlecht für alle da draußen. Ich habe nichts gefunden, um darauf zu antworten, warum das Video nach dem Drücken der Home-Taste angehalten wurde. Ich habe jedoch einen Workaround, wenn es irgendjemandem hilft:

Da der Player spielt bis die App läuft in den Hintergrund, habe ich einen Timer erstellt, um zu überprüfen, ob die App zu spielen, während es im Vordergrund stand, wenn ja, fortsetzen der Wiedergabe:

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    MainViewController* mainController=self.viewController; 
    playerWasPlaying=mainController.player.rate!=0; 
} 

-(void)resumePlayback { 
    MainViewController* mainController=self.viewController; 
    if (mainController.player.rate==0&&playerWasPlaying) 
     [mainController play:nil]; 
} 
- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(resumePlayback) userInfo:nil repeats:NO]; 
} 

nicht die beste Option, meiner Meinung nach, aber es ist jetzt Arbeiten, mit einem kleinen Sprung in der Wiedergabe, während es fortgesetzt wird.

+2

Sie auch in Ihrem Player mit dem 'UIApplicationDidEnterBackgroundNotification' registrieren kann, wenn der Film abgespielt wird, und entfernen Sie das beobachten, wenn Sie den Film stoppen. Sie müssen immer noch einen Timer verwenden, um das Video beim Start der Benachrichtigung fortzusetzen. – MacTeo

+1

Otto Boy ist bereits Kommentar [this link] (https://developer.apple.com/library/content/qa/qa1668/_index.html), aber Timer ist nicht gut für diesen Fall. Wenn wir den Timer verwenden, gibt es einen kurzen Stopp während 0,1 Sekunden. Sie entfernen AVPlayer einfach von AVPlayerLayer. –

3

Sehen Sie diese link von Apple-Dokumentation, und lesen Sie die Spezielle Überlegungen für Video-Medien Teil. Hier wird erklärt, warum Video pausiert und wie Sie das vermeiden können. Es hat mir geholfen. Ich habe beide Möglichkeiten ausprobiert, und beide funktionieren gut.

1

Swift 3

erste Register für die Benachrichtigung, wenn Ihre App in den Hintergrund geht und kommt zurück:

NotificationCenter.default.addObserver(self, selector: #selector(appEnteredBackgound), name: Notification.Name.UIApplicationDidEnterBackground, object: nil) 
NotificationCenter.default.addObserver(self, selector: #selector(appEnteredForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil) 

Option 1 - entfernen/fügen Sie den AVPlayer von seinem AVPlayerLayer:

func appEnteredBackgound() { 
    playerLayer.player = nil 
} 

func appEnteredForeground() { 
    playerLayer.player = player 
} 

Option 2 - deaktivieren/aktivieren Videospuren:

func appEnteredBackgound() { 
    if let tracks = player.currentItem?.tracks { 
    for track in tracks { 
     if track.assetTrack.hasMediaCharacteristic(AVMediaCharacteristicVisual) { 
     track.isEnabled = false 
     } 
    } 
    } 
} 

func appEnteredForeground() { 
    if let tracks = player.currentItem?.tracks { 
    for track in tracks { 
     if track.assetTrack.hasMediaCharacteristic(AVMediaCharacteristicVisual) { 
     track.isEnabled = true 
     } 
    } 
    } 
}