2012-07-05 27 views
7

Ok, vì vậy ứng dụng của tôi phát video, tôi muốn âm thanh tiếp tục phát trong nền. Nhưng khi tôi nhấn nút "Home", phát lại dừng lại. Tôi đang thử nghiệm trên iPhone 4s với iOS 5.0.1AVPlayer: Âm thanh nền dừng khi nhấn nút trang chủ, nhưng phát với màn hình khóa

Điều gì đang hoạt động?

  • Nếu video đang phát và tôi khóa màn hình, nó vẫn tiếp tục phát,
  • tôi có thể kiểm soát phát lại từ các điều khiển màn hình khóa: tiếp theo, trước, chơi, tạm dừng.
  • Nếu tôi bấm "nhà", sau đó đi đến "điều khiển từ xa" từ thanh đa nhiệm, nó hoạt động.

Có vấn đề gì?

  • Tôi muốn các ứng dụng để tiếp tục chơi khi tôi nhấn nút "home", bởi vì khi tôi làm, âm thanh dừng.

Tôi đã làm gì thế này:

  • Added "âm thanh" để "bắt buộc chế độ nền" trong app.plist tôi

Added đoạn mã sau để ứng dụng ứng dụng đại biểu của : didFinishLaunchingWithOptions:

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

Trong điều khiển xem của tôi, tôi đã thực hiện các phương pháp để nhận điều khiển từ xa:

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

Tại sao mọi thứ hoạt động nhưng, điều này?

Trả lời

4

Stack Overflow đang trở nên ít hơn và ít đáp ứng mỗi lần ... Hy vọng rằng nó không phải là quá xấu cho tất cả mọi người ra khỏi đó. Tôi đã không tìm thấy gì để trả lời tại sao video tạm dừng sau khi nhấn nút Trang chủ, tuy nhiên, tôi đã giải quyết nếu có sự trợ giúp cho bất kỳ ai:

Vì trình phát đang phát cho đến khi ứng dụng chạy để nền, tôi đã tạo ra một bộ đếm thời gian, để kiểm tra xem các ứng dụng đang chơi trong khi nó đang ở phía trước, nếu như vậy, tiếp tục phát lại:

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

Không phải là lựa chọn tốt nhất theo ý kiến ​​của tôi, nhưng bây giờ nó làm việc, với một chút nhảy trong phát lại trong khi nó tiếp tục.

+2

Bạn cũng có thể đăng ký từ bên trong máy nghe nhạc của mình vào 'UIApplicationDidEnterBackgroundNotification' khi phim đang phát và loại bỏ các quan sát khi bạn dừng phim. Bạn vẫn phải sử dụng bộ hẹn giờ để tiếp tục video khi thông báo được khởi chạy. – MacTeo

+1

Otto Boy đã bình luận [liên kết này] (https://developer.apple.com/library/content/qa/qa1668/_index.html), nhưng bộ hẹn giờ không tốt cho trường hợp này. Khi chúng tôi sử dụng bộ hẹn giờ, có một khoảng dừng ngắn trong khoảng 0.1 giây. Bạn chỉ cần loại bỏ AVPlayer khỏi AVPlayerLayer. –

3

Xem tài liệu này link từ tài liệu Apple và đọc Cân nhắc đặc biệt cho phương tiện video một phần. Đây là lý do tại sao video tạm dừng và cách bạn có thể tránh điều đó. Nó đã giúp đỡ tôi. Tôi đã thử cả hai tùy chọn và cả hai đều hoạt động tốt.

1

Swift 3

đăng ký đầu tiên cho thông báo khi ứng dụng của bạn đi vào nền và trở lại:

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) 

Lựa chọn 1 - xóa/thêm AVPlayer từ AVPlayerLayer của nó:

func appEnteredBackgound() { 
    playerLayer.player = nil 
} 

func appEnteredForeground() { 
    playerLayer.player = player 
} 

Lựa chọn 2 - tắt/bật theo dõi video:

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