Joh*_*han 13 java streaming android
在我的一个项目中,我正在使用无尽的流来实现现场广播.我可以毫无问题地使用nativ Android MediaPlayer,也可以在运行旧版Android的设备上使用,因为该流的类型为audio/mpeg.我在运行1.6的HTC Magic上进行了测试,它运行完美无缺.即使在WLAN和3G之间切换它也只是缓冲起来,我只注意到一个小打嗝,然后它继续播放,好像什么也没发生.它也很少丢失连接,因为我在工作日期间一直在收听广播,也在上下班途中收听,以确保用户体验与我想要的完全一样.我已经为其他设备重复了相同的程序,例如运行Android 2.1的HTC Legend,运行2.2的HTC Wildfire和运行2.2的三星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)
Run Code Online (Sandbox Code Playgroud)
并且在不使用代理的情况下直接使用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.
Run Code Online (Sandbox Code Playgroud)
还有一件事.为了让NPR News的StreamProxy工作得非常好,我不得不修改以下几行
byte[] buff = new byte[1024 * 50];
while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1) {
client.getOutputStream().write(buff, 0, readBytes);
}
Run Code Online (Sandbox Code Playgroud)
以这种方式使用它会导致流每10-30秒钟断开连接.但是当我将缓冲区大小降低到4个字节甚至一个字节时,它的播放效果非常好,尽管使用3G打嗝时经常发生并且重新连接时出现问题.
所以我的问题是,有没有人对HTC Desires底层软件的交易有什么想法?我的意思是,它在运行相同版本操作系统的HTC Wildfire上完美运行.两台设备的软件之间应该有多大区别?我还在多个HTC Desires上测试了这个应用程序,以确保它不仅仅是我的测试设备出了问题.但在其他设备上,同样的问题就像在我的测试设备上一样.
有任何想法吗?
问题是不直接支持内容类型“audio/aacp”流。可以使用某些解码库来播放“aacp”,解决方法如下:
适用于 Android 的免费软件高级音频 (AAC) 解码器
- 该项目http://code.google.com/p/aacplayer-android/已获得 GPL 许可,因此您可以在其上创建商业应用程序*,但您需要履行 GPL - 主要意味着发布您的代码以及。* 如果您使用第二个项目 http://code.google.com/p/aacdecoder-android/,那么您不需要发布您的 * 代码(该库在 LGPL 下获得许可)。
详细请看这个。