首页 > 编程语言 >java使用Ffmpeg合成音频和视频

java使用Ffmpeg合成音频和视频

时间:2023-12-08 16:55:06浏览次数:34  
标签:java Ffmpeg 音频 param opus add command ffmpeg String

1、Maven依赖

<!-- 需要注意,javacv主要是一组API为主,还需要加入对应的实现 -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.5.6</version>
        </dependency>
        <!-- 用到了 ffmpeg 需要把 ffmpeg 的平台实现依赖引入 -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>ffmpeg-platform</artifactId>
            <version>4.4-1.5.6</version>
        </dependency>
        <!--所有平台实现,依赖非常大-->
        <!--<dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.6</version>
        </dependency>-->

2、音音合并 和 音视合并

package com.xxx.util;

import com.google.common.collect.Lists;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @date: 2023-12-08 15:29
 */
public class FfmpegUtils {


    public static void main(String[] args){
        //String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class); //打包太大 不用了 linux直接安装ffmpeg
        //System.out.println(ffmpeg);
        //String ffmpeg = "D:\\ffmpeg\\ffmpeg-6.1-essentials_build\\bin\\ffmpeg.exe";
        long start = System.currentTimeMillis();
        //String a = "D:/backGroundVideos/local_directory\\rec-3703991437697637-audio.opus";
        //String b = "D:/backGroundVideos/local_directory\\rec-7300304476129654-audio.opus";
        //String c = "D:/backGroundVideos/local_directory\\rec-3703991437697637-audio.opus-new.opus";
        //audioAudioMerge(ffmpeg,a,b,c);
        //String d = "D:/backGroundVideos/local_directory\\rec-3703991437697637-video.webm";
        //String e = "D:/backGroundVideos/local_directory\\rec-3703991437697637-video-new.webm";
        //audioVideoMerge(ffmpeg,c,d,e);
        long stop = System.currentTimeMillis();
        System.out.println("用时:" + (stop-start));

    }

    /**
     * 音音合并
     * ffmpeg -i  ./rec-6892714629334504-audio.opus  -i  ./rec-8061115439143880-audio.opus
     * -filter_complex amix=inputs=2:duration=first:dropout_transition=2
     * -f opus  rec-audio.opus)
     * @param ffmpegPath      ffmpeg程序文件路径
     * @param audioInputPath  音频文件路径(输入)
     * @param audioInputPath1 音频文件路径(输入)
     * @param videoOutputPath 转换完成的文件路径(输出)
     * @throws IOException
     */
    public static void audioAudioMerge(String ffmpegPath,
                                       String audioInputPath,
                                       String audioInputPath1,
                                       String videoOutputPath){
        List<String> command = new ArrayList<>();
        //获取JavaCV中的ffmpeg本地库的调用路径
        command.add(ffmpegPath);
        command.add("-i");
        command.add(audioInputPath);
        command.add("-i");
        command.add(audioInputPath1);
        command.add("-filter_complex");
        command.add("amix=inputs=2:duration=first:dropout_transition=2");
        command.add("-f");
        command.add("opus");
        //-shortest会取视频或音频两者短的一个为准,多余部分则去除不合并
        //command.add("-shortest");
        command.add(videoOutputPath);
        execute(command);
    }

