linux下的java调用ffmpeg进行视频转码
上一篇文章介绍了如何在linux下安装ffmpeg,在安装完ffmpeg之后,遇到的问题就是如何在java中调用linux的ffmpeg命令进行视频转码和截图,话不多说,直接上代码!
这是视频上传转码的方法
public String uploadVideo() {
User user = (User) session.get("user");
String userName=user.getUserName();
String fileVideoName = Struts2Utils.getParameter("uploadVideo");
fileVideoName = fileVideoName.substring(
fileVideoName.lastIndexOf("\\") + 1, fileVideoName.length());
//设置上传视频临时文件夹
String tempPath = "tempVideo";
String storeName = "";
// 上传文件并将文件名转为随机文件名
storeName = fileUploadUtil.uploadFile(uploadV, fileVideoName, tempPath, true);
// 自定义方式产生待转码文件名
String serialName=String.valueOf(System.currentTimeMillis());
// 截取文件格式
String fileType = storeName.substring(storeName.lastIndexOf("."));
String fullName = serialName + fileType;
// 获取工程上一层目录
String path=ServletActionContext.getRequest().getRealPath("")
+File.separator + ".." + File.separator;
// 设置转换为mp4格式后文件的保存路径
String videoDir="upload/Videos" + File.separator + user.getUserName() + File.separator;
fileUploadUtil.createPath(videoDir);
String uploadVideo="upload/Videos" + File.separator + user.getUserName()
+ File.separator + serialName + ".mp4";
String filePath = path + uploadVideo;
String tempVideo="tempVideo" + File.separator + storeName;
// 待转换格式的文件
String absolutePath= path + tempVideo;
// 设置上传视频截图文件保存路径
String imgDir="upload/images" + File.separator + user.getUserName() + File.separator;
fileUploadUtil.createPath(imgDir);
String mediaPic="upload/images" + File.separator + user.getUserName()
+ File.separator + serialName + ".jpg";
String mediaPicPath = path + mediaPic;
//设置转码成功标志位,默认为false
boolean flag = false;
flag = fileUploadUtil.executeCodecs(absolutePath, filePath,mediaPicPath);
//删除临时文件
fileUploadUtil.deleteFile(storeName, userName, false);
//设置封面图片上传路径
String imgPath="upload/Videos" + File.separator + user.getUserName();
String fileImageName = Struts2Utils.getParameter("uploadPicture");
String newName = fileUploadUtil.uploadFile(uploadImg, fileImageName,
imgPath, true);
model.setImgUrl(imgPath + File.separator + newName);
model.setFileName(fileVideoName);
model.setStoreName(fullName);
model.setUser(user);
model.setUrl(uploadVideo);
model.setState("2");
model.setVideoPic(mediaPic);
Date now = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
model.setUploadTime(dateFormat.format(now));
videoService.saveVideo(model);
videoService.save(model);
user.setPoints(user.getPoints() + 2);
userService.update(user);
return "myVideolist";
}
然后是进行转码的具体实现在FileUploadUtil.java中
先是创建文件夹的方法:
public void createPath(String path) {
String projectPath = ServletActionContext.getServletContext()
.getRealPath("");
String destPath = projectPath + File.separator + "..";// 工程目录的上一层目录
String[] dir = path.split("/");
for (int i = 0; i < dir.length; i++) {
destPath += File.separator + dir[i];
File file = new File(destPath);
if (!file.exists() && !file.isDirectory()) {
logger.info("目录不存在:" + destPath);
// 如果文件夹不存在则创建
file.mkdirs();
} else {
logger.info("目录存在");
}
}
filePath = destPath;
}
视频转码和截图的方法:
public boolean executeCodecs(String absolutePath, String filePath,
String mediaPicPath) {
System.out.println("start convert executeCodecs");
String videoCommend = "ffmpeg -i "
+ absolutePath
+ " -vcodec libx264 -r 29.97 -b 768k -ar 24000 -ab 64k -s 1280x720 "
+ filePath;
String picCommend = "ffmpeg -ss 00:02:06 -i " + absolutePath
+ " -f image2 -y " + mediaPicPath;
System.out.println(videoCommend);
runCmd(videoCommend);
System.out.println("videoCommend success");
runCmd(picCommend);
System.out.println("picCommend success");
return true;
}
视频转码的命令:ffmpeg -i inputfile -vcodec libx264 -r 29.97 -b 768k -ar 24000 -ab 64k -s 1280x720 output.mp4
视频截图的命令:ffmpeg -ss 00:02:06 -i inputFile.mp4 -f image2 -y output.jpg
执行linux命令的方法:
public void runCmd(String command) {
try {
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(command);
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<ERROR>");
while ((line = br.readLine()) != null){
System.out.println(line);
}
System.out.println("</ERROR>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
} catch (Throwable t) {
System.out.println(t);
t.printStackTrace();
}
}
至此,视频转码和截图都完成。