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