Предотвращение буферизации cordova-plugin-playlist сразу всех треков - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь решить эту проблему уже несколько недель.Проблема связана с плагином Cordova, называемым cordova-plugin-playlist, который использует AVQueuePlayer.

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

Что я выяснил, зарегистрировав запросы на моем серверезаключается в том, что AVQueuePlayer пытается буферизовать все треки одновременно, а не буферизует только текущий и, возможно, следующий трек.Когда имеется 20 или меньше дорожек, все дорожки загружаются и воспроизводятся нормально, но когда их 30 или более, запрос кажется слишком большим для обработки, и запросы начинают истекать до того, как некоторые из дорожек смогутload.

Все треки добавляются с помощью метода insertItem AVQueuePlayer.Есть ли что-то в этом методе, что заставляет дорожку немедленно начинать буферизацию, как только она добавлена?Есть ли способ предотвратить такое поведение?Я бы хотел, чтобы только текущий и следующий треки были в буфере.Или я что-то принципиально недопонимаю?Заранее спасибо за вашу помощь!

1 Ответ

0 голосов
/ 05 декабря 2018

Я решил проблему.В случае, если это кому-нибудь поможет, проблема была не в самом AVQueuePlayer, а в подклассе AVBidirectionalQueuePlayer, включенном в плагин cordova-plugin-playlist.Проблема заключается в переопределенном методе insertItem в AVBidirectionQueuePlayer.m (строка 217 в моем случае).

if (CMTIME_IS_NUMERIC(item.duration)) {
    NSLog(@"duration: %5.2f", (double) CMTimeGetSeconds(item.duration));
        if (CMTimeCompare(_estimatedDuration, kCMTimeZero) == 0)
            _estimatedDuration = item.duration;
        else
            _estimatedDuration = CMTimeAdd(_estimatedDuration, item.duration);
}

Вызов item.duration вызывает загрузку дорожки (и она вызывается при каждом добавлении дорожки,поэтому он запускает ВСЕ треки для загрузки), что хорошо для меньшего количества треков, но с более чем 30 треками, примерно часом или дольше, мой сервер был перегружен, и запросы истекали.

В моем конкретном случае, похоже, что item.duration здесь никогда не бывает NUMERIC, поэтому я решил полностью закомментировать оператор IF.

...