<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    常用鏈接

    留言簿(1)

    隨筆檔案

    文章檔案

    相冊(cè)

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    現(xiàn)在的畢業(yè)設(shè)計(jì)越做越出花來(lái)了  用java進(jìn)行視頻捕捉這樣的需求也會(huì)出現(xiàn) 其實(shí)也不是不可以 只是這樣做有意思嗎

    簡(jiǎn)單上網(wǎng)查了下 用java捕捉不外乎用采集卡原生的api做個(gè)jni的wrapper和用directshow或vfw等windows通用的api做jni兩種做法 當(dāng)然有同學(xué)硬要做video4linux的api我也不會(huì)反對(duì)的

    因?yàn)槲覜](méi)有那位同學(xué)的采集卡 所以用廠商的sdk的方案短期內(nèi)不現(xiàn)實(shí)  所以我用了sun的jmf庫(kù)來(lái)采集

    jmf在windows平臺(tái)下用的是vfw api 效率比較低 另外有一個(gè)商業(yè)的directshow的java wrapper名字叫dsj 這個(gè)性能基本和c++打平了 不過(guò)這個(gè)需要授權(quán)費(fèi) 所以算了吧
    jmf的安裝很簡(jiǎn)單 去 http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/download.html 下載下來(lái) 安裝好以后在桌面會(huì)看到一個(gè)JMStudio圖標(biāo) 運(yùn)行JMStudio如果視頻采集正常的話 說(shuō)明jmf能識(shí)別采集卡(其實(shí)就是采集卡提供了vfw接口)至此視頻采集成功了大半 簡(jiǎn)單吧

    =============================================================================================================================
    下面是代碼片斷和簡(jiǎn)單說(shuō)明
    PlayerFrame是一個(gè)視頻播放控制類(lèi) 我們就創(chuàng)建一個(gè)繼承自他的新類(lèi)Demo
    public class Demo extends PlayerFrame {

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

    設(shè)備的選擇連接和打開(kāi)
    CaptureDialog是一個(gè)捕捉設(shè)備選擇對(duì)話框
    JMFUtils.createCaptureDataSource函數(shù)根據(jù)設(shè)備創(chuàng)建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畫(huà)面顯示控件的放置
        public void createComponent() throws NoPlayerException, IOException {
            setTitle("視頻信號(hào)");
            //        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();

                }
            });

    寫(xiě)好的文件在 http://www.tkk7.com/Files/zarra/Demo001.zip
    posted on 2008-05-10 12:33 zarra 閱讀(1473) 評(píng)論(6)  編輯  收藏

    FeedBack:
    # re: java的視頻捕捉 [未登錄](méi) 2008-05-11 14:08 apple
    老師,您辛苦了!!真的不知道該怎么謝您了!!  回復(fù)  更多評(píng)論
      
    # re: java的視頻捕捉 [未登錄](méi) 2008-05-19 16:51 zz
    老師您好,怎樣將一幅圖片的色彩值,即就是R、G、B值提取出來(lái)  回復(fù)  更多評(píng)論
      
    # re: java的視頻捕捉  2008-05-22 16:02 zarra
    @zz
    這個(gè)問(wèn)題太大了 。。。
    你的是什么圖片 已編碼的圖像文件 raw像素值 從圖形設(shè)備上捕捉到的位圖?   回復(fù)  更多評(píng)論
      
    # re: java的視頻捕捉 [未登錄](méi) 2008-05-26 21:38 zz
    我的畢業(yè)設(shè)計(jì)題目是:視頻摘要系統(tǒng)。本來(lái)是打算通過(guò)一副參照?qǐng)D片,將其圖像信息提取,然后依據(jù)所提取數(shù)據(jù),自動(dòng)捕捉視頻中與其相似的圖片出來(lái)。以我現(xiàn)在的水平,時(shí)間刻不容緩,馬上答辯了,只能做到在視頻播放過(guò)程中,捕捉圖像(已經(jīng)實(shí)現(xiàn)),然后將捕捉到的圖片存儲(chǔ)下來(lái),并對(duì)其色彩值提取出來(lái)。現(xiàn)附上源碼,希望老師幫幫我,一是捕捉圖片后能存儲(chǔ),二是提取所捕獲圖片信息。

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

    }
    }  回復(fù)  更多評(píng)論
      
    # re: java的視頻捕捉 [未登錄](méi) 2008-05-28 09:14 zarra
    @zz
    方便的話給各聯(lián)系方式

    保存圖片的方法 看看 這個(gè)能不能給你點(diǎn)幫助

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

    其實(shí)就是java的Buffer BufferToImage 和 BufferedImage 三個(gè)類(lèi)  回復(fù)  更多評(píng)論
      
    # re: java的視頻捕捉 [未登錄](méi) 2008-05-28 16:44 zz
    @zarra
    謝謝老師!
    QQ:171189195
    e-mail:lovelife619@163.com
    方便的話也留個(gè)您的聯(lián)系方式  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 最近2019中文字幕mv免费看 | 亚洲国产成人精品无码一区二区| 永久在线免费观看| 亚洲日韩AV一区二区三区中文 | 69视频免费观看l| 亚洲精品无码一区二区| 中文字幕亚洲乱码熟女一区二区 | 亚洲精品无码国产片| 中文亚洲AV片不卡在线观看| 国产国产人免费视频成69堂| 四虎永久在线精品免费一区二区| 久久亚洲免费视频| 国产大片51精品免费观看| 久久免费精品视频| 亚洲av成本人无码网站| 亚洲成在人天堂一区二区| 天堂亚洲免费视频| 91免费资源网站入口| 中文字幕久无码免费久久| 亚洲AV无码成人网站在线观看| 久久亚洲精品无码| 亚洲欧洲日产国码高潮αv| 福利免费观看午夜体检区| 拍拍拍无挡视频免费观看1000| 亚洲人成网亚洲欧洲无码| 亚洲欧洲免费视频| www.亚洲色图| 免费视频中文字幕| 四虎在线视频免费观看视频| 大地资源网高清在线观看免费| 免费播放美女一级毛片| 亚洲中文字幕久在线| 亚洲一区二区三区夜色| 亚洲色欲一区二区三区在线观看| 在线中文高清资源免费观看| 久久99国产综合精品免费| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 嫩草影院免费观看| 亚洲成人免费网址| 性xxxxx大片免费视频| 中文字幕不卡高清免费|