Согласно документации Apple, если вы хотите воспроизвести аудиоконтент видео в фоновом режиме, вы должны отключить AVPlayer
от его AVPlayerViewController
или AVPlayerLayer
, когда приложение перемещается в фоновый режим, чтобы предотвратитьзвук из автоматической паузы:
https://developer.apple.com/documentation/avfoundation/media_assets_playback_and_editing/creating_a_basic_video_player_ios_and_tvos/playing_audio_from_a_video_asset_in_the_background
Я заметил, что в iOS 13 это приводит к разрыву закрытых титров.Я создал новый проект (приложение с одним представлением), чтобы создать минимальный вариант воспроизведения для этой проблемы.Моя раскадровка состоит из одного представления с одной кнопкой, и кнопка подключается к контроллеру представления как действие («playPressed»).Вот код моего ViewController.m
:
//
// ViewController.m
// AVPlayerViewControllerBug
//
// Created by Steven Barnett on 9/27/19.
// Copyright © 2019 BlueFrame Tech. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
{
@private
AVPlayerViewController *controller;
AVPlayer *player;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
controller = [[AVPlayerViewController alloc] init];
player = [[AVPlayer alloc] initWithURL:[NSURL URLWithString:@"https://vcloud.blueframetech.com/file/hls/143758.m3u8"]];
controller.player = player;
[player addObserver:self forKeyPath:@"rate" options:0 context:nil];
}
- (IBAction)playPressed:(id)sender {
[self presentViewController:controller animated:YES completion:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
// Since we're ONLY observing "rate" on the player, assume
// that's what changed to call this
AVPlayer *player = (AVPlayer*)object;
if (player.rate == 0)
{
// Unbind the player from the view controller when paused
controller.player = nil;
// Since I haven't built custom controls for the player,
// when it's unbound there's no way to hit the play
// button. So we'll just start playing after a timer
// has elapsed
[NSTimer scheduledTimerWithTimeInterval:2.0 repeats:NO block:^(NSTimer * _Nonnull timer) {
[player play];
}];
}
else
{
// Re-bind the player when playing
controller.player = player;
}
}
@end
Если вы скопируете этот код в свое собственное приложение или просто попробуете его для себя, вы увидите, что когда вызывается controller.player = nil
, это вызываетподписи, чтобы перестать работать на AVPlayer
.Единственный способ исправить это - удалить объект AVPlayer
и создать вместо него совершенно новый AVPlayer
.
Есть что-то, чего мне не хватает, вызов какого-то методане в курсе или что то я недопонимаю?Или это просто ошибка iOS 13?