Запретить AVQueuePlayer от буферизации всех дорожек одновременно
Я пытался решить эту проблему в течение нескольких недель. Проблема связана с плагином Cordova, который называется cordova-plugin-playlist и использует AVQueuePlayer.
Проблема заключается в том, что при добавлении большого количества треков (более 30) время ожидания нескольких треков при попытке буферизации увеличивается. Из-за этого AVQueuePlayer может воспроизводить только некоторые треки, которые я пытаюсь загрузить (он просто пропускает треки с ошибками при попытке их воспроизвести). Следы, которые истекают, всегда случайны. Попытка добавить только первые 15 или около того треков из одного и того же списка увенчалась успехом, поэтому, похоже, это напрямую связано с количеством добавляемых треков.
Что я выяснил, регистрируя запросы к моему серверу, так это то, что AVQueuePlayer пытается буферизовать все треки одновременно, а не буферизует только текущий и, возможно, следующий трек. Когда имеется 20 или менее треков, все треки загружаются и воспроизводятся нормально, но когда их 30 или более, запрос кажется слишком большим для обработки, и запросы начинают истекать до того, как некоторые из треков смогут нагрузки.
Все треки добавляются с помощью метода insertItem AVQueuePlayer. Есть ли что-то в этом методе, что заставляет трек немедленно начинать буферизацию, как только он добавлен? Есть ли способ предотвратить такое поведение? Я бы хотел, чтобы только текущий и следующий треки были в буфере. Или я что-то принципиально недопонимаю? Заранее спасибо за вашу помощь!
0 ответов
Я решил проблему. В случае, если это кому-нибудь поможет, проблема была не в самом 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.