在 J2ME 中将缓冲区旋转到播放器的替代方法?

Posted

技术标签:

【中文标题】在 J2ME 中将缓冲区旋转到播放器的替代方法?【英文标题】:Alternatives to rotating buffers into Players in J2ME? 【发布时间】:2009-04-24 23:53:59 【问题描述】:

由于许多 J2ME 手机的限制(相当烦人),音频文件在完全下载之前无法播放。所以,为了播放直播,我不得不一次下载块,并构建ByteArrayInputStreams,然后我将其提供给玩家。

这很好用,只是每次流结束并需要一个新的流时,都会有大约 1/4 秒的令人讨厌的间隙。有没有办法解决这个问题,或者上面的问题?

【问题讨论】:

我认为你想要的是在 javax.microedition.media.protocol 中找到的 SourceStream 和 DataSource 类java.sun.com/javame/reference/apis/jsr135/javax/microedition/… 【参考方案1】:

使用 J2ME JSR135 播放长(3 分钟或更长时间)曲目的唯一好方法是在大多数手机上适度可靠地播放,是在创建播放器时使用“file://”url,或者让输入流实际上来自 FileConnection。

最近的黑莓手机只有在有大的 java 堆内存可用时才能使用 ByteArrayInputstream。

在 Symbian 操作系统上运行的许多手机都允许您将文件放在 J2ME 应用程序的私有区域中,同时仍然能够在同一位置播放曲目。

【讨论】:

【参考方案2】:

不幸的是,您无法摆脱这些差距,至少在我尝试过的任何设备上都没有。确实很烦人。您不能通过 HTTP 流式传输音频或视频,这是规范的一部分。

如果您想从服务器流式传输,唯一的方法是使用RTSP 服务器,尽管您需要检查您的设备是否支持此功能。

使用设备上的本地服务器 (rtsp://localhost...) 伪造 RTSP 也不起作用。我也尝试过。

【讨论】:

【参考方案3】:

EDIT2:或者你可以看看这似乎正是你想要的:http://java.sun.com/javame/reference/apis/jsr135/javax/microedition/media/protocol/DataSource.html

我会创建两个 Player 类,并确保在开始播放它们之前我已经收到了足够的块。然后我会开始通过播放器一播放第一个块并将第二个块加载到播放器二中。然后我会使用 TimeBase 类来跟踪已经过去了多少时间,当我知道第一个块将结束时(你应该知道每个块必须播放多长时间)然后我会开始通过第二个播放器播放第二个块并且将第三个块加载到第一个块中,依此类推,直到没有更多块可以播放。

这里的关键是正确使用 TimeBase 类来知道何时进行转换。我认为这应该消除块之间烦人的 1/4 秒间隔赌注。我希望这有效,如果有效,请告诉我,因为这听起来很有趣。

编辑:Player.prefetch() 在减少延迟方面也可能有用。

【讨论】:

以上是关于在 J2ME 中将缓冲区旋转到播放器的替代方法?的主要内容,如果未能解决你的问题,请参考以下文章

io操作中,通常使用啥方法来强制清空缓存区

如何在 J2ME 中将数据发布到服务器?从服务器获取响应无效的 API 密钥

AVAudioPlayer- 从声音缓冲区播放

播放 iOS 的远程音频缓冲区时如何避免机器人声音?

在 J2ME 中未播放通知声音

我们如何强制 html 播放 100% 缓冲音频或视频?