从摄像头拍照,并把图片转为视频

Snapshot.java

/*
 * 
 */
package com.naptv.impl;


import com.naptv.service.SnapToVideo;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jws.WebService;
import uk.co.caprica.vlcj.VlcjTest;
import uk.co.caprica.vlcj.player.MediaPlayer;
import uk.co.caprica.vlcj.player.MediaPlayerEventAdapter;
import uk.co.caprica.vlcj.player.MediaPlayerFactory;

@WebService(endpointInterface = "com.naptv.service.SnapToVideo", serviceName = "NaptvService_Snap")
public class Snapshot extends VlcjTest implements SnapToVideo {


    static MediaPlayerFactory factory;
    static MediaPlayer mediaPlayer;
    
    public void snapVideo(String url, int user_id, int device_id) {
        final int userId = user_id;
        final int deviceId = device_id;


        if (url == null) {
            url = "http://admin:123456@192.168.1.11:8080/video.cgi";
            System.out.println("snap--------------user video url is null!!");
        }
        factory = new MediaPlayerFactory();
        mediaPlayer = factory.newEmbeddedMediaPlayer();
        mediaPlayer.addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
            @Override
            public void snapshotTaken(MediaPlayer mediaPlayer, String paths) {
                System.out.println("snapshotTaken(paths=" + paths + ")" + new Date());
            }
        });


        mediaPlayer.startMedia(url);
        try {
            Thread.sleep(100); // Don't do this, use events instead
        } catch (InterruptedException ex) {
            Logger.getLogger(Snapshot.class.getName()).log(Level.SEVERE, null, ex);
        }


        final Thread thread = new Thread() {
            Boolean isInterrupt = false;
            String picture;


            @Override
            public void run() {


                while (!isInterrupt) {   
                     picture = filePath(null, userId, deviceId);
                    File file = new File(picture);
                    mediaPlayer.saveSnapshot(file, 640, 480);
                    try {                        
                        Thread.sleep(250);//拍照的间隔时间,0.25秒一张,每秒钟拍四张图片
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Snapshot.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }


            @Override
            public void interrupt() {
                this.isInterrupt = true;
                super.interrupt(); //To change body of generated methods, choose Tools | Templates.
            }
        };        


        thread.setDaemon(true);
        thread.start();
        try {
            Thread.sleep(1000 * 60 * 1);//拍照时间,单位:毫秒
        } catch (InterruptedException ex) {
            Logger.getLogger(Snapshot.class.getName()).log(Level.SEVERE, null, ex);
        }


        mediaPlayer.stop();


        thread.stop();
        
        try {


            JimToMovie.video(userId, deviceId); //make to video            


        } catch (Exception ex) {
            Logger.getLogger(Snapshot.class.getName()).log(Level.SEVERE, null, ex);
        }
    }




    @Override
    public int userId(int userId) {
        // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        return userId;
    }


    @Override
    public int deviceId(int deviceId) {
        // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        return deviceId;
    }


    //save pictures path
    public static String filePath(String road, int userId, int deviceId) {


        String path = "";
        File dir = null;
        if (road == null || road == "") {
            dir = new File(System.getProperty("user.home"), userId + "/" + deviceId + "/" + "VlcPicture");
        } else {
            dir = new File(road);
        }
        dir.mkdirs();


        DateFormat df = new SimpleDateFormat("yyyyMMdd-HHmmssSSS");//时间精确到毫秒
        path = dir.getAbsolutePath() + "/" + df.format(new Date()) + ".png ";


        return path;
    }
    
}


JimToMovie.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.naptv.impl;


import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import org.jim2mov.core.DefaultMovieInfoProvider;
import org.jim2mov.core.ImageProvider;
import org.jim2mov.core.Jim2Mov;
import org.jim2mov.core.MovieInfoProvider;
import org.jim2mov.utils.MovieUtils;


/**
 *
 * @author lab1
 */
public class JimToMovie {


