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

此文来自:http://lichen.blog.51cto.com/697816/162124

2011-03-21改进zyen


package yong.method;

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

/**
 * 
 * @author 赵永恩
 *
 */
public class ThreadPool { 
    
  public static ExecutorService exec = Executors.newFixedThreadPool(3); 
  public static synchronized void trans(String filePath, String outPath,String outImgPath,String pathAddress){ 
    ThreadTransCode trans=new ThreadTransCode(filePath,outPath,outImgPath,pathAddress); 
    exec.execute(trans); 
  } 
}  




package yong.method;

/**
 * 
 * @author 赵永恩
 *
 */
public class ThreadTransCode implements Runnable { 

  //原始文件 
  private String filePath; 
  //目标文件 
  private String outPath; 
  private String outImgPath; 
  
  //工具地址
  private String pathAddress; 


  public ThreadTransCode(String filePath, String outPath,String outImgPath,String pathAddress) {
		this.filePath = filePath;
		this.outPath = outPath;
		this.outImgPath = outImgPath;
		this.pathAddress = pathAddress;
	}


  public void run() { 
    synchronized (this) { 
      //System.out.println("转码开始.............."); 
      ConvertVideo cv = new ConvertVideo(filePath, outPath,outImgPath,pathAddress); 
      cv.process(); 
    } 
  } 
} 




package yong.method;

import java.io.*;
import java.util.List;


/**
 * 
 * @author 赵永恩
 *
 */
public class ConvertVideo {
	
	
	
	// 原始文件
	private String filePath;
	// 目标文件
	private String outPath;
	private String outImgPath;
	
	private String pathAddress; 
	
	/**
	 * 工具[tool] 地址[address]
	 */
	private String mencoderAdd;
	private String ffmpegAdd;
	
	
	public ConvertVideo(String filePath, String outPath, String outImgPath,String pathAddress) {
		this.filePath = filePath;
		this.outPath = outPath;
		this.outImgPath = outImgPath;
		this.pathAddress = pathAddress;
		
		this.mencoderAdd=pathAddress+"tool\\ffmpeg\\mencoder.exe";
		this.ffmpegAdd=pathAddress+"tool\\ffmpeg\\ffmpeg.exe";
		
		//System.out.println(ffmpegAdd);
	}

	public synchronized void process() {
		int type = checkContentType();
		if (type == 0) {
			this.ffmpegTransVideo();
			this.ffmpegTransImage();
		} else if (type == 1) {
			this.mencoderTransVideo();
		}
	}

	public synchronized int checkContentType() {
		String type = filePath.substring(filePath.lastIndexOf(".") + 1,
				filePath.length()).toLowerCase();
		// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
		if (type.equals("avi")) {
			return 0;
		} else if (type.equals("mpg")) {
			return 0;
		} else if (type.equals("wmv")) {
			return 0;
		} else if (type.equals("3gp")) {
			return 0;
		} else if (type.equals("mov")) {
			return 0;
		} else if (type.equals("mp4")) {
			return 0;
		} else if (type.equals("asf")) {
			return 0;
		} else if (type.equals("asx")) {
			return 0;
		} else if (type.equals("flv")) {
			return 0;
		}
		// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
		// 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
		else if (type.equals("wmv9")) {
			return 1;
		} else if (type.equals("rm")) {
			return 1;
		} else if (type.equals("rmvb")) {
			return 1;
		}
		return 9;
	}

	public synchronized static boolean checkfile(String path) {
		File file = new File(path);
		if (!file.isFile()) {
			return false;
		}
		return true;
	}

