有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用xuggler在jpanel上播放视频

我想创建一个扩展了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) 个答案

  1. # 1 楼答案

    这对我来说很有效,但似乎太容易了,我担心自己错过了一个要求

    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);
            }
        }
    }