共计 1630 个字符,预计需要花费 5 分钟才能阅读完成。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class FFmpegUtil {
/**
* 合并视频和音频
* @param videoPath 视频文件门路
* @param audioPath 音频文件门路
* @param outputPath 合并后的视频文件输入门路
* @throws IOException
*/
public static void mergeVideoAndAudio(String videoPath, String audioPath, String outputPath) throws IOException {
// ffmpeg 命令
List<String> command = new ArrayList<>();
command.add("ffmpeg");
command.add("-i");
command.add(videoPath);
command.add("-i");
command.add(audioPath);
command.add("-filter_complex");
command.add("[0:a]volume=0.5,apad[A];[1:a]volume=0.5[B];[A][B]amix=inputs=2:duration=first:dropout_transition=2");
command.add("-c:v");
command.add("copy");
command.add("-c:a");
command.add("aac");
command.add("-strict");
command.add("experimental");
command.add("-b:a");
command.add("192k");
command.add(outputPath);
ProcessBuilder builder = new ProcessBuilder();
builder.command(command);
builder.redirectErrorStream(true);
Process process = builder.start();
// 读取命令执行后果
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {System.out.println(line);
}
// 敞开输出流
reader.close();
// 期待命令执行实现
try {process.waitFor();
} catch (InterruptedException e) {e.printStackTrace();
}
}
}
这里应用 ProcessBuilder 来调用 FFmpeg 命令,合并视频和音频的命令与之前的命令类似,只是在音频合并的局部减少了音量减半的参数。在命令执行实现后,将命令输入打印到控制台。您能够依据须要批改命令,例如调整音频音量、音频码率等参数。调用该办法能够通过以下代码实现:
public static void main(String[] args) {
String videoPath = "video.mp4";
String audioPath = "audio.mp3";
String outputPath = "output.mp4";
try {FFmpegUtil.mergeVideoAndAudio(videoPath, audioPath, outputPath);
} catch (IOException e) {e.printStackTrace();
}
}
正文完