【问题标题】:Java VLCJ player, set audio track is not workingJava VLCJ播放器,设置音轨不起作用
【发布时间】:2013-02-04 07:06:49
【问题描述】:

我目前正在开发可以播放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);
    }
}

【问题讨论】:

    标签: java media-player vlcj audiotrack


    【解决方案1】:

    vlc 2.0.5 之前的 libVLC 版本中,用于设置音轨的本机 API 调用存在错误。

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

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

    另外请注意,您可能无法在调用mediaPlayer.playMedia() 后立即设置音轨。媒体是异步启动的,您可能需要等到媒体实际启动和/或解析后,才能获得轨道信息。

    【讨论】:

      【解决方案2】:

      6 年后

      API 增长了很多

      如果您想停止或选择音轨,您可以使用此代码 sn-p 并对其进行调整,其想法是等待播放器开始使用进程然后切换到您需要的,在我的情况下是音频禁用

      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 是我的媒体播放器实例{在播放器组件中嵌入一个以提高精度}

      【讨论】:

        猜你喜欢
        • 2017-05-04
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        • 2014-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多