2017-05-16 3 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]; 
} 

나는 이벤트를 받기 AM하지만 오디오는 PAUSE 메소드를 호출하면 일시 정지하지 않습니다 AVPLAYER.

편집 2 : 아이폰 OS 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에 아무런 가치가 없으므로 PlayerController 인스턴스를 가져 오기 위해 PageViewController 클래스를 사용했습니다. 그런 다음이 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 사용이 코드를 기기 수령에 대한

 // 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]; 

받으십시오 원격 알림 메세지를 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

질문에서 이미 언급했듯이, 나는 PLAY/PAUSE EVENTS를 받고 있습니다. 일시 중지 기능을 호출 할 때 오디오를 일시 중지 할 수 없다는 것입니다. 질문을 수정하겠습니다. –

+0

AVPlayer 클래스의 이벤트를 처리하고 있습니까? 또는 AppDelgate에서? –

+0

AppDelegate. 나는 그 질문을 편집했다. 이 문제를 조사해 주셔서 감사합니다. –

관련 문제