线程池多线程视频转码(完整版)

Threadpool 代码 

 收藏代码

  1. package yong.method;  
  2.   
  3. import java.util.concurrent.ExecutorService;   
  4. import java.util.concurrent.Executors;   
  5.   
  6. /**  
  7.  *   
  8.  * @author 赵永恩  
  9.  *  
  10.  */  
  11. public class ThreadPool {   
  12.       
  13.   public static ExecutorService exec = Executors.newFixedThreadPool(3);   
  14.   public static synchronized void trans(String filePath, String outPath,String outImgPath,String pathAddress){   
  15.     ThreadTransCode trans=new ThreadTransCode(filePath,outPath,outImgPath,pathAddress);   
  16.     exec.execute(trans);   
  17.   }   
  18. }    


 

Threadtranscode代码 

 收藏代码

  1. package yong.method;  
  2.   
  3. /**  
  4.  *   
  5.  * @author 赵永恩  
  6.  *  
  7.  */  
  8. public class ThreadTransCode implements Runnable {   
  9.   
  10.   //原始文件   
  11.   private String filePath;   
  12.   //目标文件   
  13.   private String outPath;   
  14.   private String outImgPath;   
  15.     
  16.   //工具地址  
  17.   private String pathAddress;   
  18.   
  19.   
  20.   public ThreadTransCode(String filePath, String outPath,String outImgPath,String pathAddress) {  
  21.         this.filePath = filePath;  
  22.         this.outPath = outPath;  
  23.         this.outImgPath = outImgPath;  
  24.         this.pathAddress = pathAddress;  
  25.     }  
  26.   
  27.   
  28.   public void run() {   
  29.     synchronized (this) {   
  30.       //System.out.println("转码开始..............");   
  31.       ConvertVideo cv = new ConvertVideo(filePath, outPath,outImgPath,pathAddress);   
  32.       cv.process();   
  33.     }   
  34.   }   
  35. }   


 

