Java 在HTC Desire和Android 2.2上使用Android MediaPlayer进行流媒体播放时的奇怪行为

Java 在HTC Desire和Android 2.2上使用Android MediaPlayer进行流媒体播放时的奇怪行为,java,streaming,android,Java,Streaming,Android,在我的一个项目中,我正在使用无穷无尽的流实现一个实时广播。我可以毫无问题地在运行旧版本Android的设备上使用nativ Android MediaPlayer,因为流的类型是audio/mpeg。我已经在运行1.6的HTC Magic上进行了测试,它运行得完美无缺。即使在WLAN和3G之间切换时,它也只是缓冲了一下,我只注意到一个小问题,然后它继续播放,就好像什么都没发生一样。它也很少断开连接,因为我在工作日和上下班的路上一直在收听广播,以确保用户体验完全符合我的要求。我对其他设备重复了同样

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

然而,这就是我陷入困境的地方,在HTC Desire运行2.2时,我在播放流时遇到了严重的问题。当使用MediaPlayer的标准实现,即setDataSource(字符串路径)时,它会播放10-30秒,然后即使在WLAN和3G上都完全接收时,它也会失去连接。我尝试了不同的方法来解决这个问题,一个是使用项目的,经过一些修改后,它实际上运行得很好。然而,HTC的愿望仍然会时不时地中断连接,有时会尝试重新连接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.
以这种方式使用它会导致流每10-30秒就失去连接。但是当我将缓冲区大小降低到4个字节甚至1个字节时,它可以很好地发挥作用,尽管在使用3G时经常出现打嗝,并且在重新连接时出现问题

那么,我的问题是,有人对HTC与底层软件的交易有什么想法吗?我的意思是,它在运行同一版本操作系统的HTC Wildfire上运行得非常好。这两个设备的软件应该没有太大区别吧?我还对HTC的多个应用程序进行了测试,以确保我的测试设备没有问题。但在其他设备上,同样的问题也发生在我的测试设备上


有什么想法吗?

问题是不直接支持内容类型为“音频/aacp”的流媒体。一些解码库可能被起诉播放“aacp”,请参见以下解决方案:

  • 该项目已获得许可 在GPL下,你可以在上面创建商业应用,但是你 需要填写GPL-主要是指将代码发布为 嗯如果使用第二个项目 ,那么您不需要 发布您的*代码(该库根据LGPL获得许可)

有关详细信息,请参见。

忘记Android 2.2中的流媒体。除了flash流媒体之外,它工作得不好。

我有一个类似的项目,但目前我只在MediaPlayer上使用v2.2中的默认缓冲。这不是你的意图,但你的帖子帮助证明了使用StreamProxy是值得的。此外,您关于更改缓冲区大小的说明让我想到了这里发生了什么。MediaPlayer默认值和StreamProxy默认值似乎都使用了过大的缓冲区,从而导致块出现问题。
byte[] buff = new byte[1024 * 50];
while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1) {
    client.getOutputStream().write(buff, 0, readBytes);
}