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;
}
}