4

我根本不擅长Java,所以我真的可以使用你的帮助。我正在尝试从 mp3 文件中读取持续时间和比特率。我正在使用来自http://www.javazoom.net/mp3spi/documents.html的名为“mp3spi”的 java 库。

所以 var 我已经能够确定这些对象存在:

<cfset AudioFormat = createObject("java", "org.tritonus.share.sampled.TAudioFormat")>
<cfset AudioFileFormat = createObject("java", "org.tritonus.share.sampled.file.TAudioFileFormat")>
<cfset AudioFileReader = createObject("java", "javax.sound.sampled.spi.AudioFileReader")>

我在使用以下代码并将其转换为 ColdFusion 时遇到问题:

File file = new File("filename.mp3");
AudioFileFormat baseFileFormat = new MpegAudioFileReader().getAudioFileFormat(file);
Map properties = baseFileFormat.properties();
Long duration = (Long) properties.get("duration");

我尝试了几种设置上述变量的方法,但我不断收到一个错误,即 MpegAudioFileReader 或 getAudioFileFormat 不存在。但是,当我转储用于创建 Java 对象的变量时,它们确实存在。

这是我所拥有的:

<cfscript>
    mp3file = FileOpen(ExpandPath("./") & originalfile, "readBinary");
    baseFileFormat = AudioFileReader.getAudioFileFormat(mp3file);
    properties = baseFileFormat.properties();
    duration = properties.get("duration");
</cfscript>
4

2 回答 2

6

我不会为你编写代码,Simone,但有一个 coupla 通用提示。

File file = new File("filename.mp3");

您可能知道,CFML 是松散类型的,因此您可以省去 LHS 上的类型,然后您需要使用该createObject()函数来创建您已经掌握的 Java 对象。CF 无法导入 Java 库,因此您需要为File该类提供完全限定的路径。您还需要显式调用构造函数:

mp3File = createObject("java", "java.io.File").init("filename.mp3");

(正如@Leigh 在下面指出的那样,file是CFML 中的一个保留字,所以最好不要将它用作变量名!所以我在mp3File这里使用)

从那里......你应该能够很容易地完成其他三个语句的工作。基本的方法调用和赋值几乎可以直接从 Java 源代码移植,只是丢失了上面提到的静态类型位和类型转换(long)等。

如果您无法从这里整理出所有内容,请通过您的实验更新您的问题,我们可以改进此答案(或者有人可以发布不同的答案)。但是您需要向我们提供您的具体问题,而不仅仅是一般的“请写我的代码”。人们不会那样做,你也不应该要求人们来这里(这是违反规则的,人们对 StackOverflow 的规则非常重视)。

于 2013-10-03T17:22:11.337 回答
5

亚当的回答是可靠的。由于您需要调用 Java 类的构造函数来创建实例,而不是仅限于使用静态方法,因此必须调用“init()”方法。如下...

mp3file = createObject("java", "java.io.File").init("filename.mp3");
baseFileFormat = createObject("java", "path.to.MpegAudioFileReader").init().getAudioFileFormat(mp3file);
properties = baseFileFormat.properties();
duration = properties.get("duration");

亚当的指导是正确的,即在初始化变量时键入变量不会飞。我没有设置 ColdFusion 环境来尝试此操作,但过去我们使用上述方法通过创建 Java 类的实例并调用它们的方法来扩展 ColdFusion 的 Hibernate 集成。只要您所依赖的外部库位于 ColdFusion 服务器的类路径中,您就不应该有任何问题。

于 2013-10-03T18:15:47.473 回答