欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

教你輕松制作java視頻播放器

 更新時間:2017年06月05日 10:29:55   作者:clayanddev  
這篇文章主要為大家詳細(xì)介紹了如何編寫屬于自己的java視頻播放器,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

跳過廢話,直接看正文

當(dāng)年入坑Java是因為它的跨平臺優(yōu)勢。那時我認(rèn)為,”編寫一次,處處運(yùn)行。”應(yīng)該是所有語言發(fā)展的終極之道,java勢必會一統(tǒng)天下。

然而事實證明,那時的我還是太年輕。

正所謂魚和熊掌不可兼得,若要享受跨平臺帶來的方便,便不可避免地要接受性能上的不足。事實上,java一直在致力于提高虛擬機(jī)的性能(JIT等技術(shù)),但面對對實時計算性能要求很高或涉及到用硬件優(yōu)化的任務(wù)(視頻的硬件編碼、解碼)時,仍遠(yuǎn)遠(yuǎn)比不上c或c++。因此,很少能夠看到有人用java來寫這類軟件。

回到正題,要想寫一個視頻播放器,勢必要處理不同的視頻格式(mp4、avi、rmvb、flv等)。每一類格式的視頻都必須要有對應(yīng)的解碼器才能播放。絕大多數(shù)解碼器的庫都是基于效率高的c或c++寫成的,用java的寫解碼器的庫非常少。

因此,要想用java寫一個視頻播放器,只有以下兩個選擇:

 •使用純java編寫,自己編寫主流視頻格式的軟件解碼器、結(jié)合Java媒體框架(JMF)完成視頻解碼任務(wù)。
 •使用jni調(diào)用現(xiàn)有的c或c++的解碼器庫,完成視頻解碼任務(wù) 

使用java自己編寫軟件解碼器的優(yōu)點是能夠真正地實現(xiàn)跨平臺,也能很方便靈活地與swing框架結(jié)合。然而缺點是太過麻煩,先不說軟件解碼器的效率問題,各種主流視頻格式的解碼器的車輪能否成功地重造都是一個值得商榷的問題。

因此,我采用了第二種辦法,通過jni調(diào)用現(xiàn)有的第三方視頻解碼庫來完成視頻解碼的任務(wù),而視頻的顯示、控制的邏輯則交由java來完成。這樣便能夠?qū)崿F(xiàn)一個效率較高的視頻播放器。值得一提的是,雖然根據(jù)平臺類型來調(diào)用不同平臺也能夠?qū)崿F(xiàn)跨平臺,但是會受到諸多限制,這是不可避免的。

接下來便來看看具體怎么實現(xiàn)一個視頻播放器吧。

正文

解碼器的選擇

視頻格式有很多,解碼器也有很多,因此要分別尋找對應(yīng)的解碼器并封裝成jni接口進(jìn)行調(diào)用是一個繁瑣的任務(wù),因此我們可以找一個已經(jīng)封裝了多種主流解碼器的媒體處理框架(視頻播放器)的庫來直接進(jìn)行調(diào)用。VLC是一個非常好的選擇。

VLC media player VLC 是一款自由、開源的跨平臺多媒體播放器及框架,可播放大多數(shù)多媒體文件,以及 DVD、音頻 CD、VCD 及各類流媒體協(xié)議。

在vlc的庫上,我們要用jni進(jìn)行一定的封裝,從而能用java來調(diào)用視頻的解碼和播放控制接口。好在我們不必重造車輪。vlcj是一位國外開發(fā)者用java開發(fā)的一個媒體處理框架,底層使用的正是vlc播放器,通過jni調(diào)用vlc來完成音頻的解碼任務(wù)。

開發(fā)流程

 •安裝VLC Media Player(我安裝的版本是2.2.4,最好安裝到默認(rèn)目錄)
 •建立普通maven項目,添加vlcj的依賴 

<dependency>
  <groupId>uk.co.caprica</groupId>
  <artifactId>vlcj</artifactId>
  <version>3.10.1</version>
</dependency>

 •正式開發(fā)

接下來就是代碼干貨了,將會介紹三個項目,都是基于這個vlcj的視頻播放器。

入門示例

這是vlcj作者提供的入門示例程序,能夠快速實現(xiàn)一個簡單的視頻播放器,當(dāng)然,僅僅是播放而已,不提供控制功能。
這里用的vlcj中提供的內(nèi)嵌視頻播放組件EmbeddedMediaPlayerComponent,通過其中的mediaPlayer中的playMedia方法可以直接播放視頻,視頻會渲染到EmbeddedMediaPlayerComponent上。EmbeddedMediaPlayerComponent這個組件中提供了很多其他功能,若要實現(xiàn)一個普通的視頻播放器,了解這個組件便足夠了。

