由于许多J2ME手机的(非常烦人)限制,音频文件在完全下载之前无法播放。因此,为了播放实时流,我不得不一次下载块,并构建ByteArrayInputStream
s,然后我将其提供给玩家。
这很有效,除了每次流结束时需要大约1/4秒的烦人间隙,需要新的间隙。有没有办法解决这个问题,或上面的问题?
答案 0 :(得分:2)
使用J2ME JSR135播放长(3分钟或更长)曲目的唯一好方法是,在最大数量的手机上,中等可靠,是在创建播放器时使用“file://”url,或者让输入流实际来自FileConnection。
最近的黑莓手机只有在拥有大量Java内存时才能使用ByteArrayInputstream。
在Symbian操作系统上运行的很多手机都允许您将文件放在J2ME应用程序的私有区域,同时仍能在同一位置播放曲目。
答案 1 :(得分:1)
不幸的是,你无法摆脱这些差距,至少在我试过的任何设备上都没有。这确实非常烦人。规范的一部分是您无法通过HTTP传输音频或视频。
如果您想从服务器流式传输,唯一的方法是使用RTSP服务器,但您需要在设备上检查对此服务的支持。
使用设备上的本地服务器(rtsp:// localhost ...)伪造RTSP也不起作用..我也试过了。
答案 2 :(得分:0)
EDIT2:或者你可以看一下这似乎正是你想要的:http://java.sun.com/javame/reference/apis/jsr135/javax/microedition/media/protocol/DataSource.html
我会创建两个Player类,并确保在开始播放之前我已收到足够的块。然后我会开始通过玩家一玩第一个块并将第二个加载到玩家二。然后我会使用TimeBase类来跟踪已经过了多少时间以及当我知道第一个块会结束时(你应该知道每个块有多长时间玩)然后我会开始通过第二个玩家玩第二个块将第三个块加载到第一个块中,依此类推,直到不再有块为止。
这里的关键是正确使用TimeBase类来知道何时进行转换。我认为这应该摆脱块之间令人讨厌的1/4秒差距。我希望这样有效,让我知道它是否有效,因为它听起来很有趣。
编辑:Player.prefetch()在减少延迟方面也很有用。