《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
-
@param filePath
-
@return com.openailab.oascloud.common.model.ResponseResult
-
@author zxzhang
-
@date 2019/12/10
*/
public int transcode(String filePath) {
//1、获取文件名和后缀
String ext = getExt(filePath);
String fileDir = getFileDir(filePath);
String fileName = getFileName(filePath);
//2、删除同名文件
File originFile = new File(fileDir + fileName + BootstrapConst.SPOT + ext);
if (originFile.exists()){
originFile.delete();
}
//3、视频转码
LinkedList ffmpegCmds = new LinkedList<>();
ffmpegCmds.add(“ffmpeg”);
ffmpegCmds.add(“-i”);
ffmpegCmds.add(bootstrapConfig.getFileRoot() + filePath);
ffmpegCmds.add(“-c:v”);
ffmpegCmds.add(“libx264”);
ffmpegCmds.add(“-strict”);
ffmpegCmds.add(“-2”);
ffmpegCmds.add(bootstrapConfig.getFileRoot() + fileDir + BootstrapConst.PATH_SEPARATOR + fileName + “.mp4”);
ProcessBuilder builder = new ProcessBuilder();
builder.command(ffmpegCmds);
Process ffmpeg = null;
try {
ffmpeg = builder.start();
} catch (IOException e) {
e.printStackTrace();
}
String cmdStr = Arrays.toString(ffmpegCmds.toArray()).replace(“,”, “”);
LOG.info(“—开始执行FFmpeg指令:— 执行线程名:” + builder.toString());
LOG.info(“—已执行的FFmepg命令:—” + cmdStr);
// 取出输出流和错误流的信息
// 注意:必须要取出ffmpeg在执行命令过程中产生的输出信息,如果不取的话当输出流信息填满jvm存储输出留信息的缓冲区时,线程就回阻塞住
PrintStream errorStream = new PrintStream(ffmpeg.getErrorStream());
PrintStream inputStream = new PrintStream(ffmpeg.getInputStream());
errorStream.start();
inputStream.start();
// 等待ffmpeg命令执行完
int exit = 0;
try {
exit = ffmpeg.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
LOG.info(“—执行结果:—” + (exit == 0 ? “【成功】” : “【失败】”));
if (exit == 0) {
originFile = new File(filePath);
if(originFile.exists()){
originFile.delete();
}
}
return exit;
}
/