Как избежать 15-секундной задержки / кэширования в Android Media Player при воспроизведении потока - PullRequest
8 голосов
/ 04 октября 2011

Я использую медиаплеер, который воспроизводит поток с удаленного компьютера.С помощью моего приложения я могу управлять удаленным компьютером (например, искать в секунду).Работает как шарм, но: Android Media Player буферизует некоторые безумные 10-15 секунд (!!), что означает, что каждый щелчок («поиск») вступает в силу 10-15 секунд, даже если до появления нового он меньше секундыданные поступают.

Мой вопрос: есть ли способ контролировать (ограничивать) это кэширование?Или я просто что-то делаю не так?Единственная ли у меня эта проблема?

Мой код очень прост:

player = new MediaPlayer()
player.setDataSource(url);
player.setOnPreparedListener(new OnPreparedListener() {

    public void onPrepared(MediaPlayer mp) {
        mp.start();
    }
});
player.prepareAsync();

Я использую локальный мини-HTTP-сервер для самостоятельного подключения моего потока байтов к медиа-плееру Android.Похоже, что Android DRM задерживает / кэширует в этом случае.Все еще не совсем понятно, почему (и почему нет, если я подключаюсь к своему IIS, на котором размещен файл).Также не знаю, как обойти это.

Ответы [ 4 ]

1 голос
/ 06 октября 2011

Хорошо, пока что я подошел к решению. Оказалось, источником моей проблемы является Android DRM! (Нет, я не играю защищенный файл. Стандартный mp3).

DRM, кажется, был представлен в Android 3.1 (я тестировал на Galaxy Tab 10.1). На Эмуляторе работает нормально (может быть, DRM там не реализован?)

Есть идеи, как это можно отключить или ускорить? Кажется, в глубине Android DRM есть таймер на 10 секунд, который ждет - что угодно, не знаю. Мой журнал ошибок:

10-06 17:38:19.020: ERROR/MediaExtractor(226): **********MediaExtractor::Create
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(226): add uniqueid
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 1
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :ADD_UNIQUEID
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 3
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :ADD_CLIENT
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(226): Entering BpDrmManagerService::openDecryptSession
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 27
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI
10-06 17:38:19.020: ERROR/DrmManagerService(Native)(225): Entering DrmManagerService::openDecryptSession with uri

10 seconds wait

10-06 17:38:29.040: ERROR/DrmManager(Native)(225): DrmManager::openDecryptSession: no capable plug-in found
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): NULL decryptHandle is returned
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(226): no decryptHandle is generated in service side
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(226): remove uniqueid
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 2
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :REMOVE_UNIQUEID
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 4
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :REMOVE_CLIENT
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(226): setDrmServiceListener
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 5
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER
10-06 17:38:29.040: ERROR/DrmManagerService(Native)(225): Entering setDrmServiceListener
0 голосов
/ 18 июля 2014

Одна вещь, которую я понял в более новых версиях Android, заключается в том, что, похоже, возникают проблемы с файлами VBR MP3.Он воспроизводит их, но перед запуском буферизует слишком много данных.(3+ МБ, большинство моих тестовых файлов).

Обходной путь (неудачный взлом) - удалить заголовок XING из файлов MP3 (здесь хранится информация VBR).Похоже, это заставляет проигрыватель вернуться к более простому алгоритму и успешно начать воспроизведение для всех моих файлов после буферизации только 100 КБ ...

0 голосов
/ 01 июля 2014

Проблема может быть не только в Android Media Player.Сервер, поддерживающий потоковое видео, должен поддерживать необходимый формат.

Если это mp4, вам необходимо установить модуль псевдопотоковой передачи h264 (то же самое для HLS). Если это MSS (microSoft Smooth Streaming) - существуют специальные модули для IIS.

Кроме того, после того, как пользователь «выполнит поиск», это означает, что Native Player отправит запрос диапазона, который должен поддерживаться сервером.Nginx поддерживает их по умолчанию, ISS и Apache имеют некоторые проблемы с этим.Хотя легко настраивается.

0 голосов
/ 04 октября 2011

Попробуйте это.это вам определенно поможет:

1004 *

OnCreate ()

new TouchandshowTask().execute();
...