ffmpeg下载地址:https://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-20181225-7efe84a-win64-static.zip
FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。FFmpeg的用户有Google,Facebook,Youtube,优酷,爱奇艺,土豆等。
关于ffmpeg更多强大功能这里不多说,主要是用Java代码来实现其音频结合的功能(注:其实其他功能的实现也是一样的操作)
先看cmd命令操作
执行后可看到文件夹中
然后直接看一段转换格式的代码:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class FFMpegTest {
private String ffmpegEXE;
public FFMpegTest(String ffmpegEXE) {
super();
this.ffmpegEXE = ffmpegEXE;
}
public void convertor(String videoInputPath, String videoOutputPath) throws Exception {
//ffmpeg -i input.mp4 -y output.avi(官方文档)
//执行转换命令
List<String> command = new ArrayList<>();
command.add(ffmpegEXE);
command.add("-i");
command.add(videoInputPath);
command.add("-y");
command.add(videoOutputPath);
for (String c : command) {
System.out.print(c + " ");
}
ProcessBuilder builder = new ProcessBuilder(command);
Process process = builder.start();
/**
* 处理流
*/
InputStream errorStream = process.getErrorStream();
InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
BufferedReader br = new BufferedReader(inputStreamReader);
String line = "";
while ( (line = br.readLine()) != null ) {
}
if (br != null) {
br.close();
}
if (inputStreamReader != null) {
inputStreamReader.close();
}
if (errorStream != null) {
errorStream.close();
}
}
public static void main(String[] args) {
FFMpegTest ffmpeg = new FFMpegTest("F:\\ffmpeg\\bin\\ffmpeg.exe");
try {
ffmpeg.convertor("F:\\视频.mp4", "F:\\新视频.avi");
} catch (Exception e) {
e.printStackTrace();
}
}
}
从上述代码可以看出,Java代码的实现其实就是对ffmpeg命令的拼接,其中涉及流的操作是因为在命令处理过程中会产生一些流,就是上面的inputStream喝errorStream,他们都会占用到内存里面,如果很多的话会造成程序卡顿甚至崩溃,因此要进行处理(在cmd中操作时如果你打开任务管理器进行查看,可以清楚的看到内存波动)
因此,音乐和视频的结合也是一样的原理,拼接命令(其中7秒为视频时长)
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class MergeVideoMp3 {
private String ffmpegEXE;
public MergeVideoMp3(String ffmpegEXE) {
super();
this.ffmpegEXE = ffmpegEXE;
}
public void convertor(String videoInputPath, String mp3InputPath,
double seconds, String videoOutputPath) throws Exception {
// ffmpeg.exe -i 视频.mp4 -i bgm.mp3 -t 7 -y 新的视频.mp4
List<String> command = new ArrayList<>();
command.add(ffmpegEXE);
command.add("-i");
command.add(videoInputPath);
command.add("-i");
command.add(mp3InputPath);
command.add("-t");
command.add(String.valueOf(seconds));
command.add("-y");
command.add(videoOutputPath);
// for (String c : command) {
// System.out.print(c + " ");
// }
ProcessBuilder builder = new ProcessBuilder(command);
Process process = builder.start();
InputStream errorStream = process.getErrorStream();
InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
BufferedReader br = new BufferedReader(inputStreamReader);
String line = "";
while ( (line = br.readLine()) != null ) {
}
if (br != null) {
br.close();
}
if (inputStreamReader != null) {
inputStreamReader.close();
}
if (errorStream != null) {
errorStream.close();
}
}
public static void main(String[] args) {
MergeVideoMp3 ffmpeg = new MergeVideoMp3("F:\\ffmpeg\\bin\\ffmpeg.exe");
try {
ffmpeg.convertor("F:\\视频.mp4", "F:\\music.mp3", 7.1, "F:\\这是通过java生产的视频.mp4");
} catch (Exception e) {
e.printStackTrace();
}
}
}