在带有 Android 2.2 的 HTC Desire 上使用 Android MediaPlayer 进行流式传输时出现奇怪的行为

2022-09-04 23:35:29

在我的一个项目中,我正在使用无尽流实现实时广播。我可以毫无问题地使用nativ Android MediaPlayer,也可以在运行旧版Android的设备上使用,因为该流是音频/ mpeg类型。我已经在运行1.6的HTC Magic上进行了测试,它的工作完美无缺。即使在WLAN和3G之间切换时,它也只是缓冲起来,我只注意到一个小小的打嗝,然后它继续播放,好像什么都没发生过。它也很少断开连接,因为我在工作日以及上下班的路上一直在收听收音机,以确保用户体验与我想要的完全一样。我对其他设备重复了相同的过程,例如运行Android 2.1的HTC Legend,运行2.2的HTC Wildfire和运行2.2的Samsung Galaxy Tab,结果相同。所有设备都能完美地处理流。

然而,这就是我陷入困境的地方,在运行2.2的HTC Desire上,我在播放流时遇到了严重的问题。当使用MediaPlayer的标准实现时,即setDataSource(字符串路径),它会播放10 - 30秒,然后即使我在WLAN和3G上都有完全接收,它也会失去连接。我尝试了不同的方法来解决这个问题,一个是使用NPR新闻项目的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.

还有一件事。为了使NPR新闻的StreamProxy能够很好地工作,我不得不修改以下行

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上测试了这个应用程序,以确保它不仅仅是我的测试设备出了问题。但在其他设备上,发生了与测试设备上相同的问题。

有什么想法吗?


答案 1

问题是内容类型“audio/aacp”流不直接受支持。有些解码库可以起诉播放“aacp”,请看下面的解决方案:

适用于安卓的免费软件高级音频 (AAC) 解码器

如何使用这个库?

在使用它时考虑法律问题

有关详细信息,请参阅此处


答案 2

忘记在Android 2.2中的流媒体。除了闪存流之外,它不能很好地工作。


推荐