【问题标题】:In J2ME After creating a player with one audio file, is that possible to pass an another audio file to same instance of player to play在 J2ME 中使用一个音频文件创建播放器后,是否可以将另一个音频文件传递给同一播放器实例进行播放
【发布时间】:2025-12-23 17:20:20
【问题描述】:

使用方法创建播放器后,代码如下:

player = Manager.createPlayer(getClass().getInputStream("/sound.wav"), "audio/x-wav")

是否可以将音频文件传递给相同的播放器实例?

我试过这样做:

player = (Player) player.getClass().getInputStream("/sound.wav");

但是这个给了我一个例外是java.lang.ClassCastException

如果可以的话应该怎么做呢?

【问题讨论】:

    标签: java-me mmapi


    【解决方案1】:

    这一行

    player = (Player) player.getClass().getInputStream("/sound.wav");
    

    给你一个ClassCastException,因为你试图将InputStream 转换成Player。那是错误的。此行正确Player 分配给您的player 变量:

    player = Manager.createPlayer(getClass().getInputStream("/sound.wav"), "audio/x-wav");
    

    如果你愿意,你可以在重放声音的时候一次又一次地使用我的第二行。您将只是重新创建播放器。如果您不更改声音文件 (.wav),那么当声音播放完毕后,我会再次启动它而不创建新播放器:

    player.start();  // restart the same sound
    

    但是,如果您要更改使用的声音文件,再次调用createPlayer 可能会更容易:

    player = Manager.createPlayer(getClass().getInputStream("/another_sound.wav"), "audio/x-wav");
    

    这里有一些BlackBerry docs on the Player。即使您可能在不同的 J2ME 平台上,我认为可能适用相同的生命周期规则:

    玩家有五种状态:未实现、已实现、预取、已启动、 已关闭。

    这些生命周期状态的目的是提供程序化的 控制可能耗时的操作。例如,当 首先构造一个 Player,它处于 UNREALIZED 状态。 从 UNREALIZED 过渡到 REALIZED,播放器执行 定位所需的所有资源所需的通信 功能(例如与服务器或文件系统通信)。这 实现方法允许应用程序启动这个潜在的 在适当的时间进行耗时的过程。

    通常,玩家从 UNREALIZED 状态移动到 REALIZED 状态,然后进入 PREFETCHED 状态,最后进入 STARTED 状态。

    播放器在到达媒体末尾时停止;或当停止 方法被调用。发生这种情况时,玩家会从 STARTED 状态回到 PREFETCHED 状态。然后准备重复 循环。

    要使用播放器,您必须设置参数来管理其移动 通过这些生命周期状态,然后通过这些状态移动它 使用 Player 的状态转换方法。

    更新: 因为您似乎关心代码复杂性,也许 deallocating (?) 对象,here is a code sample,希望说明它不应该是太难了。您只需获取该答案中的代码,并使其成为您传递 autio 文件名称 (musicFile) 的方法。

    【讨论】:

    • 也就是说,如果不创建播放器,就无法传递另一个音频文件......我必须创建另一个播放器。但在我的应用程序中,我使用的是 VolumeControl。如果我创建另一个播放器来播放之前创建的第二个文件 VolumeControl 将无法与另一个播放器一起使用......为了克服这个问题,我将为第二个播放器创建另一个 VolumeControl 或取消分配第一个 VolumeControl 并将它们重新分配给第二个播放器......这也会增加代码工作的复杂性......这就是为什么我想要一种方法来传递音频文件而不创建另一个播放器......
    • 不需要额外的复杂性。您使用 6-10 行代码编写一种方法。在该方法中,您使用createPlayer() 创建一个播放器并获得您的VolumeControl。您不止一次调用该方法。当您第一次播放声音时调用它,当您想再次播放时再次调用它。没有额外的复杂性。尝试交换声音文件造成额外的复杂性。我了解您想要什么,但您可以自己查看 API 文档。我没有看到任何更改音频文件的方法。如果其他人这样做,希望他们会发布解决方案。
    • Ok Nate .....我明白了,我的问题现在已经解决了... :D...thanx 的建议.. 还有一个问题是我怎么来知道模拟器或设备播放某些媒体文件的能力是什么,尽管它是 .mp3 或 .wav 或任何其他文件
    • 这是一个很好的问题,但它与您在此处发布的问题不同。如果此答案解决了this 问题,请通过单击答案旁边的小复选标记(“V”)图标接受。然后,发布一个新问题,询问设备媒体功能。这会让其他人看到你的问题。很少有人能在这里读到它。谢谢!
    • 没问题。我认为我知道如何解决另一个问题,但对我来说已经晚了。如果您在接下来的几分钟内发布一个新问题,我可能会回答它。如果没有,我明天再回来看看......