Search code examples
javaswingjslidervlcj

How to make a Jslider that can be a timeline for videos using vlcj framework


I got some troubles on making my jslider run synchronize with the video i played. Here is my sample codes.

public Test() {


NativeLibrary.addSearchPath( RuntimeUtil.getLibVlcLibraryName(), "lib");
      Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);

        mediaPlayer = new EmbeddedMediaPlayerComponent(); 
          p2.setLayout(newBorderLayout());
p2.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);  
b2.setIcon(new ImageIcon("pause.png"));
b2.revalidate();
b3.setIcon(new ImageIcon("skip.png"));
b3.revalidate();
b3.repaint();
p2.add(mediaPlayer);
mediaPlayer.getMediaPlayer().playMedia("intranet.mp4");
   slider.setValue((int) mediaPlayer.getMediaPlayer().getLength());  
      }

Then, on my buttons here is my sample code..

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    int time = (int) mediaPlayer.getMediaPlayer().getLength();


    JOptionPane.showMessageDialog(null,time);

}                                        

private void sliderStateChanged(javax.swing.event.ChangeEvent evt) {                                    

    label1.setText("Value" + slider.getValue());
}                                   

private void b3ActionPerformed(java.awt.event.ActionEvent evt) {                                   

    mediaPlayer.getMediaPlayer().skip(10000);
    JOptionPane.showMessageDialog(null, mediaPlayer.getMediaPlayer().getLength());
}                                  

private void b2ActionPerformed(java.awt.event.ActionEvent evt) {                                   

    mediaPlayer.getMediaPlayer().pause();
    b2.removeAll();
}                                  

private void b1ActionPerformed(java.awt.event.ActionEvent evt) {                                   


    mediaPlayer.getMediaPlayer().skip(-10000);
    int time = (int) mediaPlayer.getMediaPlayer().getLength();
    JOptionPane.showMessageDialog(null, mediaPlayer.getMediaPlayer().getLength());



}   

My problem is that i can know whats the total time of the videos that i played and i don't have many ideas when the video is played then the slider too will run with its designated time. Thanks for the suggestions in advance, I'm looking forward to it!!


Solution

  • use overridden method: Timechanged and link it to jslider, each time the new instant video will be sent to change slider progress.

    mediaplayer = new EmbeddedMediaPlayerComponent();
    
            embededMediaPlayer = mediaplayer.getMediaPlayer();
            embededMediaPlayer.setRepeat(true);
            videoSurface = mediaplayer.getVideoSurface();
    
            embededMediaPlayer.addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
                /**
                 *
                 * @param mediaPlayer play video
                 * @param newTime get every millisecond changed in the mediaplayer
                 * when is in playing mode
                 */
                @Override
                public void timeChanged(MediaPlayer mediaPlayer, long newTime) {
                    super.timeChanged(mediaPlayer, newTime);
                    // here put you code to set new slider progress value 
                    }
                });