2017-08-07 116 views
1

我已將代碼修剪至相關部分並在下面發佈。代碼工作正常。視頻在運行時播放,但沒有搜索欄。如何添加一個seekbar到在Java Swing中使用vlcj播放的視頻?

public class Screen { 
//JFrmae 
private JFrame frame; 

// Panel which I add the canvas to 
private JPanel pVid = new JPanel(); 

// Canvas 
Canvas canvas = new Canvas(); 

// Embedded Media Player 
EmbeddedMediaPlayer emp; 


/** 
* Create the application. 
*/ 
public Screen() { 
    initialize(); 
} 

/** 
* Initialize the contents of the frame. 
*/ 
private void initialize() { 
    //Frame 
    frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    //Adding the panel to the frame 
    frame.getContentPane().add(pVid); 

    //Adding the canvas to the panel 
    pVid.add(canvas); 

    //Setting canvas size 
    canvas.setSize(715, 402); 

    //Loading the VLC native library 
    NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "lib"); 
    Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class); 

    //Initializing the media player 
    MediaPlayerFactory mpf = new MediaPlayerFactory(); 

    //Misc 
    emp = mpf.newEmbeddedMediaPlayer(new Win32FullScreenStrategy(frame)); 
    emp.setVideoSurface(mpf.newVideoSurface(canvas)); 

    //Video file name and playing 
    String file = "video.mp4"; 
    emp.prepareMedia(file); 
    emp.play(); 

    //pack method 
    frame.pack(); 
} 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Screen window = new Screen(); 
       window.frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

} 

我在過去4天在線尋找答案。最後我決定在這裏問。 vlcj的官方網站上有他們製作的vlcj播放器的圖片。這些照片中有一個seekbar。鏈接到有圖片的網頁:http://capricasoftware.co.uk/#/projects/vlcj

他們有許多有用的教程,但他們沒有任何添加seekbar的說明。

然後我嘗試從他們的GitHub頁面下載他們的vlcj-player項目。它顯示錯誤,因爲它無法解析應該導入的「com.google.common.collect.ImmutableList」。 (目前我正在閱讀關於ImmutableList和東西的內容,看看是否有辦法解決這個問題。)因爲我還沒弄清楚,我在他們的項目中尋找了一個名爲seekbar的類。我找不到任何東西。

我也在網上搜索了其他地方的答案,但我找不到它。我非常感謝任何幫助。謝謝。

編輯:

(此編輯爲響應由@caprica給我的建議閱讀他們的這個問題和評論我的評論回覆,要明白我在這裏談論英寸這個編輯,我認爲這對未來其他人會有用。)

好吧,我的Eclipse或電腦肯定有問題。 (我會在本評論結尾處列出我是如何解決這個問題的。)它現在正在工作。我會一步一步輸入我所做的事情,以便將來可以幫助其他人下載和安裝項目。

  1. 下載該項目。
  2. 將其導入爲Maven項目。 (導入>的Maven>現有Maven項目)
  3. 現在在Eclipse中右鍵單擊導入的項目,並選擇Run As> Maven的安裝

就是這樣。現在,您可以正常運行項目。如果你不知道如何運行這個項目,就這樣做。右鍵單擊該項目並選擇運行方式> Java應用程序,然後選擇VlcjPlayer - uk.co.caprica.vlcplayer。

或者,您可以打開主方法所在的類並運行它。 VlcjPlayer類是主要方法所在的位置。該類在uk.co.caprica.vlcplayer包中。

我面臨的問題是,當我將它作爲Maven Install運行時,所有必要的文件都沒有得到下載。但它在另一臺電腦上運行良好。由於我知道下載文件的位置,因此我只是將該文件夾從該PC複製並放入PC中的相同位置。文件夾名稱是'存儲庫'。它的位置是C:\ Users \ User Name \ .m2。也許在這臺PC上的Eclipse有一些問題。稍後將重新安裝,以避免將來出現問題。

這可能是有用的,在這臺PC上安裝的VLC是64位。不知道這是否有所作爲,但提及它以防萬一。

現在,該應用程序工作正常,我會看到代碼,看看如何seekbar。非常感謝@caprica告訴我應該將它作爲Maven項目導入。 :)

