Установка AVPlayerViewController.player на ноль ломает закрытые титры - PullRequest
0 голосов
/ 27 сентября 2019

Согласно документации 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?

...