7

さて、私のアプリはビデオを再生するので、サウンドをバックグラウンドで再生し続けたいと思います。しかし、「ホーム」ボタンを押すと再生が停止します。iOS5.0.1を搭載したiPhone4sでテストしています

何が機能していますか?

  • ビデオが再生されていて、画面をロックすると、再生が続きます、
  • ロック画面のコントロールから再生を制御できます:次、前、再生、一時停止。
  • 「ホーム」を押してから、マルチタスクバーから「リモコン」に移動すると、動作します。

どうしたの?

  • 「ホーム」ボタンを押してもアプリの再生を続けたいのですが、押すと音声が止まります。

私が何をした:

  • 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

5 に答える 5

4

Stack Overflowは、毎回応答性が低下しています...うまくいけば、そこにいるすべての人にとってそれほど悪くはありません。ホームボタンを押した後にビデオが一時停止するのはなぜですか?応答するものは何も見つかりませんでしたが、誰かに役立つ場合は回避策があります。

アプリがバックグラウンドに移行するまでプレーヤーが再生しているので、タイマーを作成しました。アプリがフォアグラウンドにあるときにアプリが再生されているかどうかを確認し、再生されている場合は、再生を再開します。

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

私の意見では最善の選択肢ではありませんが、今のところは機能しており、再開中に再生が少しジャンプします。

于 2012-07-07T23:34:04.347 に答える
4

Appleのドキュメントからこのリンクを参照し、ビデオメディアの特別な考慮事項の部分をお読みください。ここでは、ビデオが一時停止している理由と、それを回避する方法について説明します。それは私を助けました。私は両方のオプションを試しましたが、どちらもうまく機能します。

于 2014-04-13T08:16:34.690 に答える
3

スウィフト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
      }
    }
  }
}
于 2017-04-28T07:30:23.750 に答える
3

iOS14。上記のメソッドが機能しないという問題に直面した場合は、通知の(Notification.Name("UISceneDidEnterBackgroundNotification")代わりに通知UIApplication.didEnterBackgroundNotificationまたはAppDelegateの対応するメソッドを使用してください。

于 2020-10-01T10:10:43.600 に答える
1

迅速な4+の場合。

アプリがバックグラウンドに移行して戻ってきたときの通知を最初に登録します。

NotificationCenter.default.addObserver(self, selector: #selector(appEnteredBackgound), name: UIApplication.didEnterBackgroundNotification, object: nil)

NotificationCenter.default.addObserver(self, selector: #selector(appEnteredForeground), name: UIApplication.willEnterForegroundNotification, object: nil)

オプション1-AVPlayerレイヤーからAVPlayerを削除/追加します。

@objc func appEnteredBackgound() {
  playerLayer.player = nil
}

@objc func appEnteredForeground() {
  playerLayer.player = player
}

オプション2-ビデオトラックを無効/有効にします。

@objc func appEnteredBackgound() {
        if let tracks = player?.currentItem?.tracks {
            for track in tracks {
                if (track.assetTrack?.hasMediaCharacteristic(AVMediaCharacteristic.visual))! {
                    track.isEnabled = false
                }
            }
        }
    }

    @objc func appEnteredForeground() {
        if let tracks = player?.currentItem?.tracks {
            for track in tracks {
                if (track.assetTrack?.hasMediaCharacteristic(AVMediaCharacteristic.visual))! {
                    track.isEnabled = true
                }
            }
        }
    }
于 2019-07-13T08:55:18.727 に答える