2017-05-16 10 views
3

アプリが再生中の場合、音声と電話画面がロックされている場合、制御画面は次のように表示されます。これらのメソッドがトリガーされた場合でもavplayerは、画面がロックされている場合、一時停止ボタンをクリックすると一時停止しません。

- (void) pause { 
    [self.avPlayer pause]; 
} 

- (void) play { 
    [self.avPlayer play]; 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    MPRemoteCommandCenter *rcc = [MPRemoteCommandCenter sharedCommandCenter]; 
[[rcc skipForwardCommand] setEnabled:NO]; 
[[rcc skipBackwardCommand] setEnabled:NO]; 
[[rcc nextTrackCommand] setEnabled:NO]; 
[[rcc previousTrackCommand] setEnabled:NO]; 
[[rcc skipForwardCommand] setEnabled:NO]; 
[[rcc skipBackwardCommand] setEnabled:NO]; 
rcc.playCommand.enabled = YES; 
rcc.pauseCommand.enabled = YES; 
[[MPRemoteCommandCenter sharedCommandCenter].playCommand addTarget:self action:@selector(play)]; 
[[MPRemoteCommandCenter sharedCommandCenter].pauseCommand addTarget:self action:@selector(pause)]; 
} 

- (void) play { 
[[MyVideoController instance] play]; 
} 

- (void) pause { 
[[MyVideoController instance] pause]; 
} 

クラスMyVideoControllerがで構成されています。私は、私は実装私のappdelegateでavplayer

enter image description here

上の任意のアクションを取ることはできませんよ(チェックするためにブレークポイントが追加されました)、avplayerに対するアクションは実行されません。何があっても、avplayerは一時停止しません。

avplayerを一時停止する方法はありますか?私AppDelegateでは、完全なコード

を追加 :

EDIT 1

- (void) remoteControlReceivedWithEvent: (UIEvent *) event { 
[[ZVideoPlayerController instance] eventReceived:event]; 
if (event.type == UIEventTypeRemoteControl) { 
    switch (event.subtype) { 
     case UIEventSubtypeRemoteControlTogglePlayPause: { 

      break; 
     } 
     case UIEventSubtypeRemoteControlPlay: { 
      [[ZVideoPlayerController instance] play]; 
      break; 
     } 
     case UIEventSubtypeRemoteControlPause: { 
      [[ZVideoPlayerController instance] pause]; 
      break; 
     } 
     default: 
      break; 
    } 
} 

}

- (void)applicationDidEnterBackground:(UIApplication *)application { 
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
[self becomeFirstResponder]; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application { 
[[UIApplication sharedApplication] endReceivingRemoteControlEvents]; 
} 

私はイベントを受け付けておりますが、オーディオは、PAUSEメソッドを呼び出すUPON一時停止しませんAVPLAYER。

EDIT 2:IOSの7.1でAVPlayer

AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil]; 
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset]; 
AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryPlayback error:nil]; 
NSError *activationError = nil; 
BOOL success = [[AVAudioSession sharedInstance] setActive: YES error: &activationError]; 

NSMutableDictionary *songInfo = [[NSMutableDictionary alloc] init]; 

MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage: [UIImage imageNamed:@"Audio_Thumbnail_Play"]]; 
[songInfo setObject:title forKey:MPMediaItemPropertyTitle]; 
[songInfo setObject:@"100" forKey:MPMediaItemPropertyPlaybackDuration]; 
[songInfo setObject:albumArt forKey:MPMediaItemPropertyArtwork]; 
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songInfo]; 
self.avPlayer = [AVPlayer playerWithPlayerItem:playerItem]; 
self.avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:self.avPlayer]; 
+0

ポーズ方法の代わりに、レートを0.0に設定してもう一度確認してください。 –

+0

私はself.avPlayer.rate = 0.0を試しました。同様に運がない。 –

答えて

2

そのご希望のイベントを取得し、更新状態で、私は問題の解決策を見つけました。私がavPlayerの価値を得ていなかったので、私はPageViewControllerクラスを使用してPlayerControllerのインスタンスを取得しました。次に、このplayerContentのインスタンスを使用して、avplayerの再生と一時停止を行いました。このインスタンスはavPlayerへの参照を保持するためです。

- (PlayerController *)getVideoController { 
NSArray *controllers = [UtiliyClass getNavigationController].viewControllers; 
PageViewController *pageController = nil; 
for (UIViewController *cont in controllers) { 
    if ([cont isKindOfClass:[PageViewController class]]) { 
     pageController = (PageViewController *)cont; 
     break; 
    } 
} 
if (pageController == nil) { 
    return nil; 
} 
NSArray *objectsController =pageController.pageController.viewControllers; 
PlayerController *videoPlayerController = nil; 
for (UIViewController *item in objectsController) { 
    if ([item isKindOfClass:[PlayerController class]]) { 
     videoPlayerController = (PlayerController *)item; 
     break; 
    } 
} 
return videoPlayerController; 
} 

