linux下的java调用ffmpeg进行视频转码

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

	}


至此,视频转码和截图都完成。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值