zoukankan      html  css  js  c++  java
  • Java ffmpeg 合成音视频文件

    之前有做个一个短视频的项目,一直没有动,最近试着去看的时候 ,发现新版的音视频命令和之前的有些不一样,所以这里做一下笔记,记录一下。

    首先,我们来看一下下载路径

    http://ffmpeg.org/download.html

    这里选择下载的window版本,下载之后解压就可以用了。

    接下来,我们来看具体操作。

    首先旧版本 我们合成音视频文件 的命令:

    ffmpeg.exe -i 苏州大裤衩.mp4 -i bgm.mp3 -t 7 -y 新的视频.mp4

    可以看到 一个命令就ok的

    代码:

    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("C:\ffmpeg\bin\ffmpeg.exe");
            try {
                ffmpeg.convertor("C:\苏州大裤衩.mp4", "C:\music.mp3", 7.1, "C:\这是通过java生产的视频.mp4");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

    但是发现不行,后来从新找了新命令

    //去除视屏背景音乐   ffmpeg.exe -i 吃鸡.mp4 -vcodec copy -an 吃鸡1.mp4
    
     //合成去除背景音乐的视屏和mp3文件   ffmpeg.exe -i 吃鸡1.mp4 -i 小太阳.mp3 -t 10 -y result.mp4

    代码:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    public class MergeVideoMp4 {
    
        private String ffmpegEXE;
        
        public MergeVideoMp4(String ffmpegEXE) {
            super();
            this.ffmpegEXE = ffmpegEXE;
        }
        
        public void convertor(String videoInputPath, String videoTmpPath, String mp3InputPath,
                double seconds, String videoOutputPath) throws Exception {
            //去除视屏背景音乐   ffmpeg.exe -i 吃鸡.mp4 -vcodec copy -an 吃鸡1.mp4
            List<String> command = new ArrayList<>();
            command.add(ffmpegEXE);
            
            command.add("-i");//输入
            command.add(videoInputPath);
            
            command.add("-vcodec");//分离视屏  分离音频:-acodec copy -vn
            command.add("copy");
            command.add("-an"); // 去掉音频
            command.add(videoTmpPath);
            for (String c : command) {
                System.out.print(c + " ");
            }
            
            this.processed(command);
            
            //合成去除背景音乐的视屏和mp3文件   ffmpeg.exe -i 吃鸡1.mp4 -i 小太阳.mp3 -t 10 -y result.mp4
            List<String> command2 = new ArrayList<>();
            command2.add(ffmpegEXE);
            
            command2.add("-i");
            command2.add(videoTmpPath);
            
            command2.add("-i");
            command2.add(mp3InputPath);
            
            command2.add("-t"); //指定视屏时间
            command2.add(String.valueOf(seconds));
            
            command2.add("-y"); // 当已存在输出文件时,不提示是否覆盖
            command2.add(videoOutputPath);
            System.out.println();
            for (String c : command2) {
                System.out.print(c + " ");
            }
            this.processed(command2);
        }
        
         /**
           * 执行FFmpeg命令
           * @param command
           * @throws IOException
           */
          private void processed(List<String> command){
             ProcessBuilder builder = new ProcessBuilder(command);
             Process process;
             InputStream errorStream = null;
             InputStreamReader inputStreamReader = null;
             BufferedReader br = null;
            try {
                process = builder.start();
                errorStream = process.getErrorStream();
                inputStreamReader = new InputStreamReader(errorStream);
                br = new BufferedReader(inputStreamReader);
             
               String line = "";
               while ( (line = br.readLine()) != null ) {
               }
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                     if (br != null) {
                         br.close();
                     }
                     if (inputStreamReader != null) {
                        inputStreamReader.close();
                     }
                     if (errorStream != null) {
                        errorStream.close();
                     }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            
          }
    
        public static void main(String[] args) {
            MergeVideoMp4 ffmpeg = new MergeVideoMp4("C:\ffmpeg\bin\ffmpeg.exe");
            try {
                ffmpeg.convertor("D:\吃鸡(0).mp4", "D:\吃鸡.mp4","D:\小太阳.mp3", 7.1, "D:\这是通过java生产的视频.mp4");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

    好了,到这里,测试一下 就可以看到可以了,另外需要注意就是,如果通过应用没有生成,建议将命令复制,然后在命令太执行一下,他会告诉你错误在哪里。

  • 相关阅读:
    SX知识学习——sources
    SX知识学习——TCGA(转)
    SX知识学习——WES(转)
    SX知识学习——CHIPseq(转+总结)
    编译软件安装——VS2010
    数据库知识学习——mysql
    计算机知识学习——操作系统
    计算机知识学习——计算机组成原理
    Scrapy 中文手册 0.25 文档
    python Requests 库
  • 原文地址:https://www.cnblogs.com/haoliyou/p/14193862.html
Copyright © 2011-2022 走看看