Странное поведение при потоковой передаче с использованием Android MediaPlayer в HTC Desire с Android 2.2

В моем проекте я реализую прямую трансляцию радио с использованием бесконечного потока. Я могу без проблем использовать родной 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. Я пробовал разные методы для решения этой проблемы. Один из них - использование проекта StreamProxy проекта NPR News , который действительно работает довольно хорошо после нескольких модификаций. Однако 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 Desire, чтобы убедиться, что с моим тестовым устройством что-то не так. Но на других устройствах возникли те же проблемы, что и на моем тестовом устройстве.

Есть идеи?

13
задан Johan 8 August 2011 в 08:12
поделиться