随笔 - 67  文章 - 79  trackbacks - 0
<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(1)

随笔档案

文章档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜

现在的毕业设计越做越出花来了  用java进行视频捕捉这样的需求也会出现 其实也不是不可以 只是这样做有意思吗

简单上网查了下 用java捕捉不外乎用采集卡原生的api做个jni的wrapper和用directshow或vfw等windows通用的api做jni两种做法 当然有同学硬要做video4linux的api我也不会反对的

因为我没有那位同学的采集卡 所以用厂商的sdk的方案短期内不现实  所以我用了sun的jmf库来采集

jmf在windows平台下用的是vfw api 效率比较低 另外有一个商业的directshow的java wrapper名字叫dsj 这个性能基本和c++打平了 不过这个需要授权费 所以算了吧
jmf的安装很简单 去 http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/download.html 下载下来 安装好以后在桌面会看到一个JMStudio图标 运行JMStudio如果视频采集正常的话 说明jmf能识别采集卡(其实就是采集卡提供了vfw接口)至此视频采集成功了大半 简单吧

=============================================================================================================================
下面是代码片断和简单说明
PlayerFrame是一个视频播放控制类 我们就创建一个继承自他的新类Demo
public class Demo extends PlayerFrame {

    public Demo() {
        super(null, "Capture");
    }
...

设备的选择连接和打开
CaptureDialog是一个捕捉设备选择对话框
JMFUtils.createCaptureDataSource函数根据设备创建datasource
private void init() throws NoPlayerException, IOException {
        // setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        String nameCaptureDeviceAudio = null;
        String nameCaptureDeviceVideo = null;

        CaptureDialog dialogCapture = new CaptureDialog(this, null);
        dialogCapture.show();
        if (dialogCapture.getAction() == CaptureDialog.ACTION_CANCEL)
            return;

        CaptureDeviceInfo cdi = dialogCapture.getAudioDevice();
        if (cdi != null && dialogCapture.isAudioDeviceUsed())
            nameCaptureDeviceAudio = cdi.getName();
        cdi = dialogCapture.getVideoDevice();
        if (cdi != null && dialogCapture.isVideoDeviceUsed())
            nameCaptureDeviceVideo = cdi.getName();
        dataSource = JMFUtils.createCaptureDataSource(nameCaptureDeviceAudio,
                dialogCapture.getAudioFormat(), nameCaptureDeviceVideo,
                dialogCapture.getVideoFormat());
        DataSource cdswrapper = new CDSWrapper(
                (PushBufferDataSource) dataSource);
        dataSource=cdswrapper;
        dataSource.connect();
        open(dataSource);
...

preview画面显示控件的放置
    public void createComponent() throws NoPlayerException, IOException {
        setTitle("视频信号");
        //        addWindowListener(new WinClose());

        panel = new JPanel();

        if ((com = mediaPlayerCurrent.getVisualComponent()) != null) {
            panel.add(com);
        }
        add(BorderLayout.CENTER, panel);

    }

单帧捕捉
JButton capture = new JButton("Capture Image");
        capture.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                mediaPlayerCurrent.stop();
                Buffer bufferFrame;
                BufferToImage bufferToImage;
                Image image;
                BufferedImage bi;
                controlGrabber = (FrameGrabbingControl) mediaPlayerCurrent
                        .getControl("javax.media.control.FrameGrabbingControl");
                bufferFrame = controlGrabber.grabFrame();
                bufferToImage = new BufferToImage((VideoFormat) bufferFrame
                        .getFormat());

                image = bufferToImage.createImage(bufferFrame);

                File out = new File("capture" + (++captureCount) + ".png");
                try {
                    bi = toBufferedImage(image);
                    ImageIO.write(bi, "png", out);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }

                mediaPlayerCurrent.start();

            }
        });

写好的文件在 http://www.blogjava.net/Files/zarra/Demo001.zip
posted on 2008-05-10 12:33 zarra 阅读(1340) 评论(6)  编辑  收藏

FeedBack:
# re: java的视频捕捉 [未登录] 2008-05-11 14:08 apple
老师,您辛苦了!!真的不知道该怎么谢您了!!  回复  更多评论
  
