Вопрос по iphone, ios, avplayer, ipad, mpmovieplayercontroller – AVPlayerItem replaceCurrentItemWithPlayerItem Blocking

27

Сначала небольшой контекст о приложении ...

- Там's много тяжелых операций пользовательского интерфейсас участием видеоплееров (в основном прокрутка)

- Видео динамичные и меняются в зависимости от нашей текущей страницы.

- так видеоОни должны быть динамичными и постоянно изменяться, а также интерфейс должен быть отзывчивым

Я изначально использовалMPMoviePlayerController но затем из-за определенных требований мне пришлось прибегнуть к AVPlayer

Я сделал свою собственную обертку для.AVPlayer

Чтобы изменить содержимое в videoPlayer, метод выглядит так в классе 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];

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

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

У меня нет, если это сработает ... вы можете опубликовать исправление здесь. Aatish Molasi
Я также застрял с этим ... НИКТО? Hernan Arber
Вы нашли какое-нибудь решение для этого? Adrian Demetrescu
@AdrianDemetrescu - нет .. пришлось вернуться к mpmovieplayer Aatish Molasi
Вы пробовали эти предложения?stackoverflow.com/questions/7420176/... gurooj

Ваш Ответ

2   ответа
2

Я точно не помню, как мы решили это, но IIRC потребовалось выполнить как можно больше настроек элемента в фоновом потоке и подождать, пока новый элемент сообщит, что это так.готов играть' перед звонком.replaceCurrentItemWithPlayerItem

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

18

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

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

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

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

Похожие вопросы