Convertvideo 代码 

 收藏代码

  1. package yong.method;  
  2.   
  3. import java.io.*;  
  4. import java.util.List;  
  5.   
  6.   
  7. /**  
  8.  *   
  9.  * @author 赵永恩  
  10.  *  
  11.  */  
  12. public class ConvertVideo {  
  13.       
  14.       
  15.       
  16.     // 原始文件  
  17.     private String filePath;  
  18.     // 目标文件  
  19.     private String outPath;  
  20.     private String outImgPath;  
  21.       
  22.     private String pathAddress;   
  23.       
  24.     /**  
  25.      * 工具[tool] 地址[address]  
  26.      */  
  27.     private String mencoderAdd;  
  28.     private String ffmpegAdd;  
  29.       
  30.       
  31.     public ConvertVideo(String filePath, String outPath, String outImgPath,String pathAddress) {  
  32.         this.filePath = filePath;  
  33.         this.outPath = outPath;  
  34.         this.outImgPath = outImgPath;  
  35.         this.pathAddress = pathAddress;  
  36.           
  37.         this.mencoderAdd=pathAddress+"tool\\ffmpeg\\mencoder.exe";  
  38.         this.ffmpegAdd=pathAddress+"tool\\ffmpeg\\ffmpeg.exe";  
  39.           
  40.         //System.out.println(ffmpegAdd);  
  41.     }  
  42.   
  43.     public synchronized void process() {  
  44.         int type = checkContentType();  
  45.         if (type == 0) {  
  46.             this.ffmpegTransVideo();  
  47.             this.ffmpegTransImage();  
  48.         } else if (type == 1) {  
  49.             this.mencoderTransVideo();  
  50.         }  
  51.     }  
  52.   
  53.     public synchronized int checkContentType() {  
  54.         String type = filePath.substring(filePath.lastIndexOf(".") + 1,  
  55.                 filePath.length()).toLowerCase();  
  56.         // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)  
  57.         if (type.equals("avi")) {  
  58.             return 0;  
  59.         } else if (type.equals("mpg")) {  
  60.             return 0;  
  61.         } else if (type.equals("wmv")) {  
  62.             return 0;  
  63.         } else if (type.equals("3gp")) {  
  64.             return 0;  
  65.         } else if (type.equals("mov")) {  
  66.             return 0;  
  67.         } else if (type.equals("mp4")) {  
  68.             return 0;  
  69.         } else if (type.equals("asf")) {  
  70.             return 0;  
  71.         } else if (type.equals("asx")) {  
  72.             return 0;  
  73.         } else if (type.equals("flv")) {  
  74.             return 0;  
  75.         }  
  76.         // 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),  
  77.         // 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.  
  78.         else if (type.equals("wmv9")) {  
  79.             return 1;  
  80.         } else if (type.equals("rm")) {  
  81.             return 1;  
  82.         } else if (type.equals("rmvb")) {  
  83.             return 1;  
  84.         }  
  85.         return 9;  
  86.     }  
  87.   
  88.     public synchronized static boolean checkfile(String path) {  
  89.         File file = new File(path);  
  90.         if (!file.isFile()) {  
  91.             return false;  
  92.         }  
  93.         return true;  
  94.     }  
  95.   
  96.     /**  
  97.      * 使用mencoder转码  
  98.      *   
  99.      * @param videoPath  
  100.      *            源路径 -- 要转换的视频文件  
  101.      * @param targetPath  
  102.      *            目标路径 -- 转换后的视频flv  
  103.      * @return 返回目标路径  
  104.      */  
  105.     public synchronized String mencoderTransVideo() {  
  106.         List<String> commend = new java.util.ArrayList<String>();  
  107.         // commend.add("d:\\flv\\MediaCoder\\codecs\\mencoder.exe");  
  108.         //commend.add("D:\\Tomcat-6.0.29\\webapps\\zyk\\tool\\ffmpeg\\mencoder.exe");  
  109.         commend.add(mencoderAdd);  
  110.         commend.add(filePath);  
  111.         // 音频采用mp3编码  
  112.         commend.add("-oac");  
  113.         commend.add("mp3lame");  
  114.         // 采用高质DivX视频编码,视频码率为112kbps  
  115.         commend.add("-ovc");  
  116.         commend.add("lavc");  
  117.         commend.add("-lavcopts");  
  118.         commend  
  119.                 .add("vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=-1:cmp=3:vb_strategy=1");  
  120.         commend.add("-lameopts");  
  121.         commend.add("abr:br=56");  
  122.         // 声音采样频率设置,现为22K  
  123.         commend.add("-srate");  
  124.         commend.add("22050");  
  125.         // -sws就是用来设置品质的,默认值为2  
  126.         commend.add("-sws");  
  127.         commend.add("3");  
  128.         // 宽度为208,高度自动调整保持比例;  
  129.         // -vf scale=-3:176宽度自动调整保持比例,高度为176;如果想保持原来的大小可以不要这个参数  
  130.         commend.add("-vf");  
  131.         commend.add("scale=512:-3");  
  132.         // 帧速率设置  
  133.         commend.add("-ofps");  
  134.         commend.add("18");  
  135.         /*  
  136.          * mode=3:cbr:br=24单声道 音频码率为24kbps;-lameopts  
  137.          * mode=0:cbr:br=24立体声,音频码率为24kbps; 还可设置音量,-lameopts  
  138.          * mode=3:cbr:br=32:vol=1,设置范置为1~10,但不宜设得太高  
  139.          */  
  140.         commend.add("-lameopts");  
  141.         commend.add("vbr=3:br=128");  
  142.         commend.add("-o");  
  143.         commend.add(outPath);  
  144.         // 控制台显示执行的命令  
  145.         System.out.println(commend);  
  146.         try {  
  147.             ProcessBuilder builder = new ProcessBuilder();  
  148.             builder.command(commend);  
  149.             builder.start();  
  150.             return outPath;  
  151.         } catch (Exception e) {  
  152.             e.printStackTrace();  
  153.             return null;  
  154.         }  
  155.     }  
  156.   
  157.     /**  
  158.      * 使用ffmpeg转码  
  159.      *   
  160.      * @param videoPath  
  161.      *            源路径 -- 要转换的视频文件  
  162.      * @param targetPath  
  163.      *            目标路径 -- 转换后的视频flv  
  164.      * @return 返回目标路径  
  165.      */  
  166.     public synchronized  String ffmpegTransVideo() {   
  167.         // if (!checkfile(videoPath)) {   
  168.         // System.out.println(videoPath + " is not file aaa");   
  169.         // return false;   
  170.         // }   
  171.         List<String> commend = new java.util.ArrayList<String>();   
  172.         //commend.add("d:\\flv\\MediaCoder\\codecs\\ffmpeg.exe");   
  173.         //commend.add("D:\\Tomcat-6.0.29\\webapps\\zyk\\tool\\ffmpeg\\ffmpeg.exe");   
  174.         commend.add(ffmpegAdd);   
  175.         commend.add("-i");   
  176.         commend.add(filePath);   
  177.         commend.add("-ab");   
  178.         commend.add("64");   
  179.         // commend.add(" -acodec ");   
  180.         // commend.add("codec");   
  181.         commend.add("-ac");   
  182.         commend.add("2");   
  183.         commend.add("-ar");   
  184.         commend.add("22050");   
  185.         // 清晰度 -qscale 4 为最好可是文件大, -qscale 6就可以了   
  186.         commend.add("-qscale");   
  187.         commend.add("6");   
  188.         // commend.add("-b");   
  189.         // commend.add("768");   
  190.         // commend.add("230");   
  191.         // commend.add("-s");   
  192.         // commend.add("352x240");   
  193.         // commend.add("-r");   
  194.         // commend.add("29.97");   
  195.         commend.add("-y");   
  196.         commend.add(outPath);   
  197.         //System.out.println(commend);   
  198.         try {   
  199.           ProcessBuilder builder = new ProcessBuilder();   
  200.           builder.command(commend);   
  201.           Process process = builder.start();   
  202.           InputStream is = process.getErrorStream();   
  203.           InputStreamReader inputStreamReader = new InputStreamReader(is);   
  204.           BufferedReader inputBufferedReader = new BufferedReader(   
  205.               inputStreamReader);   
  206.           String line = null;   
  207.           StringBuilder stringBuilder = new StringBuilder();   
  208.           while ((line = inputBufferedReader.readLine()) != null) {   
  209.             stringBuilder.append(line);   
  210.           }   
  211.           inputBufferedReader.close();   
  212.           inputBufferedReader = null;   
  213.           inputStreamReader.close();   
  214.           inputStreamReader = null;   
  215.           is.close();   
  216.           is = null;   
  217.           return outPath;   
  218.         } catch (Exception e) {   
  219.           e.printStackTrace();   
  220.           return null;   
  221.         }   
  222.       }  
  223.   
  224.   
  225.     // 生成图片 参数String newfilename, String newimg  
  226.     public synchronized boolean ffmpegTransImage() {  
  227.         List<String> commend = new java.util.ArrayList<String>();  
  228.         // commend.add("d:\\flv\\MediaCoder\\codecs\\ffmpeg.exe");  
  229.         //commend.add("D:\\Tomcat-6.0.29\\webapps\\zyk\\tool\\ffmpeg\\ffmpeg.exe");   
  230.         commend.add(ffmpegAdd);  
  231.         commend.add("-i");  
  232.         commend.add(filePath);  
  233.         commend.add("-y");  
  234.         commend.add("-f");  
  235.         commend.add("image2");  
  236.         commend.add("-ss");  
  237.         commend.add("38");  
  238.         commend.add("-t");  
  239.         commend.add("0.001");  
  240.         commend.add("-s");  
  241.         commend.add("320x240");  
  242.         commend.add(outImgPath);  
  243.         try {  
  244.             ProcessBuilder builder = new ProcessBuilder();  
  245.             builder.command(commend);  
  246.             builder.start();  
  247.             return true;  
  248.         } catch (Exception e) {  
  249.             e.printStackTrace();  
  250.             return false;  
  251.         }  
  252.     }  
  253.   
  254. }  


 

测试类代码 

 收藏代码

  1. package yong.method;  
  2.   
  3.   
  4. public class A {  
  5.   
  6.     /**  
  7.      * @param args  
  8.      */  
  9.     public static void main(String[] args) {  
  10.         // TODO Auto-generated method stub  
  11.         String filePath = "D:\\test\\a.MP4";  
  12.         String outPath = "d:\\test\\2011q.flv";  
  13.         String outImgPath = "d:\\test\\20111.jpg";  
  14.         String pathAddress="D:\\Tomcat-6.0.29\\webapps\\zyk\\";  
  15.         ThreadPool.trans(filePath,outPath,outImgPath,pathAddress);  
  16.   
  17.           
  18.     }  
  19. }  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值