2011-08-08 13 views
13

W moim projekcie realizuję transmisję na żywo za pomocą nieskończonego strumienia. Mogę bez problemu korzystać z nativ Android MediaPlayer, także na urządzeniach ze starą wersją Androida, ponieważ strumień jest typu audio/mpeg. Testowałem to na HTC Magic z systemem 1.6 i działa bezbłędnie. Nawet po przełączeniu pomiędzy WLAN i 3G po prostu się rozkręca i widzę tylko małe rozdarcie, a potem gra dalej, jakby nic się nie stało. Rzadko też zrywa połączenie, ponieważ słuchałem radia podczas dnia pracy, a także w drodze do pracy iz pracy, aby upewnić się, że doświadczenie użytkownika będzie dokładnie takie, jak tego chcę. Powtórzyłem tę samą procedurę dla innych urządzeń, takich jak HTC Legend z systemem Android 2.1, HTC Wildfire z systemem 2.2 i Samsung Galaxy Tab z systemem 2.2 z tymi samymi wynikami. Wszystkie urządzenia doskonale obsługują strumień.Dziwne zachowanie podczas przesyłania strumieniowego za pośrednictwem Android MediaPlayer w HTC Desire z systemem Android 2.2

Jednak to jest miejsce, w którym utknąłem w HTC Desire z systemem 2.2. Mam poważne problemy z odtwarzaniem strumienia. Podczas korzystania ze standardowej implementacji MediaPlayer, to jest setDataSource (String path), gra przez 10 - 30 sekund, a następnie traci połączenie, nawet gdy mam pełny odbiór zarówno w sieci WLAN, jak i 3G. Próbowałem różnych metod, aby rozwiązać ten problem, korzystając z NPR News projektu, który działa całkiem nieźle po kilku modyfikacjach. Jednak HTC Desire wciąż od czasu do czasu zrywa połączenia, a przy niektórych okazjach próbuje ponownie połączyć się 4-5 razy, aż w rzeczywistości uda się utrzymać stabilne połączenie.

Błąd Dostaję podczas korzystania z serwera proxy wygląda następująco

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) 

i podczas korzystania z MediaPlayer bezpośrednio bez użycia serwera proxy

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. 

jeszcze jedno. W celu umożliwienia w StreamProxy z NPR Aktualności naprawdę dobrze pracować musiałem zmodyfikować następujące wiersze

byte[] buff = new byte[1024 * 50]; 
while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1) { 
    client.getOutputStream().write(buff, 0, readBytes); 
} 

używania go w ten sposób spowodowałoby strumienia do luźne połączenie co 10 - 30 sekund. Ale kiedy obniżyłem rozmiar bufora do 4 bajtów lub nawet jednego bajtu, gra całkiem ładnie, chociaż w przypadku korzystania z 3G czkawka pojawia się dość często i ma problemy z ponownym połączeniem.

Moje pytanie brzmi, czy ktokolwiek ma jakieś wyobrażenie o tym, czym jest umowa z oprogramowaniem HTC Desires? Mam na myśli, że działa doskonale na HTC Wildfire z tą samą wersją systemu operacyjnego. Nie powinno być dużych różnic między oprogramowaniem obu urządzeń? Przetestowałem też tę aplikację na wielu telefonach HTC, aby upewnić się, że nie jest to po prostu coś nie tak z moim urządzeniem testowym. Ale na innych urządzeniach pojawiły się te same problemy, co na moim urządzeniu testowym.

Wszelkie pomysły?

+0

Mam podobny projekt, ale w tej chwili używam domyślnego buforowania z wersji 2.2 z MediaPlayer. To nie była twoja intencja, ale twój post pomógł udowodnić, że korzystanie z StreamProxy będzie tego warte. Dodatkowo, twoja uwaga dotycząca zmiany rozmiaru bufora sprawiła, że ​​pomyślałem o tym, co tu się dzieje. Wygląda na to, że domyślne ustawienia MediaPlayer i StreamProxy używają zbyt dużych buforów i powodują problemy z porcjami. – Civilian

+0

http://stackoverflow.com/questions/8671479/android-mediaplayer-works-fine-in-our-custom-audio-streaming-application-up-to-a –

Odpowiedz

1

Problem polega na tym, że strumieniowanie treści typu "audio/aacp" nie jest obsługiwane bezpośrednio. Niektóre biblioteki dekodowanie może zostać pozwany do gry "aacp", proszę zobaczyć poniżej rozwiązanie:

Freeware Advanced Audio (AAC) Decoder for Android

How to use this library?

Consider legal issues while using it.

Szczegóły patrz: this.

0

Zapomnij o przesyłaniu strumieniowym w systemie Android 2.2. To po prostu nie działa dobrze, z wyjątkiem przesyłania strumieniowego flash.

Powiązane problemy