Java JVLC Introduction
多媒體在現今資訊科技的應用上為不可或缺的一環,然而在 Sun Java 對多媒體的支援卻一直是處於不成熟的階段。早期的 Java Media Framework (JMF) 到了2003年以後就沒有進一步的更新了,如此似乎也意味著Java對多媒體這項領域的支援已經不再投入心力。 不僅僅是如此,JMF 在 Microsoft Windows Vista 的支援上也是處處碰壁,進而產生了以 Eevised BSD License (GPL 相容) 授權的 Java Media Framework 實做,稱為 FMJ。FMJ發展的目的就是為了補足 JMF 對多媒體的應用與支援。 然而除了 FMJ 以外也還有其他選擇,就是本文介紹的 Java VideoLan Client Bindings,JVLC。VLC 這項 Open Source 的播放程式我想大家都有聽過,而 JVLC 就是使用 VLC 來發展而成的。 JVLC 在 Java 上使用 JNI 與 JNA 來進行實作,與目前Mplayer的方式是一樣的。
Application
JVLC 在應用上除了播放影片、更能夠直接播放 Stream Media 與開啟硬體輸入介面,自身已經提供 RTP 的實作,可以直接產生 Server 讓 VLC Client 端連線。 當然 JVLC 一樣擁有跨平台的特性,此外對於 OSGI 也有相關的發展,經過實際的測試後,在 Java Swing 與 SWT 下都能正確的播放影片,而且能夠直接 Snap Screen 產生圖片。
Implementation
接下來測試 Win-32 實做 JVLC 播放影片,以下分別使用Swin與SWT進行實作。
下載 JVLC Library JAR
http://jvlc.ihack.it/releases/jvlc-core-0.9.0-SNAPSHOT-20080727.jar 內容已經包含JNA
下載 VLC DLL
http://download.videolan.org/pub/testing/win32/vlc-0.7.2-win32-upx1.zip
Java Code (Swin)
import java.awt.Canvas; import java.awt.Frame; import javax.swing.JPanel; import org.videolan.jvlc.JVLC; import org.videolan.jvlc.Playlist; public class SwinJvlc{ public static void main(String[] args) throws Exception { Frame frame = new java.awt.Frame(); frame.setBounds(0, 0, 600, 600); Canvas canvas = new Canvas(); canvas.setSize(400, 400); JPanel jpl = new JPanel(); jpl.add(canvas); frame.add(jpl); frame.setVisible(true); String[] arg = new String[4]; arg[0] = "--intf=dummy"; arg[1] = "--ignore-config"; arg[2] = "--no-plugins-cache"; arg[3] = "--plugin-path=plugins"; JVLC jvlc = new JVLC(arg); jvlc.setVideoOutput(canvas); Playlist playlist = new Playlist(jvlc); playlist.add("D:/3.avi", "1"); playlist.play(); } }
Java Code (SWT)
import java.awt.Canvas; import java.awt.Frame; import javax.swing.JButton; import org.eclipse.swt.SWT; import org.eclipse.swt.awt.SWT_AWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.*; import org.videolan.jvlc.JVLC; import org.videolan.jvlc.Playlist; import org.videolan.jvlc.VLCException; public class SWTJvlc { public static void main(String[] args) throws Exception { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); shell.setSize(400, 400); Composite composite = new Composite(shell,SWT.EMBEDDED); Canvas canvas = new Canvas(); canvas.setSize(400, 400); //調用SWT_AWT元件 Frame f = SWT_AWT.new_Frame(composite); f.add(canvas); String[] arg = new String[4]; arg[0] = "--intf=dummy"; arg[1] = "--ignore-config"; arg[2] = "--no-plugins-cache"; arg[3] = "--plugin-path=plugins"; JVLC jvlc = new JVLC(arg); jvlc.setVideoOutput(canvas); Playlist playlist = new Playlist(jvlc); playlist.add("D:/3.avi", "1"); playlist.play(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } }
Conclusion
VLC 目前支援的 OS 有 Windows, Mac OS X, Linux, BSD, Unix。 VLC 目前支援的 Stream 有 HTTP, RTSP, MMS。 未來假設在監視或視訊的領域上有所需求時,可以考慮 JVLC 對開發上或許會有不錯的幫助。JVLC 使用 JNI 的方式連接周邊設備,相較於 JMF 不但速度有所提昇,而且可同時對多裝置進行連接,這也是 JMF 做不到的。 此外在影像與視訊的編碼壓縮上,也是一個能夠深入研究的課題,然而目前 FMJ 所採用的 ffmgep 已有成熟的技術可以引用,我相信未來 Java 在多媒體的應用上還是有不錯的出路。
Reference
- Sun Java Media Framework 官方網站
http://java.sun.com/javase/technologies/desktop/media/jmf/ - FMJ Project
http://fmj-sf.net/ - JVLC 網站
http://trac.videolan.org/jvlc/ - JVLC OSGI 網站
http://vlc4osgi.forge.os4os.org/