欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > ffmpeg把视频文件转码为MP4格式

ffmpeg把视频文件转码为MP4格式

2024/10/25 21:30:15 来源:https://blog.csdn.net/qq_36352889/article/details/139664753  浏览:    关键词:ffmpeg把视频文件转码为MP4格式

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;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com