java代码实现文件格式转换
通过FFmpeg实现文件的格式转换
参考文档:https://blog.csdn.net/qq_41301064/article/details/141678539
首先Maven引入FFmpeg依赖
<dependency> <groupId>ws.schild</groupId> <artifactId>jave-all-deps</artifactId> <version>3.3.1</version> <exclusions> <!-- 排除不需要的平台依赖 --> <exclusion> <groupId>ws.schild</groupId> <artifactId>jave-nativebin-win32</artifactId> </exclusion> <exclusion> <groupId>ws.schild</groupId> <artifactId>jave-nativebin-linux32</artifactId> </exclusion> <exclusion> <groupId>ws.schild</groupId> <artifactId>jave-nativebin-osx64</artifactId> </exclusion> <exclusion> <groupId>ws.schild</groupId> <artifactId>jave-nativebin-osxm1</artifactId> </exclusion> <exclusion> <groupId>ws.schild</groupId> <artifactId>jave-nativebin-linux-arm32</artifactId> </exclusion> <exclusion> <groupId>ws.schild</groupId> <artifactId>jave-nativebin-linux-arm64</artifactId> </exclusion> </exclusions> </dependency>
定义转换方法
package cn.oyun.speech.module.system.convert.video; import lombok.extern.slf4j.Slf4j; import ws.schild.jave.Encoder; import ws.schild.jave.EncoderException; import ws.schild.jave.MultimediaObject; import ws.schild.jave.encode.AudioAttributes; import ws.schild.jave.encode.EncodingAttributes; import ws.schild.jave.encode.VideoAttributes; import ws.schild.jave.info.MultimediaInfo; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.net.URL; import java.time.LocalDateTime; @Slf4j public class FFmpegUtils { public static void main(String[] args) { // String mp4 = "D:\\upload\\1.mp4"; // MultimediaInfo multimediaInfo = getMultimediaInfo(mp4); // System.out.println(multimediaInfo); // String mp3="D:\\upload\\少年的梦.mp3"; // MultimediaInfo multimediaInfo1 = getMultimediaInfo(mp3); // System.out.println(multimediaInfo1); // String jpg = "D:\\upload\\1.jpg"; // MultimediaInfo multimediaInfo2 = getMultimediaInfo(jpg); // System.out.println(multimediaInfo2); // String mp4Url = "http://36.134.89.91:9091/sfile/ovy3v4xjgptb44iszmd2g04b2ha56ffk.mp4"; // MultimediaInfo mp4MultimediaInfo = getMultimediaInfoFromUrl(mp4Url); // System.out.println(mp4MultimediaInfo); // String imgOutPut = "D:\\upload\\imgOutPut1.jpg"; // interceptImage(mp4Url, imgOutPut); String input = "你的文件地址"; String output = "D:\\upload\\1.wav"; System.out.println("开始转码:"+ LocalDateTime.now()); formatToWav(input, output); System.out.println("结束转码:"+ LocalDateTime.now()); } /** * 通过本地路径获取多媒体文件信息(宽,高,时长,编码等) * * @param localPath 本地路径 * @return MultimediaInfo 对象,包含 (宽,高,时长,编码等) * @throws EncoderException */ public static MultimediaInfo getMultimediaInfo(String localPath) { MultimediaInfo multimediaInfo = null; try { multimediaInfo = new MultimediaObject(new File(localPath)).getInfo(); } catch (EncoderException e) { System.out.println("获取多媒体文件信息异常"); e.printStackTrace(); } return multimediaInfo; } /** * 通过URL获取多媒体文件信息 * * @param url 网络url * @return MultimediaInfo 对象,包含 (宽,高,时长,编码等) * @throws EncoderException */ public static MultimediaInfo getMultimediaInfoFromUrl(String url) { MultimediaInfo multimediaInfo = null; try { multimediaInfo = new MultimediaObject(new URL(url)).getInfo(); } catch (Exception e) { System.out.println("获取多媒体文件信息异常"); e.printStackTrace();//TODO 国际化 } return multimediaInfo; } /** * 截封面图 * * @param input 视频文件或地址 * @param imgOutPut 图片的输出路径 * @return 是否成功 */ public static String interceptImage(String input, String imgOutPut) { String videoUrl = input; // 视频URL try { // 执行FFmpeg命令 ProcessBuilder processBuilder = new ProcessBuilder("ffmpeg", "-i", videoUrl, "-ss", "00:00:01", "-vframes", "1", imgOutPut); Process process = processBuilder.start(); // 获取命令输出结果 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream())); String line; while ((line = reader.readLine()) != null) { // log.debug("reader.readLine:{}", line); } // 等待命令执行完成 int exitCode = process.waitFor(); if (exitCode == 0) { log.info("封面提取完成!"); return imgOutPut; } else { log.error("封面提取失败!exitCode:{},input:{},imgOutPut:{}", exitCode,input,imgOutPut); } } catch (Exception e) { log.error("processBuilder error.", e); } return null; } /** * 视频格式化为mp4 * * @param file * @param targetPath * @return */ public static boolean formatToMp4(File file, String targetPath) { File target = new File(targetPath); MultimediaObject multimediaObject; try { // 若是本地文件: multimediaObject = new MultimediaObject(new File("你的本地路径")); // multimediaObject = new MultimediaObject(new URL(url)); // multimediaObject = new MultimediaObject(new File(input)); multimediaObject = new MultimediaObject(file); EncodingAttributes attributes = new EncodingAttributes(); // 设置视频的音频参数 AudioAttributes audioAttributes = new AudioAttributes(); attributes.setAudioAttributes(audioAttributes); // 设置视频的视频参数 VideoAttributes videoAttributes = new VideoAttributes(); // 设置帧率 videoAttributes.setFrameRate(25); attributes.setVideoAttributes(videoAttributes); // 设置输出格式 attributes.setOutputFormat("mp4"); Encoder encoder = new Encoder(); encoder.encode(multimediaObject, target, attributes); return true; } catch (Exception e) { System.out.println("格式化视频异常"); e.printStackTrace(); return false; } } public static boolean formatToWav(String input, String targetPath) { File target = new File(targetPath); MultimediaObject multimediaObject; try { // 若是本地文件: multimediaObject = new MultimediaObject(new File("你的本地路径")); multimediaObject = new MultimediaObject(new URL(input)); // multimediaObject = new MultimediaObject(new File(input)); EncodingAttributes attributes = new EncodingAttributes(); // 设置视频的音频参数 AudioAttributes audioAttributes = new AudioAttributes(); attributes.setAudioAttributes(audioAttributes); // 设置视频的视频参数 VideoAttributes videoAttributes = new VideoAttributes(); // 设置帧率 videoAttributes.setFrameRate(25); attributes.setVideoAttributes(videoAttributes); // 设置输出格式 attributes.setOutputFormat("wav"); Encoder encoder = new Encoder(); encoder.encode(multimediaObject, target, attributes); return true; } catch (Exception e) { System.out.println("格式化视频异常"); e.printStackTrace(); return false; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)