zoukankan      html  css  js  c++  java
  • 在java中使用FFmpeg处理视频与音频

    FFmpeg是一个非常好用的视频处理工具,下面讲讲如何在java中使用该工具类。

    一、首先,让我们来认识一下FFmpeg在Dos界面的常见操作

    1.拷贝视频,并指定新的视频的名字以及格式

            ffmpeg.exe -i old.mp4 new.avi

    2.将视频和音频结合,并指定视频的长度(7秒),同时生成结合之后的视频文件

            ffmpeg.exe -i tsd.mp4 -i "周笔畅+-+最美的期待.mp3" -t 7 -y new.avi

    3.使用ffmpg生成视频截图(对第一秒的画面作为截图)-vframes表示帧数 

            ffmpeg.exe -ss 00:00:01 -y -i 视频.mp4 -vframes 1 new.jpg

     

    二、在java中使用FFmpeg

       引入 FFMpegUtil工具类

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * FFMPEG 的相关操作
     *
     * @author Administrator
     */
    public class FFMpegUtil {
    
        //Windows下 ffmpeg.exe的路径
    // private static String ffmpegEXE = "D:\Downloads\ffmpeg-20180528-ebf85d3-win64-static\bin\ffmpeg.exe";
        //Linux与mac下  ffmpeg的路径
    private static String ffmpegEXE = "/developer/ffmpeg-4.0/bin/ffmpeg";
    
    
        /**
         * @param videoInputPath 视频的输入路径
         * @param videoOutPath   视频的输出路径
         * @throws Exception
         */
        // 拷贝视频,并指定新的视频的名字以及格式
        // ffmpeg.exe -i old.mp4 new.avi
    public static void convetor(String videoInputPath, String videoOutPath) throws Exception {
    
            List<String> command = new ArrayList<String>();
            command.add(ffmpegEXE);
            command.add("-i");
            command.add(videoInputPath);
            command.add(videoOutPath);
            ProcessBuilder builder = new ProcessBuilder(command);
            Process process = null;
            try {
                process = builder.start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
    e.printStackTrace();
            }
            // 使用这种方式会在瞬间大量消耗CPU和内存等系统资源,所以这里我们需要对流进行处理
    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();
            }
    
        }
    
        /**
         * @param videoInputPath 原视频的路径
         * @param audioInputPath 音频的路径
         * @param videoOutPath   视频与音频结合之后的视频的路径
         * @param time           视频的长度 ,单位为 s
         * @throws Exception
         */
        // 将视频和音频结合,并指定视频的长度,同时生成结合之后的视频文件
        // ffmpeg.exe -i tsd.mp4 -i "周笔畅+-+最美的期待.mp3" -t 7 -y new.avi
    public static void convetor(String videoInputPath, String audioInputPath, String videoOutPath, double time)
                throws Exception {
    
            List<String> command = new ArrayList<String>();
            command.add(ffmpegEXE);
            command.add("-i");
            command.add(videoInputPath);
            command.add("-i");
            command.add(audioInputPath);
            command.add("-t");
            command.add(String.valueOf(time));
            command.add("-y");
            command.add(videoOutPath);
            ProcessBuilder builder = new ProcessBuilder(command);
            Process process = null;
            try {
                process = builder.start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
    e.printStackTrace();
            }
            // 使用这种方式会在瞬间大量消耗CPU和内存等系统资源,所以这里我们需要对流进行处理
    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();
            }
    
        }
    
    
        /**
         * @param time_coverimg   视频的第几秒作为封面图
         * @param videoInputPath  视频的路径
         * @param frame           帧数
         * @param coverOutputPath 视频的封面图的路径
         * @throws Exception
         */
        // ffmpeg.exe -ss 00:00:01 -y -i 视频.mp4 -vframes 1 new.jpg   
    public static void convetor(String time_coverimg, String videoInputPath, int frame, String coverOutputPath)
                throws Exception {
    
            List<String> command = new ArrayList<String>();
            command.add(ffmpegEXE);
            command.add("-ss");
            command.add(time_coverimg);
            command.add("-y");
            command.add("-i");
            command.add(videoInputPath);
            command.add("-vframes");
            command.add(String.valueOf(frame));
            command.add(coverOutputPath);
            ProcessBuilder builder = new ProcessBuilder(command);
            Process process = null;
            try {
                process = builder.start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
    e.printStackTrace();
            }
            // 使用这种方式会在瞬间大量消耗CPU和内存等系统资源,所以这里我们需要对流进行处理
    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) {
    //    String videoInputPath = "G:/videos-resources/180525DFH9X09GR4/video/2018052920010792217.mp4";
    //    String coverOutputPath = "G:/videos-resources/180525DFH9X09GR4/video/2018052920014289695.jpg";
    //    try {
    //       convetor("00:00:01", videoInputPath, 1, coverOutputPath);
    //    } catch (Exception e) {//       e.printStackTrace();
    //    }
    // }
    }
    ==============================================================================================

    该工具类其实是通过java来运行Dos界面的命令,有了这个工具类,我们就可以调用该类中的convetor来应对不同的需求,当然,这里只介绍了FFmpeg中的部分功能,如果你想在java中使用FFmpeg的其他功能也很简单,请参考该类,继续重载该类中的convetor方法,将dos界面的命令搬到该类中来运行即可。

     

  • 相关阅读:
    [改善Java代码]养成良好习惯,显式声明UID
    [改善Java代码]警惕自增的陷阱
    [改善Java代码]覆写变长方法也循规蹈矩
    [改善Java代码]别让null值和空值威胁到变长方法
    [改善Java代码]避免带有变长参数的方法重载
    [改善Java代码]三元操作符的类型务必一致
    关于Windows下mysql忘记root密码的解决方法
    关于同步VSS服务器上的代码发生Eclipse里面的项目全部不见了
    关于关闭Eclipse的控制台自动跳出
    关于Windows下如何查看端口占用和杀掉进程
  • 原文地址:https://www.cnblogs.com/devise/p/9974668.html
Copyright © 2011-2022 走看看