Проигрыватель Java VLCJ, установка звуковой дорожки не работает

В настоящее время я работаю над медиаплеером Java, который может воспроизводить формат mkv. Я использую 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);
    }
}

person user2038771    schedule 04.02.2013    source источник


Ответы (2)


В версиях libVLC до vlc 2.0.5 собственный вызов API для установки звуковой дорожки содержал ошибку.

С исправлением в libVLC 2.0.5 установка звуковой дорожки работает надежно, но вы не можете просто принять простой индекс от 0..N и вы не можете принять последовательную дорожку номера - вы должны пронумеровать звуковые дорожки, вызвав mediaPlayer.getAudioDescriptions(). Возвращаемые объекты TrackDescription содержат идентификатор звуковой дорожки, который следует использовать с mediaPlayer.setAudioTrack().

Чтобы отключить звук, вы можете выбрать идентификатор звуковой дорожки дорожки с описанием "Disable".

Также имейте в виду, что вы не сможете установить звуковую дорожку сразу после вызова mediaPlayer.playMedia(). Мультимедиа запускается асинхронно, и вам может потребоваться подождать, пока медиа действительно запустится и/или будет проанализировано, прежде чем будет доступна информация о дорожке.

person caprica    schedule 01.08.2013

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 – экземпляр моего медиаплеера {встраиваемый для большей точности в компоненте плеера}

person Mohammed Housseyn Taleb    schedule 18.12.2019