使用xuggler在jpanel上播放视频

时间:2015-08-30 14:28:20

标签: java swing xuggler

我想创建一个扩展类jpanel。
该班必须播放mp4电影 我用Xuggler来演奏它 我创建这个类扩展了JFrame,但是我想帮助把它放在jpanel或Canvas中,或者我可以把它放在jframe中。

package pack;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

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

import com.xuggle.mediatool.IMediaReader;
import com.xuggle.mediatool.MediaListenerAdapter;
import com.xuggle.mediatool.ToolFactory;
import com.xuggle.mediatool.event.IVideoPictureEvent;

public class VideoPlayer
{

  public static void main(String[] args)
  {
    String sourceUrl = "D:\\DriSch\\Intro.MP4";

    VideoPlayer videoPlayer = new VideoPlayer();
    videoPlayer.play(sourceUrl);
  }

  public void play(String sourceUrl)
  {
    IMediaReader reader = ToolFactory.makeReader(sourceUrl);
    reader.setBufferedImageTypeToGenerate(BufferedImage.TYPE_3BYTE_BGR);

    final MyVideoFrame frame = new MyVideoFrame();
    frame.setSize(new Dimension(500, 500));

    MediaListenerAdapter adapter = new MediaListenerAdapter()
    {
      @Override
      public void onVideoPicture(IVideoPictureEvent event)
      {
        frame.setImage((BufferedImage) event.getImage());
      }
    };
    reader.addListener(adapter);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    while (reader.readPacket() == null)
      do {} while(false);
  }

  @SuppressWarnings("serial")
  private class MyVideoFrame extends JFrame
  {
    Image image;

    public void setImage(final Image image)
    {
      SwingUtilities.invokeLater(new Runnable()
      {
        public void run()
        {
          MyVideoFrame.this.image = image;
          repaint();
        }
      });
    }

    @Override
    public synchronized void paint(Graphics g)
    {
      if (image != null)
      {
        g.drawImage(image, 0, 0, null);
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

这对我有用,但似乎很容易让我担心我错过了一项要求。

private static class MyVideoPanel extends JPanel {

    Image image;

    public void setImage(final Image image) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                MyVideoPanel.this.image = image;
                repaint();
            }
        });
    }

    @Override
    public synchronized void paint(Graphics g) {
        if (image != null) {
            g.drawImage(image, 0, 0, null);
        }
    }
}