java多线程下的视频转码

来源:互联网 发布:淘宝店铺装修注意事项 编辑:程序博客网 时间:2024/06/08 14:41

前言

      上一篇文章中介绍了linux下的java调用ffmpeg进行视频转码,完成之后发现存在一个问题:因为转码在服务器上需要很长时间,而当前页面需要等转码结束后才能响应跳转到视频列表页面,这个当然是不合理的了。所以,我采用了多线程进行处理,把视频的转码过程放在一个新的线程中完成,这样用户在上传页面的等待时间就会小很多了。关于java多线程的知识,这个博主总结的非常详细,http://blog.csdn.net/evankaka/article/details/44153709。

代码部分

//新开一个线程,去完成转码工作ExecutorService service = Executors.newSingleThreadExecutor();Runnable runnable = new Transcoding(absolutePath, filePath, mediaPicPath, storeName, userName, messageService, projectPath);service.submit(runnable);

这里是使用 ExecutorService 新建了一个线程,然后实现了Runnable接口,实例化了该方法,给Transcoding构造方法传了以上参数,下面看Transcoding类的代码。

import java.io.BufferedReader;import java.io.File;import java.io.InputStream;import java.io.InputStreamReader;import cn.xaut.video.domain.Message;import cn.xaut.video.service.MessageService;public class Transcoding implements Runnable{private String absolutePath;private String filePath;private String mediaPicPath;private String storeName;private String userName;private MessageService messageService = null;private String projectPath;public Transcoding(String absolutePath, String filePath,String mediaPicPath, String storeName, String userName, MessageService messageService, String projectPath) {super();this.absolutePath = absolutePath;this.filePath = filePath;this.mediaPicPath = mediaPicPath;this.storeName = storeName;this.userName = userName;this.messageService = messageService;this.projectPath = projectPath;}/** * 视频格式转换方法,把其他视频转换为.mp4格式 *  * @param absolutePath *            输入文件 * @param filePath *            输出文件 * @param mediaPicPath *            截图保存地址 * @return */public void executeCodecs(String absolutePath, String filePath,String mediaPicPath, String storeName,String userName, String projectPath) {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;boolean flag = false;flag = runCmd(videoCommend);System.out.println("videoCommend successful");flag = runCmd(picCommend);System.out.println("picCommend successful");String destPath = projectPath + File.separator + ".."+ File.separator + "tempVideo" + File.separator;String url = destPath + storeName;System.out.println(url);new File(url).delete();System.out.println("删除成功");}/** * 运行命令 *  * @param command */public boolean 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;while ((line = br.readLine()) != null){System.out.println(line);}int exitVal = proc.waitFor();System.out.println("Process exitValue: " + exitVal);return true;} catch (Throwable t) {System.out.println(t);t.printStackTrace();return false;}}@Overridepublic void run() {executeCodecs(absolutePath, filePath, mediaPicPath, storeName, userName, projectPath);Message msg = new Message();msg.setState("0");msg.setReceiver(0);msg.setUrl("videoAction_checkList.action"); String content="有一个新的视频需要审核!";msg.setContent(content);messageService.save(msg);System.out.println("转码结束!");}}

以上就是新建立一个线程处理视频转码的过程了。

0 0
原创粉丝点击