我正在使用 vlcj 库: 我想播放两个不同音量的文件,但是当我改变其中一个的音量时,另一个也会改变,我该怎么做才能避免这种情况?
import javax.swing.JFrame;
import uk.co.caprica.vlcj.player.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
public class AudioIssue {
public static void main(String[] args) {
JFrame frame1 = new JFrame("Frame1");
JFrame frame2 = new JFrame("Frame2");
frame1.setBounds(100, 100, 600, 400);
frame2.setBounds(100, 500, 600, 400);
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
EmbeddedMediaPlayerComponent mediaPlayerComponent1 = new EmbeddedMediaPlayerComponent();
EmbeddedMediaPlayerComponent mediaPlayerComponent2 = new EmbeddedMediaPlayerComponent();
frame1.add(mediaPlayerComponent1);
frame2.add(mediaPlayerComponent2);
frame1.setVisible(true);
frame2.setVisible(true);
EmbeddedMediaPlayer mediaPlayer1 = mediaPlayerComponent1.mediaPlayer();
EmbeddedMediaPlayer mediaPlayer2 = mediaPlayerComponent2.mediaPlayer();
mediaPlayer1.audio().setVolume(70);
mediaPlayer2.audio().setVolume(30);
mediaPlayer1.media().play("archivos/vlcjReproduccion/test.mp4");
mediaPlayer2.media().play("archivos/vlcjReproduccion/test.mp4");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(mediaPlayer1.audio().volume());
System.out.println(mediaPlayer2.audio().volume());
}
}
输出:
如果我执行两个单独的代码,则卷是独立的并且它可以工作,但是如果我从相同的代码执行它,它就不起作用。我已经尝试过线程,但它也不起作用。
此行为取决于多种因素。
首先,VLC 使用的音频输出可能支持也可能不支持独立音频设置。
您可以在命令行上使用
vlc -H
列出可用的音频输出,这是为我报告的内容:
-A, --aout {any,pulse,alsa,sndio,adummy,amem,afile,none}
Audio output module
因此,如果默认的音频输出不支持您需要的内容,您可以尝试其他输出,尽管显然其中一些输出(例如 amem、afile、adummy)在这里没有用处。
要使用 vlcj 尝试此操作,请在创建
["--aout", "pulse"]
时指定类似 MediaPlayerFactory
的内容。
不能保证这会起作用,但我会尝试。
其次,根据VLC的版本,在媒体播放开始之前无法更改音量或准确查询音量。您在这里可以做的最好的事情就是监听要触发的“媒体播放器就绪”事件,然后根据音频设置执行您需要的操作。这并不理想,因为在媒体播放的前几毫秒之前您可能不会收到此事件。
因此请务必尝试最新版本的 VLC。第三,根据我的经验,这种情况在 VLC 4.x(仍在开发中)中得到了更广泛的改善。因此,您可以尝试 VLC 4.x 的夜间预发布版本和 vlcj 5.x 的最新快照版本,但同样不能保证这会起作用。
如果这些都不适合您,那么您唯一能做的就是构建您的应用程序,使其在自己单独的进程中运行每个本机媒体播放器。然而,这并不是一项简单的任务,需要您为每个媒体播放器创建一个新的 JVM,并使用某种远程过程调用机制来从主应用程序控制媒体播放器。这
确实有效,但却是一项严肃的任务。