AVPlayerItem replaceCurrentItemWithPlayerItem Blocking

Сначала немного контекста о приложении ...
 - Существует много тяжелых операций пользовательского интерфейса с участием видеоплееров (в основном прокрутки)
 - Видеоролики динамичны и меняются в зависимости от нашей текущей страницы.
 - поэтому видео должно быть динамичным и постоянно меняться, а также пользовательский интерфейс должен быть отзывчивым

Я изначально использовал MPMoviePlayerController , но затем из-за определенных требований мне пришлось вернуться на AVPlayer
Я создал свою собственную оболочку для AVPlayer .
Чтобы изменить содержимое в видеоплеере, это выглядит так, как в классе AVPlayer-wrapper

/**We need to change the whole playerItem each time we wish to change a video url */
-(void)initializePlayerWithUrl:(NSURL *)url
{
    AVPlayerItem *tempItem = [AVPlayerItem playerItemWithURL:url];

    [tempItem addObserver:self forKeyPath:@"status"
                  options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
                  context:nil];
    [tempItem addObserver:self forKeyPath:@"playbackBufferEmpty"
                  options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
                  context:nil];

    //Not sure if this should be stopped or paused under the ideal circumstances
    //These will be changed to custom enums later
    [self setPlaybackState:MPMoviePlaybackStateStopped];
    [self setLoadState:MPMovieLoadStateUnknown];
    [self.videoPlayer replaceCurrentItemWithPlayerItem:tempItem];

    //This is required only if we wish to pause the video immediately as we change the url
    //[self.videoPlayer pause];
}

Теперь, конечно, все работает нормально ...... кроме ..

[self.videoPlayer replaceCurrentItemWithPlayerItem:tempItem];

Кажется, блокирует пользовательский интерфейс на долю секунды, и во время прокрутки это делает пользовательский интерфейс действительно невосприимчивым и уродливым, и эта операция не может выполняться в фоновом режиме

Есть ли какое-либо исправление или обходное решение для этого ...?

27
nl ja de
@AdrianDemetrescu - нет. Пришлось вернуться к mpmovieplayer
добавлено автор Aatish Molasi, источник
У меня нет, если это работает ... вы можете опубликовать исправление здесь
добавлено автор Aatish Molasi, источник
Я тоже застрял с этим ... ЛЮБОЙ?
добавлено автор Hernan Arber, источник
Вы пробовали эти предложения? iOS 4 3 3"> stackoverflow .com/вопросы/7420176/& hellip;
добавлено автор gurooj, источник
Вы нашли решение для этого?
добавлено автор Adrian Demetrescu, источник

2 ответы

Решение, которое я нашел, состояло в том, чтобы гарантировать, что базовый AVAsset готов вернуть основную информацию, такую ​​как ее продолжительность, перед подачей ее в AVPlayer . AVAsset имеет метод loadValuesAsynchronouslyForKeys: , который подходит для этого:

AVAsset *asset = [AVAsset assetWithURL:self.mediaURL];
[asset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler:^{
    AVPlayerItem *newItem = [[AVPlayerItem alloc] initWithAsset:asset];
    [self.avPlayer replaceCurrentItemWithPlayerItem:newItem];
}];

В моем случае URL-адрес является сетевым ресурсом, а replaceCurrentItemWithPlayerItem: будет фактически блокироваться в течение нескольких секунд, ожидая, когда эта информация будет загружена в противном случае.

16
добавлено
это решение работало и на меня! благодаря!
добавлено автор Pranoy C, источник
Даже после получения информации («продолжительность») она блокирует ui в течение нескольких секунд до начала потоковой передачи, когда в медленной сети
добавлено автор souvickcse, источник
Согласно Apple Docs, эти методы AVPlayer и AVPlayerItem должны быть вызваны в основной поток.
добавлено автор TheHappySloth, источник

У нас была такая же проблема при создании Ultravisual. Я не могу точно помнить, как мы его решили, но в рамках IIRC он выполнял как можно больше настроек элемента в фоновом потоке и ожидал, пока новый элемент не сообщит, что он «готов к игре» перед вызовом replaceCurrentItemWithPlayerItem .

К сожалению, это связано с танцем вуду с несколько непоследовательным асинхронным KVO, что не забавно.

2
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.