赞
踩
windows系统需要下载ffmpeg软件,并在代码中指定路径
centos系统需要安装ffmepg是可执行的命令
- package com.xkj.utils;
-
- import lombok.extern.slf4j.Slf4j;
-
- import java.io.*;
- import java.util.ArrayList;
- import java.util.List;
-
- @Slf4j
- public class ConvertVideoUtils {
-
- //需要转码的视频的全地址
- private String inputPath;
-
- //转码后文件的目录
- private String outputPath;
-
- //ffmpeg文件的路径,linux下无需配置
- private String ffmpegPath;
-
- //转码后文件的名称
- private String fileName;
-
- public ConvertVideoUtils(String inputPath, String outputPath, String ffmpegPath, String fileName) {
- log.info("开始转码.....");
- log.info("inputPath={}", inputPath);
- log.info("outputPath={}", outputPath);
- log.info("fileName={}", fileName);
- log.info("ffmpegPath={}", ffmpegPath);
- this.inputPath = inputPath;
- this.outputPath = outputPath;
- this.ffmpegPath = ffmpegPath;
- this.fileName = fileName;
- }
-
- public static boolean process(String inputPath, String ffmpegPath, String outputPath, String fileName) {
- int type = checkContentType(inputPath);
- boolean status = false;
- log.info("直接转成mp4格式");
- status = processMp4(inputPath, ffmpegPath, outputPath, fileName);// 直接转成mp4格式
- return status;
- }
-
- private static int checkContentType(String inputPath) {
- 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;
- }
-
- private static boolean checkfile(String inputPath) {
- File file = new File(inputPath);
- if (!file.isFile()) {
- return false;
- }
- return true;
- }
-
- private static boolean processMp4(String oldfilepath, String ffmpegPath, String outputPath, String fileName) {
- if (!checkfile(oldfilepath)) {
- log.info(oldfilepath + " is not file");
- return false;
- }
- String systemName = getSystemName();
- if (systemName.contains("windows")) { //windows系统
- ffmpegPath = ffmpegPath + "ffmpeg.exe";
- } else {
- ffmpegPath = ffmpegPath + "ffmpeg";
- }
- List<String> command = new ArrayList<>();
- 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 + fileName + ".mp4");
- log.info("生成的command={}", command);
- try {
- if (systemName.contains("windows")) { //windows系统
- Process videoProcess = new ProcessBuilder(command).redirectErrorStream(true).start();
- threadExec(videoProcess.getErrorStream());
- threadExec(videoProcess.getInputStream());
- videoProcess.waitFor();
- } else {
- log.info("linux开始");
- StringBuilder test = new StringBuilder();
- for (String s : command) test.append(s).append(" ");
- log.info(test.toString());
- // 执行命令
- Process p = Runtime.getRuntime().exec(test.toString());
- // 取得命令结果的输出流
- InputStream fis = p.getInputStream();
- // 用一个读输出流类去读
- InputStreamReader isr = new InputStreamReader(fis);
- // 用缓冲器读行
- BufferedReader br = new BufferedReader(isr);
- String line = null;
- // 直到读完为止
- while ((line = br.readLine()) != null) {
- log.info("视频转换:{}", line);
- }
- }
- return true;
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- }
-
- /**
- * 获取系统平台名称:windows、linux...
- */
- private static String getSystemName() {
- return System.getProperty("os.name").toLowerCase();
- }
-
- /**
- * 分线程执行
- *
- * @param input 输入流
- */
- private static void threadExec(final InputStream input) {
- new Thread(() -> {
- String line;
- try (InputStreamReader inputStreamReader = new InputStreamReader(input);
- BufferedReader bf = new BufferedReader(inputStreamReader)) {
- while (null != (line = bf.readLine())) {
- log.info(line);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }).start();
- }
-
- public Boolean setVoidInfos() {
- if (!checkfile(inputPath)) {
- log.info(inputPath + " is not file");
- return false;
- }
- if (process(inputPath, ffmpegPath, outputPath, fileName)) {
- log.info("ok");
- return true;
- }
- return false;
- }
- }
-
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。