    /**
     * @param args the command line arguments
     */
    public static void video(int userId, int deviceId) throws Exception {
        final File[] jpgs = new File(System.getProperty("user.home"), userId + "/" + deviceId + "/" + "VlcPicture").listFiles();
        System.out.println(jpgs.length + "-------------------------------------------------");


        //对文件名进行排序(本示例假定文件名中的数字越小,生成视频的帧数越靠前)
        Arrays.sort(jpgs, new Comparator<File>() {
            @Override
            public int compare(File file1, File file2) {
                String numberName1 = file1.getName().replace(".png", "");
                numberName1 = numberName1.substring(9);//截取9个字符串的长度
                numberName1 = numberName1.trim(); //trim()是去掉首尾空格 


                String numberName2 = file2.getName().replace(".png", "");
                numberName2 = numberName2.substring(9);
                numberName2 = numberName2.trim();


                System.out.println("numberName1=======" + numberName1 + "numberName2+++++++++" + numberName2);


                return new Integer(numberName1) - new Integer(numberName2);
            }
        });


        //DefaultMovieInfoProvider dmip = new DefaultMovieInfoProvider("dst.avi");


        DefaultMovieInfoProvider dmip = new DefaultMovieInfoProvider(filePath(null, userId, deviceId));//the name of the movie        
        dmip.setFPS(4); // 设置每秒帧数,帧数越多播放时间越少,与每秒拍照的数目保持一致,来保证录制时间与播放时间的一致性
        dmip.setNumberOfFrames(jpgs.length); // 总帧数
        //视频宽和高,最好与图片宽高保持一直
        dmip.setMWidth(640);
        dmip.setMHeight(480);




        Jim2Mov j2m = new Jim2Mov(new ImageProvider() {
            @Override
            public byte[] getImage(int frame) {
                try {
                    // 设置压缩比
                    return MovieUtils.convertImageToJPEG((jpgs[frame]), 0.3f);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }, dmip, null);
        j2m.saveMovie(MovieInfoProvider.TYPE_AVI_MJPEG);


        //delete the pictures and the pictures folder after make them to movies.
        File delFile = new File(System.getProperty("user.home"), userId + "/" + deviceId + "/" + "VlcPicture");






        String delDir = delFile.toString();
        boolean success = deleteDir(new File(delDir));
        if (success) {
            System.out.println("Successfully deleted populated directory: " + delDir);
        } else {
            System.out.println("Failed to delete populated directory: " + delDir);
        }


    }








        //save video path and format    
    
    


    public static String filePath(String road, int userId, int deviceId) {


        String path = "";
        File dir = null;
        if (road == null || road == "") {
            dir = new File(System.getProperty("user.home"), userId + "/" + deviceId + "/" + "JimToMovie");
        } else {
            dir = new File(road);
        }
        dir.mkdirs();
        DateFormat df = new SimpleDateFormat("yyyyMMdd-HHmmss");
        path = dir.getAbsolutePath() + "/Capture-" + df.format(new Date()) + ".ogg";


        return path;


    }


    /**
     * 递归删除目录下的所有文件及子目录下所有文件和文件目录
     *
     * @param dir 将要删除的文件目录
     * @return boolean Returns "true" if all deletions were successful. If a
     * deletion fails, the method stops attempting to delete and returns
     * "false".
     *
     */
    private static boolean deleteDir(File dir) {
        if (dir.isDirectory()) {
            String[] children = dir.list();
            //递归删除目录中的子目录下  
            for (int i = 0; i < children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        // 目录此时为空,可以删除  
        return dir.delete();
    }


    /**
     * 删除单个文件
     *
     * @param sPath 被删除文件的文件名
     * @return 单个文件删除成功返回true,否则返回false
     */
    public static boolean deleteFile(String sPath) {
        boolean flag = false;
        File file = new File(sPath);
        // 路径为文件且不为空则进行删除  
        if (file.isFile() && file.exists()) {
            file.delete();
            flag = true;
        }
        return flag;
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值