在小视频开发中,上传视频时需要选择背景音乐进行视频与背景音乐的整合。这里我们就借助ffmpeg这个工具来完成这件事。
ffmpeg简介
1、简单来说,ffmpeg就是‘视音频处理工具’。
2、跨平台的视音频处理解决方案。
3、主页:http://ffmpeg.org/。
ffmpeg的应用场景:
- 播放器:市面上的一些播放器,像射手影音、暴风影音都是基于ffmpeg来进行开发的。
- 转码工具:格式工厂、剪辑工具等
- 直播、视频加码、滤镜、水印、特效等
利用ffmpeg进行代码开发
在ffmpeg的官网下载,windows的文档,解压之后bin目录下有一个ffmpeg.exe 应用程序。
1、声明一个变量ffmpegEXE,表示ffmpeg.exe存放的目录路径。
2、执行dos命令的API,ProcessBuilder
public class MergeVideoMp3 {
private String ffmpegEXE;
public MergeVideoMp3(String ffmpegEXE) {
this.ffmpegEXE = ffmpegEXE;
}
public void convertor(String videoInputPath,String mp3InputPath,double seconds,String videoOutputPath) throws IOException{
// 视频融合背景音乐的命令 ffmpeg.exe -i 苏州大裤衩.mp4 -i 背景音乐.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);
//java提供的dos命令的API
ProcessBuilder builder = new ProcessBuilder(command);
Process process = builder.start();
//当执行命令时,会产生一些临时文件碎片占用cpu和内存空间。
//命令处理时会产生一些流,流会占用内存,如果流过多就会卡住我们的线程。
//这里做一个流的处理
InputStream errorStream = process.getErrorStream();
InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = "";
while ((line=bufferedReader.readLine()) != null) {
}
if(bufferedReader != null){
bufferedReader.close();
}
if(inputStreamReader != null){
inputStreamReader.close();
}
if(errorStream != null) {
errorStream.close();
}
}
}
ffmpeg处理工具类的调用
在上传视频成功之后,我们通过判断背景音乐id(bgmId)是否为null判断是否进行视频整合.
if (StringUtils.isNotBlank(bgmId)) {
Bgm bgm = bgmService.queryBgmById(bgmId);
String mp3InputPath = FILE_SPACE + bgm.getPath();
MergeVideoMp3 tool = new MergeVideoMp3(FFMPEG_EXE);
String videoInputPath = finalVideoPath;
String videoOutputName = UUID.randomUUID().toString() + ".mp4";
uploadPathDB = "/" + userId + "/video" + "/" +videoOutputName;
finalVideoPath = FILE_SPACE + uploadPathDB;
tool.convertor(videoInputPath,mp3InputPath,videoSeconds,finalVideoPath);
}
视频整合处理完毕之后,将视频信息进行数据库保存操作即可。