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