JRuby and vlcj – A Simple Full-Screen Media Player

I recently spent some time writing a simple program to play a movie file full screen on a Linux machine. I wrote the program in JRuby using the vlcj framework, which wraps the VLC media player library libVLC.

There are a number of vlcj fullscreen examples around, including an example that comes with the vlcj source code. I had not done much JRuby/Java interop work, so it still took some work for me to get this working in JRuby. To save someone else from the same problems, I thought I would share my work here.

The following script expects the vlcj jars to be in the same directory, and expects libvlc to be installed in a standard location on the machine. The first argument to the script is
 
expected to be the path to a movie file (e.g. movie_trailer.mp4), which will be played full screen with no window decoration.

require File.expand_path(File.dirname(__FILE__)) + '/vlcj-2.1.0.jar'

java_import Java::UkCoCapricaVlcjBinding::LibVlc
java_import Java::UkCoCapricaVlcjPlayer::MediaPlayerFactory
java_import Java::UkCoCapricaVlcjPlayerEmbeddedX::XFullScreenStrategy
java_import Java::UkCoCapricaVlcjRuntime::RuntimeUtil

java_import java.awt.Canvas
java_import java.awt.Color
java_import java.awt.BorderLayout

java_import javax.swing.SwingUtilities
java_import javax.swing.JFrame

java_import com.sun.jna.Native

class MediaPlayer
  def initialize
    library_name = RuntimeUtil.get_lib_vlc_library_name

    # If libvlc is not in a default search path add the path
    # NativeLibrary.add_search_path library_name, '/path/to/libvlc'

    Native.loadLibrary(library_name, LibVlc.java_class)
  end

  def play(mrl)
    SwingUtilities.invokeLater do
      play_movie mrl
    end
  end

  private

  def play_movie(mrl)
    media_player = build_media_player
    media_player.play_media mrl
  end

  def build_media_player
    libvlc_args = [
      '--no-plugins-cache',
      '--no-video-title-show',
      '--no-snapshot-preview',
      '--quiet',
      '--quiet-synchro',
      '--intf',
      'dummy'
    ]

    # Set up the Swing UI
    frame = JFrame.new('Media Player')
    frame.background = Color::BLACK
    canvas = Canvas.new
    canvas.background = Color::BLACK
    frame.add(canvas, BorderLayout::CENTER)
    frame.undecorated = true
    frame.visible = true

    # Set up vlcj
    media_player_factory = MediaPlayerFactory.new(libvlc_args)
    media_player = media_player_factory.new_embedded_media_player(XFullScreenStrategy.new(frame))
    media_player.video_surface = media_player_factory.new_video_surface(canvas)

    media_player.full_screen = true

    media_player
  end
end

MediaPlayer.new.play ARGV[0]

This is the simplest player possible, but there are tons of options for making something more sophisticated. And thanks to JRuby and vlcj writing a media player can be done from the comfort of a Ruby program.
 

Reference: JRuby and vlcj – A Simple Full-Screen Media Player from our JCG partner Patric Bacon at the Atomic Spin blog.

Share and enjoy!
Post to Facebook Post to TwitterPost to Google+Post to Delicious Post to StumbleUponAdd to LinkedInAdd to DiggAdd to RedditSend via Mail


© 2010-2012 Java Code Geeks. Licenced under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
All trademarks and registered trademarks appearing on Java Code Geeks are the property of their respective owners.
Java is a trademark or registered trademark of Oracle Corporation in the United States and other countries.
Java Code Geeks is not connected to Oracle Corporation and is not sponsored by Oracle Corporation.