- (void) pause { 
PlayerController *controller = [self getVideoController]; 
[controller.avPlayer pause]; 
} 

- (void) play { 
PlayerController *controller = [self getVideoController]; 
[controller.avPlayer play]; 
} 
0

を初期化し、後でPlayerControllerクラス

+ (instancetype)instance { 
static id instance = nil; 
if (instance == nil) 
{ 
    static dispatch_once_t onceToken = 0; 
    dispatch_once(&onceToken, ^(void) { 
     NSAssert(instance == nil, @"Singleton instance is already allocated."); 
     instance = [[super allocWithZone:NULL] init]; 
    }); 
} 
return instance; 
} 

で インスタンス宣言は、リモートコントロールイベントを登録するために、共有MPRemoteCommandCenterオブジェクトを使用します。共有コマンドセンターオブジェクトを使用する場合は、このメソッドを呼び出す必要はありません。 このメソッドは、レスポンダチェーンを使用してリモートコントロールイベントの配信を開始します。リモートコントロールイベントは、アプリケーションによって提示されるマルチメディアを制御するためのヘッドセットおよび外部アクセサリによって発行されるコマンドとして発生します。リモートコントロールイベントの受信を停止するには、endReceivingRemoteControlEvents()を呼び出す必要があります。あなたがリモート通知を登録する必要があり

- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent { 

    if (receivedEvent.type == UIEventTypeRemoteControl) { 

     switch (receivedEvent.subtype) { 

      case UIEventSubtypeRemoteControlPreviousTrack: 

       break; 

      case UIEventSubtypeRemoteControlNextTrack: 

       break; 

      case UIEventSubtypeRemoteControlPlay: 
       [[MyVideoController instance] play]; 
       break; 

      case UIEventSubtypeRemoteControlPause: 
       [[MyVideoController instance] pause]; 
       break; 

      default: 
       break; 
     } 
    } 
} 
1

:commadn使用にこのコードをrecivingため

 // Initialize the AVAudioSession here. 
     if (![[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&myErr]) { 
      // Handle the error here. 
      NSLog(@"Audio Session error %@, %@", myErr, [myErr userInfo]); 
     } 
     else{ 
      // Since there were no errors initializing the session, we'll allow begin receiving remote control events 
      [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
     } 

は、リモートコントロールイベントを初期化オーディオシーズンdidfinishlunchingにするために、この次のコードを追加してもらいますアプリケーションがロックされているときにプレーヤーの状態を更新します。そのために、次の従います。

applicationDidEnterBackgroundに理想的には、あなたのAppDelegateでこれを追加します。

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
[self becomeFirstResponder]; 

そして、これをapplicationDidBecomeActiveに:

[[UIApplication sharedApplication] endReceivingRemoteControlEvents]; 

レシーブリモートnotifcationsをAppDelagateでこれを追加することにより、 。これは、電話がロックされているときのすべてのアクションを聴きます。

- (void)remoteControlReceivedWithEvent:(UIEvent *)event { 
    if (event.type == UIEventTypeRemoteControl){ 
     // Call method of your player where you want to make change (Pause , Paly), 
     // I am calling a shared view for example, Its up to your logic how you want to deal it 
     [[AudioPlayerView sharedPlayerView] remoteControlReceivedWithEvent:event]; 


    } 
} 

し、それに応じて

- (void)remoteControlReceivedWithEvent:(UIEvent *)event { 

     if (event.type == UIEventTypeRemoteControl){ 
      switch (event.subtype){ 
       case UIEventSubtypeRemoteControlPlay: 
        [[MyVideoController instance] play]; 
        break; 
       case UIEventSubtypeRemoteControlPause: 
        [[MyVideoController instance] pause]; 
        break; 

       case UIEventSubtypeRemoteControlTogglePlayPause: 
        // Check if state is playing , call pause else call play 
        break; 
       } 
     default: 
      break; 
     } 
    } 
} 
+0

私はすでに質問で言及したように、私は再生/一時停止イベントを受信して​​います。一時停止機能を呼び出すと音声を一時停止することができません。質問を編集させてください。 –

+0

AVPlayerクラスのイベントを処理していますか?またはAppDelgateで? –

+0

AppDelegate。私はその質問を編集した。これを見ていただきありがとうございます。 –

関連する問題