能找到的javacv视频播放器的示例,都是使用CanvasFrame-一个继承自JFrame的顶层窗体,作为播放器。
本例对其抽取,使用JPanel实现,可以嵌入到JFrame或JPanel中,使用更灵活。
仅实现原播放功能。
1.播放控件。关键字:JPanel、javacv.Frame、Canvas。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
package com.cuiweiyou.cutor; import org.bytedeco.javacv.Frame; import org.bytedeco.javacv.Java2DFrameConverter; import javax.swing.JPanel; import java.awt.Canvas; import java.awt.color.ColorSpace; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferStrategy; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; /** * 可嵌入到JFrame或JPanel的FFmpegFrameGrabber载体 * www.gaohaiyan.com */ public class PlayView extends JPanel { private PlayCanvas playCanvas; /** * 在窗体 setVisible(true); 之前进行定义,并加入父容器 * 设置宽高、背景、布局、边框 等属性。 * 如果界面会出现偏差,尝试其它布局 */ public PlayView() { } /** * 初始化。在窗体 setVisible(true); 之后调用 */ public void init() { playCanvas = new PlayCanvas(); add(this.playCanvas); // 先 添加画布,再进行其它设置 playCanvas.setSize(getPreferredSize()); // 画布尺寸 playCanvas.createBufferStrategy(2); // 2个缓冲区 } /** * 播放 * 播放一张图片---FFmpegFrameGrabber读取的视频的某一帧 * * @param frame JavaCV格式的视频帧 */ public void playFrame(Frame frame) { Java2DFrameConverter converter = new Java2DFrameConverter(); BufferedImage image = converter.getBufferedImage(frame, 1.0D, false, (ColorSpace) null); if (image != null) { playCanvas.setPlayImage(image); playCanvas.paint(null); // 调用的是重写的方法 } } /** * 自定义画布 */ private class PlayCanvas extends Canvas { private Image image; public void setPlayImage(Image img) { image = img; } // 重写方法 @Override public void update(Graphics g) { this.paint(g); } // 重写方法 @Override public void paint(Graphics graph) { try { int width = getWidth(); int height = getHeight(); if (width <= 0 || height <= 0) { return; } BufferStrategy strategy = getBufferStrategy(); while (true) { Graphics g = strategy.getDrawGraphics(); if (image != null) { g.drawImage(image, 0, 0, width, height, (ImageObserver) null); } g.dispose(); if (!strategy.contentsRestored()) { strategy.show(); if (!strategy.contentsLost()) { break; } } } } catch (NullPointerException var3) { } catch (IllegalStateException var4) { } } } } |
2.播放器控件的设置,加入窗体。首先,加入窗体或父容器,然后显示窗体,最后初始化播放器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// 伪代码:创建播放器 private Component getVidePanel(int panelWidth, int panelHeight) { playView = new PlayView(); playView.setBackground(Color.WHITE); playView.setLayout(new BoxLayout(playView, BoxLayout.Y_AXIS)); playView.setBorder(BorderFactory.createEmptyBorder()); playView.setPreferredSize(new Dimension(panelWidth, panelHeight - 11)); return playView; } // 伪代码:加入窗体 JFrame.add(getVidePanel(w, h)); // 伪代码:显示窗体-打开软件 JFrame.setVisible(true); // 伪代码:最后初始化播放器 playView.init(); |
3.使用。关键字:FFmpegFrameGrabber。
1 2 3 4 5 6 7 8 9 10 11 |
FFmpegFrameGrabber ffmpegFrameGrabber = FFmpegFrameGrabber.createDefault(mediaPath); // 加载本地视频 ffmpegFrameGrabber.start(); // 开始播放 while (true) { // 持续读取帧 Frame videoFrame = ffmpegFrameGrabber.grabImage(); // 当前视频帧 if (null == videoFrame) { continue; } player.playFrame(videoFrame); // 播放这一帧 } |
-end
声明
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/2736.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设