	/**
	 * 使用mencoder转码
	 * 
	 * @param videoPath
	 *            源路径 -- 要转换的视频文件
	 * @param targetPath
	 *            目标路径 -- 转换后的视频flv
	 * @return 返回目标路径
	 */
	public synchronized String mencoderTransVideo() {
		List<String> commend = new java.util.ArrayList<String>();
		// commend.add("d:\\flv\\MediaCoder\\codecs\\mencoder.exe");
		//commend.add("D:\\Tomcat-6.0.29\\webapps\\zyk\\tool\\ffmpeg\\mencoder.exe");
		commend.add(mencoderAdd);
		commend.add(filePath);
		// 音频采用mp3编码
		commend.add("-oac");
		commend.add("mp3lame");
		// 采用高质DivX视频编码,视频码率为112kbps
		commend.add("-ovc");
		commend.add("lavc");
		commend.add("-lavcopts");
		commend
				.add("vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=-1:cmp=3:vb_strategy=1");
		commend.add("-lameopts");
		commend.add("abr:br=56");
		// 声音采样频率设置,现为22K
		commend.add("-srate");
		commend.add("22050");
		// -sws就是用来设置品质的,默认值为2
		commend.add("-sws");
		commend.add("3");
		// 宽度为208,高度自动调整保持比例;
		// -vf scale=-3:176宽度自动调整保持比例,高度为176;如果想保持原来的大小可以不要这个参数
		commend.add("-vf");
		commend.add("scale=512:-3");
		// 帧速率设置
		commend.add("-ofps");
		commend.add("18");
		/*
		 * mode=3:cbr:br=24单声道 音频码率为24kbps;-lameopts
		 * mode=0:cbr:br=24立体声,音频码率为24kbps; 还可设置音量,-lameopts
		 * mode=3:cbr:br=32:vol=1,设置范置为1~10,但不宜设得太高
		 */
		commend.add("-lameopts");
		commend.add("vbr=3:br=128");
		commend.add("-o");
		commend.add(outPath);
		// 控制台显示执行的命令
		System.out.println(commend);
		try {
			ProcessBuilder builder = new ProcessBuilder();
			builder.command(commend);
			builder.start();
			return outPath;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 使用ffmpeg转码
	 * 
	 * @param videoPath
	 *            源路径 -- 要转换的视频文件
	 * @param targetPath
	 *            目标路径 -- 转换后的视频flv
	 * @return 返回目标路径
	 */
	public synchronized  String ffmpegTransVideo() { 
	    // if (!checkfile(videoPath)) { 
	    // System.out.println(videoPath + " is not file aaa"); 
	    // return false; 
	    // } 
	    List<String> commend = new java.util.ArrayList<String>(); 
	    //commend.add("d:\\flv\\MediaCoder\\codecs\\ffmpeg.exe"); 
	    //commend.add("D:\\Tomcat-6.0.29\\webapps\\zyk\\tool\\ffmpeg\\ffmpeg.exe"); 
	    commend.add(ffmpegAdd); 
	    commend.add("-i"); 
	    commend.add(filePath); 
	    commend.add("-ab"); 
	    commend.add("64"); 
	    // commend.add(" -acodec "); 
	    // commend.add("codec"); 
	    commend.add("-ac"); 
	    commend.add("2"); 
	    commend.add("-ar"); 
	    commend.add("22050"); 
	    // 清晰度 -qscale 4 为最好可是文件大, -qscale 6就可以了 
	    commend.add("-qscale"); 
	    commend.add("6"); 
	    // commend.add("-b"); 
	    // commend.add("768"); 
	    // commend.add("230"); 
	    // commend.add("-s"); 
	    // commend.add("352x240"); 
	    // commend.add("-r"); 
	    // commend.add("29.97"); 
	    commend.add("-y"); 
	    commend.add(outPath); 
	    //System.out.println(commend); 
	    try { 
	      ProcessBuilder builder = new ProcessBuilder(); 
	      builder.command(commend); 
	      Process process = builder.start(); 
	      InputStream is = process.getErrorStream(); 
	      InputStreamReader inputStreamReader = new InputStreamReader(is); 
	      BufferedReader inputBufferedReader = new BufferedReader( 
	          inputStreamReader); 
	      String line = null; 
	      StringBuilder stringBuilder = new StringBuilder(); 
	      while ((line = inputBufferedReader.readLine()) != null) { 
	        stringBuilder.append(line); 
	      } 
	      inputBufferedReader.close(); 
	      inputBufferedReader = null; 
	      inputStreamReader.close(); 
	      inputStreamReader = null; 
	      is.close(); 
	      is = null; 
	      return outPath; 
	    } catch (Exception e) { 
	      e.printStackTrace(); 
	      return null; 
	    } 
	  }


	// 生成图片 参数String newfilename, String newimg
	public synchronized boolean ffmpegTransImage() {
		List<String> commend = new java.util.ArrayList<String>();
		// commend.add("d:\\flv\\MediaCoder\\codecs\\ffmpeg.exe");
		//commend.add("D:\\Tomcat-6.0.29\\webapps\\zyk\\tool\\ffmpeg\\ffmpeg.exe"); 
		commend.add(ffmpegAdd);
		commend.add("-i");
		commend.add(filePath);
		commend.add("-y");
		commend.add("-f");
		commend.add("image2");
		commend.add("-ss");
		commend.add("38");
		commend.add("-t");
		commend.add("0.001");
		commend.add("-s");
		commend.add("320x240");
		commend.add(outImgPath);
		try {
			ProcessBuilder builder = new ProcessBuilder();
			builder.command(commend);
			builder.start();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

}



package yong.method;


public class A {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	    String filePath = "D:\\test\\a.MP4";
		String outPath = "d:\\test\\2011q.flv";
		String outImgPath = "d:\\test\\20111.jpg";
		String pathAddress="D:\\Tomcat-6.0.29\\webapps\\zyk\\";
		ThreadPool.trans(filePath,outPath,outImgPath,pathAddress);

		
	}
}




下边是调用的那个包ffmpeg

你可能感兴趣的:(多线程,tomcat,Blog,F#,vb)