win10环境下 java视频使用ffmpeg转码

前端video标签只支持播放mp4的h264格式编码,所以这边借助ffmpeg进行转码,先安装ffmpeg

配置jkd,就可以直接使用,优化了一下,方案,转码速度更快

package org.jeecg.modules.ffmpegutil;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class ConvertVideoUtil {
	private static String inputPath = "";

	private static String outputPath = "";

	private static String ffmpegPath = "";

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

	public static void getPath(String inputPath1,String outputPath1,String ffmpegPath1) {
		// 先获取当前项目路径,在获得源文件、目标文件、转换器的路径
		inputPath=inputPath1;
		outputPath=outputPath1;
		ffmpegPath=ffmpegPath1;
		File diretory = new File("");

	}

	public static boolean process() {
		int type = checkContentType();
		boolean status = false;
		System.out.println("直接转成mp4格式");
		status = processMp4(inputPath);// 直接转成mp4格式
		return status;
	}

	private static int checkContentType() {
		String type = inputPath.substring(inputPath.lastIndexOf(".") + 1, inputPath.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;
	}







	// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
	private static String processAVI(int type) {
		List<String> commend = new ArrayList<String>();
		commend.add(ffmpegPath + "mencoder");
		commend.add(inputPath);
		commend.add("-oac");
		commend.add("lavc");
		commend.add("-lavcopts");
		commend.add("acodec=mp3:abitrate=64");
		commend.add("-ovc");
		commend.add("xvid");
		commend.add("-xvidencopts");
		commend.add("bitrate=600");
		commend.add("-of");
		commend.add("mp4");
		commend.add("-o");
		commend.add(outputPath + "a.AVI");
		try {
			ProcessBuilder builder = new ProcessBuilder();
			Process process = builder.command(commend).redirectErrorStream(true).start();
			new PrintStream(process.getInputStream());
			new PrintStream(process.getErrorStream());
			process.waitFor();
			return outputPath + "a.AVI";
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
	private static boolean processFlv(String oldfilepath) {

		if (!checkfile(inputPath)) {
			System.out.println(oldfilepath + " is not file");
			return false;
		}
		List<String> command = new ArrayList<String>();
		command.add(ffmpegPath + "ffmpeg");
		command.add("-i");
		command.add(oldfilepath);
		command.add("-ab");
		command.add("56");
		command.add("-ar");
		command.add("22050");
		command.add("-qscale");
		command.add("8");
		command.add("-r");
		command.add("15");
		command.add("-s");
		command.add("600x500");
		command.add(outputPath + "a.flv");
		try {

			// 方案1
//            Process videoProcess = Runtime.getRuntime().exec(ffmpegPath + "ffmpeg -i " + oldfilepath
//                    + " -ab 56 -ar 22050 -qscale 8 -r 15 -s 600x500 "
//                    + outputPath + "a.flv");

			// 方案2
			Process videoProcess = new ProcessBuilder(command).redirectErrorStream(true).start();

			new PrintStream(videoProcess.getErrorStream()).start();

			new PrintStream(videoProcess.getInputStream()).start();

			videoProcess.waitFor();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	private static boolean processMp4(String oldfilepath) {

		if (!checkfile(inputPath)) {
			System.out.println(oldfilepath + " is not file");
			return false;
		}
		List<String> command = new ArrayList<String>();


//方案一
/**
		command.add(ffmpegPath);
		command.add("-i");
		command.add(oldfilepath);
		command.add("-c:v");
		command.add("libx264");
		command.add("-mbd");
		command.add("0");
		command.add("-c:a");
		command.add("aac");
		command.add("-strict");
		command.add("-2");
		command.add("-pix_fmt");
		command.add("yuv420p");
		command.add("-movflags");
		command.add("faststart");
		command.add(outputPath+".mp4");
*/


//方案二,转码时间比方案一快一倍左右

        	command.add(ffmpegPath);
		command.add("-i");
		command.add(oldfilepath);
		command.add("-threads");
		command.add("20");
		command.add("-preset");
		command.add("ultrafast");
		command.add("-strict");
		command.add("-2");
		command.add(outputPath+".mp4");







		try {

			// 方案1
//        Process videoProcess = Runtime.getRuntime().exec(ffmpegPath + "ffmpeg -i " + oldfilepath
//                + " -ab 56 -ar 22050 -qscale 8 -r 15 -s 600x500 "
//                + outputPath + "a.flv");

			// 方案2
			Process videoProcess = new ProcessBuilder(command).redirectErrorStream(true).start();

			new PrintStream(videoProcess.getErrorStream()).start();

			new PrintStream(videoProcess.getInputStream()).start();

			videoProcess.waitFor();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
}
class PrintStream extends Thread
{
	java.io.InputStream __is = null;
	public PrintStream(java.io.InputStream is)
	{
		__is = is;
	}

	public void run()
	{
		try
		{
			while(this != null)
			{
				int _ch = __is.read();
				if(_ch != -1)
					System.out.print((char)_ch);
				else break;
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}





	public static void main(String[] args) {
		//输入地址
		String savePath="D:\\a.mp4";
		//输出地址
		String outToVideoPath="D:\\video";
		//转换器的路径
		String outToVideo="D:\\ffmpeg\\ffmpeg-4.3.1-2021-01-01-essentials_build\\bin";

		ConvertVideoUtil.getPath(savePath,outToVideoPath,outToVideo);
		if (!ConvertVideoUtil.checkfile(savePath)) {
			System.out.println(savePath + " is not file");
		}
		if (ConvertVideoUtil.process()) {
			System.out.println("ok");
		}
	}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值