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

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

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

Любые идеи?

4b9b3361

Ответ 1

Проблема заключается в том, что потоковая передача контента типа "аудио/aacp" напрямую не поддерживается. Некоторая библиотека декодирования может быть подана в суд для воспроизведения "aacp", см. Решение ниже:

Freeware Advanced Audio (AAC) Decoder для Android

Как использовать эту библиотеку?

Рассмотрите юридические проблемы при использовании.

  • лицензируется проект http://code.google.com/p/aacplayer-android/под GPL, поэтому вы можете создавать коммерческие приложения * поверх этого, но вы необходимо заполнить GPL - в основном это означает, что вы публикуете свой код как Что ж. * Если вы используете второй проект http://code.google.com/p/aacdecoder-android/, тогда вам не нужно публикуйте свой * код (библиотека лицензируется под LGPL).

Подробнее см. .

Ответ 2

Забудьте о потоковой передаче в Android 2.2. Он просто не работает хорошо, кроме флеш-потока.