我正在用JavaFX开发一个音乐库应用程序,我在如何正确使用MediaPlayer类方面遇到了一些问题。
这是我目前设置和播放音频文件的方法:
private static MediaPlayer musicPlayer;
public static void setMedia(String path) {
try {
musicPlayer = new MediaPlayer(new Media(new File(path).toURI().toASCIIString()));
musicPlayer.play();
} catch (Exception e) {
System.out.println("invald file");
System.out.println(e.getMessage());
}
}
比如说,我有两个音频文件。。。
file1.mp3
file2.mp3
...以及将这两个文件中的一个发送到上述方法的两个按钮:
button1.setOnAction(event -> {
setMedia("file1.mp3");
});
button2.setOnAction(event -> {
setMedia("file2.mp3");
});
通常,两个音频文件都会相互播放是有意义的,因为每次调用该方法时我都会创建一个新的MediaPlayer对象,但是,该对象是静态的。也许我误解了静态对象的工作原理,但这难道不意味着这个对象只能有一个实例吗?反过来,这不是意味着每当调用setMedia方法时,MediaPlayer对象的媒体都会被覆盖吗?
我没有找到任何方法在不创建新实例的情况下为MediaPlayer对象“设置”或“覆盖”媒体。它似乎没有这样做的方法。这让我相信我必须为每个音频文件拥有一个MediaPlayer对象数组。这是正确的吗?还是我只是错过了什么?
您似乎混淆了两个概念:静态变量和单例。您在这里所说的这个对象只能有一个实例
适用于单例,但通常不适用于静态变量。对于静态变量,这只意味着变量的范围是全局的。换句话说,这个变量只有一个引用。
一个例子:
// This is just a general static variable
private static MediaPlayer mediaPlayer;
mediaPlayer = new MediaPlayer(...);
mediaPlayer = new MediaPlayer(...); // this second assignment is ok
// This is a singleton - note the key word `final`
private static final MediaPlayer mediaPlayer;
mediaPlayer = new MediaPlayer(...); // ok
mediaPlayer = new MediaPlayer(...); // compile error
我没有找到任何方法在不创建新实例的情况下为MediaPlayer对象“设置”或“覆盖”媒体。它似乎没有这样做的方法。这让我相信我必须为每个音频文件拥有一个MediaPlayer对象数组。这是正确的吗?还是我只是错过了什么?
这是正确的。MediaPlayer
构造函数的文档明确说明了这一点:
公共媒体播放器(媒体媒体)
为特定媒体创建播放机。这是将媒体对象与MediaPlayer关联的唯一方法:一旦创建了播放机,就不能对其进行更改。
也许我误解了静态对象的工作原理,但这难道不意味着这个对象只能有一个实例吗?
是的,你误解了这一点。
对MediaPlayer
的引用是静态的,这仅仅意味着类只有一个对MediaPlayer
的引用。(通常的说法是单个MediaPlayer
引用是“所有实例共享的”我不喜欢:这意味着你必须至少有一个类的实例,这是不正确的。将其设为静态实际上意味着MediaPlayer
引用是类的属性,而不是类实例的属性。)简单地替换引用(以便它引用不同的MediaPlayer
)不会从堆中删除上一个对象。它仍然存在于内存中,仍然有它的所有属性,等等。您的类不再有对它的引用。
通常,如果没有对对象的活动引用,则该对象有资格进行垃圾收集。但是,在这种情况下,如果媒体正在播放,FX工具包将保留对它的引用,以使其实际播放MediaPlayer
定义了一个dispose
方法来释放其底层资源。因此,您的方法可能如下所示:
public static void setMedia(String path) {
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.dispose();
}
try {
musicPlayer = new MediaPlayer(new Media(new File(path).toURI().toASCIIString()));
musicPlayer.play();
} catch (Exception e) {
System.out.println("invald file");
System.out.println(e.getMessage());
}
}
几乎可以肯定的是,没有必要让所有东西都变成静态的:它对你没有任何帮助。
1.1.1. 多媒体播放 1.1.1. 多媒体播放 我们事实上对上游芯片厂商自带的播放器方式做了调整。 Amlogic 芯片 BaseCode 我们禁用了芯片厂商的原生代码的 libplayer 包,原因是芯片厂商的播放器是直接使用 ALSA 框架来调用音频播放功能的。 这对我们 RokidOS 平台让多个进程使用音频设备造成阻碍。基于这个因素,我们使用了 RokidOS 开发的媒体播放库 lib
数据传输率:采样频率(Hz)×量化位数(bit)×声道数,单位为b/s 声音信号数据量:数据传输率×持续时间/8 音频容量的计算公式:存储量=采样时间(s) 采样频率(Hz) 量化位数(位) *声道数/8/1024(kb) 图片容量的计算公式:存储量=水平像素垂直像素颜色位数/8/1024(kb) 若提示为X位或X位色,则颜色位数就是X,若提示为X色,那么颜色位数为。 视频容量的计算公式:存储量=
当我使用MediaPlayer播放mp3文件时,系统会报告错误日志:。但是RealPlayer是正常的。 我发现它的错误只发生在更高的ROM版本。像4.0版本一样,它有错误。在2.3版中,它没有这个错误。 代码: 日志猫错误:
请求方式: 使用multipart/form-data POST上传文件 请求地址: https://open.qingtui.cn/v1/media/upload?access_token=ACCESS_TOKEN&type=TYPE 请求示例(使用curl命令,用FORM表单方式上传一个多媒体文件): curl -F media=@test.jpg "https://open.qingtui.
介绍 MPlayer被评为Linux下的最佳媒体播放工具,又成功地移植到Windows下。它能播放几乎所有流行的音频和视频格式。 MPlayer能播放几乎所有流行的音频 和视频格式,相对其它播放器来说,资源占用非常少,不需要任何系统解码器就可以播放各种媒体格式。 http://www.mplayerhq.hu/ 安装 直接 apt 安装即可: sudo apt-get install mplaye
选择安装 deadbeef 的首要原因,是它支持 DSD 格式! 介绍 http://deadbeef.sourceforge.net/ 安装 打开下载页面: http://deadbeef.sourceforge.net/download.html 找到 DeaDBeeF deb package amd64 下载对应的 deb 文件,下载完成后直接安装即可。 配置 打开 “编辑” —> “偏好设