2012-07-05 20 views
7

私のアプリはビデオを再生するので、サウンドをバックグラウンドで再生し続けます。しかし、「ホーム」ボタンを押すと再生が停止します。私がテストしているiOS 5.0.1のiPhone 4sAVPlayer:ホームボタンを押したときにバックグラウンドオーディオが停止しますが、ロックされた画面で再生されます

何が問題なのですか?

  • 動画が再生されていると私は画面をロック場合は、それは私がロック画面のコントロールから再生を制御することができ
  • をプレイし続ける:次、前、再生、一時停止を。
  • 私は「」、そしてマルチタスクバーから「リモコン」に行き、を押すと、それはに動作します。

何が問題なのですか。

  • 私は私が行うとき、オーディオはを停止するため、私は、「ホーム」ボタンを押すとアプリが遊んでおきたいです。

私が行っている:私のapp.plistで "必要なバックグラウンドモード" に

  • を追加しました "オーディオ"

は、アプリデリゲートの次のコードをアプリケーションに追加しました: didFinishLaunchingWithOptions:

NSError *setCategoryErr = nil; 
NSError *activationErr = nil; 
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];  
[[AVAudioSession sharedInstance] setActive:YES error:&activationErr]; 
すべての作品はどのように来

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

しかし、この:

は私のビューコントローラでは、私はリモコンを受信するためのメソッドを実装しましたか?

答えて

4

毎回スタックオーバーフローが緩やかになり、応答性が低下しています...うまくいけば、そこにいる誰にとってもそれほど悪くはありません。私はホームボタンを押した後にビデオが一時停止しているのはなぜか分かりませんでしたが、誰にも助けがあれば回避策があります:

アプリが再生されるまでプレイしているので背景に、私はタイマーを作成し、それはフォアグラウンドであったアプリが遊んでいたかどうかを確認するために、その場合、再生を再開:

- (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]; 
} 

ない私の意見では最良の選択肢が、今のところそれはですそれが再開している間、再生中に少しジャンプして動作します。

+2

ます。また、ムービーが再生されているときに 'UIApplicationDidEnterBackgroundNotification'にプレーヤー内から登録および削除することができますが確認します。タイマーを使用して、通知が開始されたときにビデオを再開する必要があります。 – MacTeo

+1

Otto Boyはすでにコメント[このリンク](https://developer.apple.com/library/content/qa/qa1668/_index.html)ですが、このケースではタイマーが良くありません。タイマーを使用する場合、0.1秒間の短時間停止があります。 AVPlayerをAVPlayerLayerから削除するだけです。 –

3

アップルのドキュメントからlinkをご覧になり、ビデオメディアに関する特別な考慮事項部分をお読みください。ここでは、動画が一時停止している理由とその回避方法について説明します。それは私を助けた。私は両方のオプションを試してみました。

1

スウィフト3

通知のための最初のレジスタのアプリがバックグラウンドに行くと戻ってくる:

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) 

オプション1からAVPlayerはそのAVPlayerLayerから追加/削除:

func appEnteredBackgound() { 
    playerLayer.player = nil 
} 

func appEnteredForeground() { 
    playerLayer.player = player 
} 

オプション2 - ビデオトラックを有効/無効にする:あなたは映画を停止すると

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 
     } 
    } 
    } 
} 
関連する問題