    /**
     * 操作系统进程
     * @return
     */
    public static void execute(List<String> command){
        InputStream errorStream = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        try {
//            String join = String.join("", command);
//            System.out.println(join);
//            ProcessBuilder process = new ProcessBuilder(command);
//            process.inheritIO().start().waitFor();

            ProcessBuilder builder = new ProcessBuilder(command);
            Process process = builder.start();
            errorStream = process.getErrorStream();
            isr = new InputStreamReader(errorStream);
            br = new BufferedReader(isr);
            String line = "";
            while ((line = br.readLine()) != null) {
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (br != null){
                    br.close();
                }
                if (isr != null){
                    isr.close();
                }
                if (errorStream != null){
                    errorStream.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }



    /**
     * 音视频合并
     * ffmpeg -i ./audio.opus -i ./video.webm  -c:v copy -c:a opus -strict experimental test.webm)
     *
     * @param ffmpegPath      ffmpeg程序文件路径
     * @param audioInputPath  音频文件路径(输入)
     * @param videoInputPath  视频文件路径(输入)
     * @param videoOutputPath 转换完成的文件路径(输出)
     * @throws IOException
     */
    public static void audioVideoMerge(String ffmpegPath,
                                       String audioInputPath,
                                       String videoInputPath,
                                       String videoOutputPath){
        // 构建命令
        List<String> command = Lists.newArrayList();
        command.add(ffmpegPath);
        command.add("-i");
        command.add(audioInputPath);
        command.add("-i");
        command.add(videoInputPath);
        command.add("-c:v");
        command.add("copy");
        command.add("-c:a");
        command.add("opus");
        command.add("-strict");
        command.add("experimental");
        command.add(videoOutputPath);
        execute(command);
    }
}



标签:java,Ffmpeg,音频,param,opus,add,command,ffmpeg,String
From: https://www.cnblogs.com/eternality/p/17888526.html

相关文章

  • java-导出pdf
    前言:  纯代码画pdf格式<!--iTextPDF--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.2</version></......
  • GB28181视频平台LiteCVR接入音频无声的原因排查
    视频监控系统逐渐向着互联互通和可视化的方向发展。随着互联网技术的发展,视频监控系统可以联网进行数据传输,实现不同监控设备之间的互联互通。同时,可视化技术的应用也使得视频监控数据可以以更加直观的方式呈现,使得人们更加容易理解和应用。GB28181视频平台LiteCVR拓展性强,视频......
  • Java中<where>和<if>标签的组合使用
    在Java中,并没有<where>和<if>标签的组合使用。这两个标签不是Java编程语言或Java标准库的一部分,它们可能是你所使用的特定框架或库提供的自定义标签。如果你正在使用某个特定的Java框架或模板引擎(如MyBatis、Thymeleaf等),这些框架或引擎可能提供了自定义标签,使得在代码中使用类似于<......
  • JetBrains WebStorm 2023.3 (macOS, Linux, Windows) - 最智能的 JavaScript IDE
    JetBrainsWebStorm2023.3(macOS,Linux,Windows)-最智能的JavaScriptIDE请访问原文链接:https://sysin.org/blog/jb-webstorm-2023/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgJetBrainsWebStorm-最智能的JavaScriptIDEWebStorm是一个适用于JavaSc......
  • 使用Java实现面向对象编程 第八章 File IO 总结笔记
    java里操作文件1.第一步一定是获得这个文件(获得的文件,你是无法解析获得里面的内容,约等于获得冰。你只能知道大小颜色等。外表能够获取信息.)。2.第二步获得这个文件将这个文件转换成流。然后从这个io流里读取数据io流里又分为字符流(专门处理文字)字节流(专门处理2进制等文件)3.......
  • 如何实现Java file.mkdir()失败的具体操作步骤
    如何实现Javafile.mkdir()失败的具体操作步骤Java中的file.mkdir()失败问题解析在Java中,使用file.mkdir()方法可以创建一个新的文件夹。然而,有时候我们可能会遇到file.mkdir()失败的情况,这可能导致程序没有按照预期创建文件夹。本篇文章将详细解析file.mkdir()失败的原因,并提供......
  • Java Agent有什么作用?
     JavaAgent概述JavaAgent是一种特殊类型的软件组件,它允许在Java虚拟机(JVM)运行时修改应用程序的字节码。这种技术通常用于性能监控、日志记录、系统调试等。JavaAgent主要分为两类:1.启动时加载的Agent(Pre-MainAgent)这种类型的Agent在应用程序的主方法(main)执行之前加载......
  • java实例化的五种方式
    1.创建新对象五种方式1.用new语句创建对象,这是最常见的创建对象的方法。2.使用Class类的newInstance方法3.使用Constructor类的newInstance方法运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。如:Objectobj=Class.forName("java......
  • Java synchronized
    synchronized是Java中最基本的线程同步机制之一,通过在方法或代码块上添加synchronized关键字,可以确保只有一个线程可以访问该方法或代码块。它是Java中实现线程安全的重要机制之一。synchronized关键字的使用方式有两种:1、修饰实例方法当synchronized关键字修饰一个实例方法时,......
  • Java synchronized 、ReentrantLock和Semaphore
    synchronized在Java中,使用synchronized关键字可以实现对代码块或方法的同步访问,以确保多个线程不会同时访问共享资源。当一个线程获取了对象的锁(即进入了synchronized代码块),其他线程如果也希望获取该对象的锁,它们将被阻塞,直到拥有锁的线程执行完毕并释放锁。因此,在某种意义上,使......