+1

您需要的所有東西都在vlcj-player項目中,將項目從Github作爲Maven項目導入到您的IDE中,您應該沒問題(應該自動解決您的Google集合庫問題)。正確實施seekbar有一些技巧,你可以通過查找PositionPane類 – caprica

+0

@caprica來開始該項目,我將該項目導入Eclipse作爲Maven項目。我仍然得到確切的錯誤。爲了確保,我嘗試了幾次。不太確定爲什麼我仍然得到錯誤。 – Dan

+0

我歡迎@ caprica的視角;我的目標是在Swing設計中引用基本教程。 – trashgod

回答

0

好的,夥計們。我已經想出瞭如何去做。我不確定在官方Vlcj項目中它是如何完成的,但我已經從官方項目中學習了自己的簡單方法。

它只是需要的幾行代碼。這很簡單。 這些都是你必須要遵循的步驟:

  1. 創建JSlider的。
  2. 向該JSlider的,添加的MouseMotionListener(「的mouseDragged」是精確的)。
  3. 裏面放的是其中將更新基於 在JSlider的變化的視頻位置的代碼。
  4. 創建一個計時器。
  5. 將代碼放在裏面設置JSlider的基於視頻的位置 值。

就是這樣!

這是代碼。它來自initialize()方法,您可以在我在問題中給出的代碼中看到它。 (當然,你還必須創建JSlider的,並將它添加到面板上。我還沒有顯示的代碼,因爲它的簡單。)

js.addMouseMotionListener(new MouseMotionAdapter() { 
    @Override 
     public void mouseDragged(MouseEvent e) { 
     if (js.getValue()/100 < 1) { 
     emp.setPosition((float) js.getValue()/100); 
     } 
    } 
}); 


Timer timer = new Timer(100, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 

     js.setValue(Math.round(emp.getPosition() * 100)); 
    } 

}); 

timer.start(); 

一些解釋。

你當你使用emp.getPosition似乎總是以小數的值。在視頻開始的時候它就像0.1334344一樣,最後是0.998988。但JSlider的價值在於int。從0到100.所以在添加到JSlider的mouseMotionListener中,我已經將JSlider的int值通過除以100來浮動。

而在定時器中的動作偵聽器中,我已經乘以將視頻位置減去100,然後將其四捨五入以使其成爲一個整型值。因此,可以在JSlider中設置該值以使其與視頻同步。

我確定代碼是基本的,可能有一些我可能沒有遵循的最佳實踐。對不起,但我只是通過學習我覺得有趣的東西進入java。那些擅長Java並在實際項目中使用過這樣的代碼的人可以在下面評論它如何改進。

+0

從媒體播放器收聽「位置更改」事件,然後在UI線程上更新滑塊,比每100ms IMO輪詢媒體播放器要好。 – caprica

+0

聽起來好多了。所以爲此,我必須創建一個自定義偵聽器嗎?我已經找到並找到了一些教程。我將學習如何做到這一點,並在答案中更新它。再次感謝! – Dan

1

Basic Controls教程顯示了基本方法:向框架添加一個按鈕面板,併爲每個按鈕調用相關媒體播放器命令ActionListener。舉個例子,這個名義上的快退按鈕會「向後跳10秒(-10,000毫秒)」。

JPanel controlsPane = new JPanel(); 
JButton rewindButton = new JButton("Rewind"); 
rewindButton.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     mediaPlayerComponent.getMediaPlayer().skip(-10000); 
    } 
}); 
controlsPane.add(rewindButton); 
frame.add(controlsPane, BorderLayout.SOUTH); 

軟件設計是你的,但你至少應該知道

+0

一個很大的障礙是我不知道我必須創建的組件的名稱。我其實已經想出瞭如何製作暫停和跳過按鈕。因爲我知道我必須創建JButton並使用ActionListeners等。但對於seekbar,我真的不知道我應該創造什麼。 – Dan

+0

@caprica可能會有更好的東西,但是我會讓'Timer'調用'skip';跳過第二個250 ms將是4倍。 – trashgod

+0

這是相當整潔。謝謝。如果我無法弄清楚如何從項目中找到seekbar,我會按照你的建議。謝謝。 – Dan

相關問題