代碼

package tutorial;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.discovery.NativeDiscovery;

public class Tutorial {

  private final JFrame frame;

  private final EmbeddedMediaPlayerComponent mediaPlayerComponent;

  public static void main(final String[] args) {
    new NativeDiscovery().discover();
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        new Tutorial(args);
      }
    });
  }

  public Tutorial(String[] args) {
    frame = new JFrame("My First Media Player");
    frame.setBounds(100, 100, 600, 400);
    frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    frame.addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent e) {
        mediaPlayerComponent.release();
        System.exit(0);
      }
    });
    mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
    frame.setContentPane(mediaPlayerComponent);
    frame.setVisible(true);
    mediaPlayerComponent.getMediaPlayer().playMedia(args[0]);
  }
}

vlcj-player

這是vlcj作者自己基于vlcj寫的一個開源播放器,功能很全面,完全可以用來作為平時的視頻播放器來使用。由于這個項目內(nèi)容較多,不便將代碼列出。

項目地址詳見https://github.com/caprica/vlcj-player

javaplayer

這個是我基于vlcj寫的一個簡單的視頻播放器,支持一些簡單的視頻播放控制功能和播放彈幕的功能。
開發(fā)這個播放器是出于對java編寫視頻播放器的好奇心,因此沒有提供比較完善的功能,畢竟耗時耗力。只是結(jié)合了我之前寫過的一個彈幕播放器,為這個視頻播放器添加了彈幕播放的功能,方便能在播放本地視頻的過程中播放b站的彈幕。

項目地址詳見https://github.com/clayandgithub/javaplayer

后記

在開發(fā)過程中遇到一些坑,如視頻渲染組件的透明問題,以及swing的重繪機(jī)制導(dǎo)致的一些界面顯示上的bug。有些完全解決了,有些則只是采用曲線救國的方法解決的。如果你在開也遇到了這些問題,歡迎一起交流探討。

附:vlcj的官方文檔

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java Scanner輸入數(shù)字、字符串過程解析

    java Scanner輸入數(shù)字、字符串過程解析

    這篇文章主要介紹了java Scanner輸入數(shù)字、字符串過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • java javax.annotation.Resource注解的詳解

    java javax.annotation.Resource注解的詳解

    這篇文章主要介紹了javax.annotation.Resource注解的詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Java線程池之線程復(fù)用原理全面解析

    Java線程池之線程復(fù)用原理全面解析

    這篇文章主要介紹了Java線程池之線程復(fù)用原理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java中精確的浮點運(yùn)算操作示例

    Java中精確的浮點運(yùn)算操作示例

    這篇文章主要介紹了Java中精確的浮點運(yùn)算操作方法,結(jié)合具體實例形式分析了java浮點數(shù)運(yùn)算的相關(guān)函數(shù)、使用技巧與注意事項,需要的朋友可以參考下
    2017-06-06
  • java 關(guān)鍵字static詳細(xì)介紹及如何使用

    java 關(guān)鍵字static詳細(xì)介紹及如何使用

    這篇文章主要介紹了java 關(guān)鍵字static詳細(xì)介紹及如何使用的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Spring高階用法之自定義業(yè)務(wù)對象組件化

    Spring高階用法之自定義業(yè)務(wù)對象組件化

    這篇文章主要介紹了Spring高階用法之自定義業(yè)務(wù)對象組件化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 解決spring cloud gateway 獲取body內(nèi)容并修改的問題

    解決spring cloud gateway 獲取body內(nèi)容并修改的問題

    這篇文章主要介紹了解決spring cloud gateway 獲取body內(nèi)容并修改的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • java編程實現(xiàn)根據(jù)EXCEL列名求其索引的方法

    java編程實現(xiàn)根據(jù)EXCEL列名求其索引的方法

    這篇文章主要介紹了java編程實現(xiàn)根據(jù)EXCEL列名求其索引的方法,涉及Java元素遍歷與數(shù)學(xué)運(yùn)算的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • 利用Java編寫24點小游戲的實例代碼

    利用Java編寫24點小游戲的實例代碼

    這篇文章主要給大家介紹了關(guān)于如何利用Java編寫24點小游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Springboot集成fastDFS配置過程解析

    Springboot集成fastDFS配置過程解析

    這篇文章主要介紹了Springboot集成fastDFS配置過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11

最新評論