# re: java的视频捕捉 [未登录] 2008-05-19 16:51 zz
老师您好,怎样将一幅图片的色彩值,即就是R、G、B值提取出来  回复  更多评论
  
# re: java的视频捕捉  2008-05-22 16:02 zarra
@zz
这个问题太大了 。。。
你的是什么图片 已编码的图像文件 raw像素值 从图形设备上捕捉到的位图?   回复  更多评论
  
# re: java的视频捕捉 [未登录] 2008-05-26 21:38 zz
我的毕业设计题目是:视频摘要系统。本来是打算通过一副参照图片,将其图像信息提取,然后依据所提取数据,自动捕捉视频中与其相似的图片出来。以我现在的水平,时间刻不容缓,马上答辩了,只能做到在视频播放过程中,捕捉图像(已经实现),然后将捕捉到的图片存储下来,并对其色彩值提取出来。现附上源码,希望老师帮帮我,一是捕捉图片后能存储,二是提取所捕获图片信息。

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import com.sun.image.codec.jpeg.*;

class ImageCanvas extends Canvas{
private Image image;
private Dimension prefSize;

public ImageCanvas(Image image){
this.image = image;
calculatePreferredSize();
}

public void setImage(Image image){
this.image = image;
calculatePreferredSize();
repaint();
}

private void calculatePreferredSize(){
prefSize = new Dimension(image.getWidth(this),image.getHeight(this));
System.out.println(image.getWidth(this));
setSize(prefSize);
}

public Dimension getPreferredSize() {
return prefSize;
}

public Dimension getMinimumSize() {
return prefSize;
}

public void update(Graphics g){
paint(g);
}
public void paint(Graphics g){
g.drawImage(image,0,0,null);
}
}

class ImageUtils{
public static Image getScreenImage(){
Robot robot;
try {
robot = new Robot();
}catch(Exception e) {
throw new RuntimeException("unable to construct Robot");
}
Dimension screenDims =Toolkit.getDefaultToolkit().getScreenSize();
Image screen =robot.createScreenCapture(new Rectangle (140,60,screenDims.width,screenDims.height)).getScaledInstance (400,300,Image.SCALE_SMOOTH);
MediaTracker tracker =new MediaTracker(new Label());
tracker.addImage(screen,1);
try {
tracker.waitForID(0);
}catch(InterruptedException e) { /** ... */ }
return screen;
}
}

public class ScreenCapture extends JFrame{
private ImageCanvas canvas =new ImageCanvas(ImageUtils.getScreenImage());
public ScreenCapture(){
add(canvas);
setLocation(0,0);
setSize(400,350);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Thread imageThread =new UpdateThread();
imageThread.setDaemon(true);
imageThread.start();
}

class UpdateThread extends Thread{
public void run(){
while(true){
try {
Thread.currentThread().sleep(1000);
}
catch (Exception ex) {

}
canvas.setImage(ImageUtils.getScreenImage());
validate();
}
}
}

public static void main(String[] args){
new ScreenCapture();

}
}  回复  更多评论
  
# re: java的视频捕捉 [未登录] 2008-05-28 09:14 zarra
@zz
方便的话给各联系方式

保存图片的方法 看看 这个能不能给你点帮助

Buffer bufferFrame;
BufferToImage bufferToImage;
Image image;
BufferedImage bi;
controlGrabber = (FrameGrabbingControl) mediaPlayerCurrent
.getControl("javax.media.control.FrameGrabbingControl");
bufferFrame = controlGrabber.grabFrame();
bufferToImage = new BufferToImage((VideoFormat) bufferFrame
.getFormat());

image = bufferToImage.createImage(bufferFrame);

File out = new File("capture" + (++captureCount) + ".png");

其实就是java的Buffer BufferToImage 和 BufferedImage 三个类  回复  更多评论
  
# re: java的视频捕捉 [未登录] 2008-05-28 16:44 zz
@zarra
谢谢老师!
QQ:171189195
e-mail:lovelife619@163.com
方便的话也留个您的联系方式  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: