Android MediaPlayer "Сброс соединения по пиру" - PullRequest
3 голосов
/ 16 августа 2011

Мы используем MediaPlayer для потоковой передачи музыки в формате mp3, которая сначала кэшируется в локальный файл, а MediaPlayer - для потоковой передачи через локальный сервер.Он работал довольно хорошо (около 1,5 лет на любых устройствах с Android> 1.6), пока Sony Ericsson Xperia X10 не обновился до Android 2.3.3.Внезапно и только на этом устройстве и с Android 2.3.3 перестало работать потоковое аудио.

MediaPlayer иногда выдает ошибку (100,0), но в основном это просто метод MediaPlayer.prepareAsync().Расследование показывает, что проблема возникает из-за

“java.net.SocketException: Connection reset by peer” 

, который указывает на строку:

outstream.write(buffer, skipFirst, length); 

, которая, кстати, успешно выполняется 2 раза до исключения

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

По какой-то причине MediaPlayer закрывает соединение как раз в тот момент, когда мы начинаем его наполнять контентом.Также, что кажется довольно странным, время от времени (1/20) MediaPlayer удается воспроизводить музыку.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 30 мая 2012

Убедитесь, что ваш прокси правильно анализирует HTTP-заголовок Range.Устройства Xperia отправляют запросы диапазона в виде Range: bytes=10000-20000 вместо более распространенного Range: bytes=10000-.

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

0 голосов
/ 21 января 2013

Когда вы ищете или пропускаете, или соединение потеряно, и MediaPlayer продолжает переподключаться к прокси-серверу, вы должны отправить этот ответ со статусом 206 после получения запроса и диапазона (int) от клиента.

String headers += "HTTP/1.1 206 Partial Content\r\n";
headers += "Content-Type: audio/mpeg\r\n";
headers += "Accept-Ranges: bytes\r\n";
headers += "Content-Length: " + (fileSize-range) + "\r\n";
headers += "Content-Range: bytes "+range + "-" + fileSize + "/*\r\n";
headers += "\r\n";

И когда вы получаете запрос от MediaPlayer, который не содержит Range в заголовке HTTP, он запрашивает новый файл потока, в этом случае ваш заголовок ответа должен выглядеть следующим образом:

String headers = "HTTP/1.1 200 OK\r\n";
headers += "Content-Type: audio/mpeg\r\n";
headers += "Accept-Ranges: bytes\r\n";
headers += "Content-Length: " + fileSize + "\r\n";
headers += "\r\n";

Наслаждайтесь!

0 голосов
/ 22 августа 2011

, чтобы помочь вам больше, я думаю, нам нужны некоторые фрагменты кода и журнал отладки.Не могли бы вы устроить это для нас, пожалуйста.Или даже лучше, если вы передадите мне версию APK (если не хотите - я не хочу воровать у вас коммерческие идеи) APK, и тогда я смогу протестировать apk на других наших телефонах.

Йохан,Поддержка разработчиков Sony Ericsson

...