В моем проекте я реализую радио в реальном времени, используя бесконечный поток.Я могу без проблем использовать нативный Android MediaPlayer, также на устройствах под управлением старой версии Android, поскольку поток имеет тип audio / mpeg.Я проверил это на HTC Magic под управлением 1.6, и он работает безупречно.Даже при переключении между WLAN и 3G он просто буферизуется, и я замечаю лишь небольшой сбой, а затем он продолжает играть, как будто ничего не произошло.Это также редко обрывает соединение, так как я слушал по радио в течение рабочего дня, а также по дороге на работу и с работы, чтобы убедиться, что пользовательский опыт будет именно таким, как я хочу.Я повторил ту же процедуру для других устройств, таких как HTC Legend с Android 2.1, HTC Wildfire с 2.2 и Samsung Galaxy Tab с 2.2, с теми же результатами.Все устройства отлично справляются с потоком.
Тем не менее, и вот тут я как бы застрял, на HTC Desire с 2.2 у меня серьезные проблемы с запуском потока.При использовании стандартной реализации MediaPlayer, то есть setDataSource (String path), он воспроизводится в течение 10–30 секунд, затем теряет соединение, даже когда у меня полный прием как в WLAN, так и в 3G.Я пробовал разные способы решения этой проблемы, используя NPR News проекта StreamProxy , который на самом деле работает довольно хорошо после нескольких модификаций.Однако HTC Desire время от времени сбрасывает соединения, а в некоторых случаях пытается восстановить соединение 4–5 раз, пока ему не удастся сохранить стабильное соединение.
Ошибка, которую я получаю при использовании прокси, выглядитследующим образом
08-08 09:35:17.810: ERROR/AwesomePlayer(67): Not sending buffering status because duration is unknown.
08-08 09:35:19.849: ERROR/HTTPStream(67): recv failed, errno = 11 (Try again)
08-08 09:35:19.849: INFO/HTTPDataSource(67): Retry ... 2 times left
08-08 09:35:19.849: WARN/HTTPStream(67): Calling connect()...
08-08 09:35:19.849: WARN/HTTPStream(67): Returned from connect()...
08-08 09:35:20.739: ERROR/(1576): Broken pipe
08-08 09:35:20.739: ERROR/(1576): java.net.SocketException: Broken pipe
08-08 09:35:20.739: ERROR/(1576): at org.apache.harmony.luni.platform.OSNetworkSystem.writeSocketImpl(Native Method)
08-08 09:35:20.739: ERROR/(1576): at org.apache.harmony.luni.platform.OSNetworkSystem.write(OSNetworkSystem.java:723)
08-08 09:35:20.739: ERROR/(1576): at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:578)
08-08 09:35:20.739: ERROR/(1576): at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:59)
08-08 09:35:20.739: ERROR/(1576): at org.jmvo.radio.StreamProxy.processRequest(StreamProxy.java:263)
08-08 09:35:20.739: ERROR/(1576): at org.jmvo.radio.StreamProxy.run(StreamProxy.java:138)
08-08 09:35:20.739: ERROR/(1576): at java.lang.Thread.run(Thread.java:1102)
и при использовании MediaPlayer напрямую без использования прокси
08-08 09:41:30.799: ERROR/AwesomePlayer(67): Not sending buffering status because duration is unknown.
08-08 09:41:32.849: ERROR/HTTPStream(67): recv failed, errno = 11 (Try again)
08-08 09:41:32.849: INFO/HTTPDataSource(67): Retry ... 2 times left
08-08 09:41:32.849: WARN/HTTPStream(67): Calling connect()...
08-08 09:41:32.870: WARN/HTTPStream(67): Returned from connect()...
08-08 09:41:33.160: INFO/HTTPDataSource(67): retrying connection succeeded.
08-08 09:41:34.839: VERBOSE/CacheingDataSource(67): partial readAt CachingDataSource::readAt(260221, 418):mSource->readAt(page<0xd0ff0>->mOffset 260416, mPageSize 1728)
08-08 09:41:36.839: ERROR/HTTPStream(67): recv failed, errno = 11 (Try again)
08-08 09:41:36.839: INFO/HTTPDataSource(67): Retry ... 1 times left
08-08 09:41:36.839: WARN/HTTPStream(67): Calling connect()...
08-08 09:41:36.859: WARN/HTTPStream(67): Returned from connect()...
08-08 09:41:37.361: INFO/HTTPDataSource(67): retrying connection succeeded.
Еще одна вещь.Чтобы StreamProxy из NPR News работал действительно хорошо, мне пришлось изменить следующие строки
byte[] buff = new byte[1024 * 50];
while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1) {
client.getOutputStream().write(buff, 0, readBytes);
}
, используя его таким образом, чтобы поток терял соединение каждые 10 - 30 секунд.Но когда я уменьшил размер буфера до 4 байтов или даже одного байта, он воспроизводится довольно хорошо, хотя при использовании 3G икота происходит довольно часто и возникают проблемы с повторным подключением.
Так что мой вопрос, есть ли у кого-нибудь идеи?Какова сделка с программным обеспечением HTC Desires?Я имею в виду, что он отлично работает на HTC Wildfire под управлением той же версии ОС.Не должно быть больших различий между программным обеспечением двух устройств?Я также протестировал это приложение на нескольких HTC Desires, чтобы убедиться, что с моим тестовым устройством все в порядке.Но на других устройствах возникали те же проблемы, что и на моем тестовом устройстве.
Есть идеи?