Java VLCJ播放器,设置音轨不起作用

时间:2013-02-04 07:06:50

标签: java media-player vlcj audiotrack

我目前正在研究可以播放mkv格式的java媒体播放器。我正在使用VLCJ,除非我尝试更改无效的音轨,否则一切正常。

这是代码

public class mediaplayer {

    private static JFileChooser filechooser = new JFileChooser();

    public mediaplayer() {
    }

    public static void main(String[] args) {
        String vlcPath = "", mediaPath = "";
        File ourfile;

        filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        filechooser.showSaveDialog(null);
        ourfile = filechooser.getSelectedFile();
        mediaPath = ourfile.getAbsolutePath();

        EmbeddedMediaPlayerComponent mediacom = new EmbeddedMediaPlayerComponent();

        JFrame frame = new JFrame();
        frame.setContentPane(mediacom);
        frame.add(canvas);
        frame.setLocation(100, 100);
        frame.setSize(1050, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);

        MediaPlayer mplayer = mediacom.getMediaPlayer();

        mplayer.playMedia(mediaPath);
        mplayer.setAudioTrack(1);
    }
}

2 个答案:

答案 0 :(得分:1)

在vlc 2.0.5之前的libVLC版本中,设置音频轨道的本机API调用被窃听。

使用libVLC 2.0.5中的修复,设置音频轨道可靠地工作,但你不能只假设0..N的简单索引,你不能假设顺序音轨号码 - 你必须通过调用mediaPlayer来枚举音轨.getAudioDescriptions()。返回的TrackDescription对象包含应与mediaPlayer.setAudioTrack()一起使用的音轨标识符。

要禁用音频,您可以选择描述为“禁用”的音轨的音轨标识符。

另请注意,在调用mediaPlayer.playMedia()后,您可能无法立即设置音轨。媒体以异步方式启动,您可能需要等到媒体实际启动和/或在轨道信息可用之前进行了解析。

答案 1 :(得分:0)

6年后

API增长了很多

如果您想停止或选择一个音轨,则可以使用此代码段并对其进行调整,其想法是等待播放器开始使用某个过程,然后切换到所需的功能,在我的情况下是禁用音频

new Thread(
                    () -> {
                        try {
                            while(!empc.mediaPlayer().status().isPlaying())Thread.sleep(500);
                            empc.mediaPlayer().audio().trackDescriptions().stream()
                            .filter(td -> td.description().equals("Disable"))
                            .forEach(t -> empc.mediaPlayer().audio().setTrack(t.id()));
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    ).start();

empc 是我的媒体播放器实例{为了在播放器组件中提供更高的精度而嵌入一个}