Подтвердить что ты не робот

Потоковая передача Android MediaPlayer прекращается при изменении сети

Я транслирую аудио с помощью MediaPlayer на Android.

Когда устройство переходит из Wi-Fi в сотовую сеть или наоборот, MediaPlayer останавливает воспроизведение.

Обычно в буфере звучит несколько секунд, поэтому воспроизведение не прекращается немедленно.

В идеале я хотел бы получить поток для непрерывного воспроизведения, но я не вижу, как это сделать.

Я работаю с обоими mp3 файлами, размещенными на сервере, и потоком прямой трансляции.

4b9b3361

Ответ 1

С точки зрения серверов, изменение сетевого режима с WiFi на 3G (наоборот) будет выглядеть как новое соединение от отдельного IP-клиента (клиента).

Если сервер, который вы загружаете, не поддерживает отслеживание потока (например, количество секунд, последовательность, байт) (в отличие от медиа-серверов), ему придется снова начать подавать ваш mp3 с 0 байт.

Если ваш URL указывает на файл MP3, расположенный на стандартном HTTP-сервере, ваша ситуация будет ожидаемой. Вы должны изучить использование медиа-потокового сервера, чтобы вы могли возобновить загрузку/потоковое воспроизведение по вашему выбору. Когда вы получаете намерение потерять/возобновить соединение, вы можете указать своего медиаплеера на новый URL-адрес с позицией файла в URL-адресе (например, секунды = 19, байты = 57365).

Не уверен, что это поможет вам, но это немного объясняет, что происходит "за кулисами".

Ответ 2

Попробуйте установить setOnCompletionListener и setOnErrorListener. В режиме реального времени вы можете просто вызвать prepareAsync() снова, и это снова вызовет поток. Нет никакого изящного способа сделать это действительно, если вы не напишете собственную медиа-инфраструктуру.

Вы также можете прослушать в onError() для MEDIA_ERROR_SERVER_DIED, затем вы можете снова запустить prepareAsync().

Вы обнаружите, что MediaPlayer будет либо Ошибка, либо завершена. Если вы будете обрабатывать оба этих обратных вызова, по крайней мере, вы можете перезапустить поток при смене сети, как для плавного воспроизведения.. для чего потребуется специальная медиафрейм, так как андроид один довольно дрянной.

Ответ 3

Я не знаю, почему ваш медиаплеер останавливается, но, возможно, вы можете добавить метод onReceive и поместить "mp.start()" в метод, чтобы перезапустить воспроизведение.
Android, Как обрабатывать изменения в сети (от GPRS до Wi-Fi и наоборот) при опросе данных

Вам может потребоваться создать отдельный класс, но это должно объяснить, как создать метод, который вызывается при переключении сетей, после чего вы можете вызвать "mp.start()", чтобы возобновить воспроизведение (если mp - ваш MediaPlayer).
Это предполагает, конечно, что ваш MediaPlayer только приостановлен при переключении сетей, а не остановлен.

Ответ 4

Как говорит Видар, восстановление соединения будет рассматриваться сервером как новое соединение.

Похоже, мне нужно удвоить буфер воспроизведения аудио, что означает создание пользовательского медиаплеера. Это может обеспечить непрерывный звук, но он все равно будет пропускать при прослушивании живого потока.

MP3 файл немного проще, потому что я могу узнать позицию воспроизведения. Не так с живым потоком.

Как говорит gmaster, мне понадобится широковещательный приемник, чтобы установить новое соединение при изменении сети. Аудио буфер от предыдущего сетевого соединения должен продолжать воспроизводиться, когда новый звуковой буфер заполняется через новое соединение.

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

Поскольку потоки буферов в реальном времени не могут быть синхронизированы, при их переключении неизбежно произойдет сбой.

Больший буфер позволит избежать выпадения звука, если для установления соединения потребуется некоторое время, но задержит первый запуск воспроизведения. Файл MP3 можно загрузить и заполнить буфер быстрее, чем в реальном времени, но живой поток будет буферизироваться в реальном времени.

Chris.Jenkins упоминает некоторые методы MediaPlayer, которые могут помочь, но указывает, что для этого, похоже, нужна настраиваемая инфраструктура. Он должен будет обрабатывать условия, о которых он упоминает, и другие.

Если я смогу сделать это красивым, я отправлю его здесь. Я собираюсь оставить вопрос открытым.