【java小程序】使用ffmpeg进行视频与背景音乐的整合


在小视频开发中,上传视频时需要选择背景音乐进行视频与背景音乐的整合。这里我们就借助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);
       }

视频整合处理完毕之后,将视频信息进行数据库保存操作即可。

猜你喜欢

转载自blog.csdn.net/taojin12/article/details/85090496