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合成音频和视频的更多相关文章

  1. Ubuntu下编译opencv 和Ubuntu使用ffmpeg实现音频、视频的抽取

    一.使用Ubuntu编译opencv (前提是Ubuntu内已经正确配置了opencv,个人采用opencv3.2) g++ 1.cpp -o 1 `pkg-config --cflags --lib ...

  2. java使用ffmpeg和mencoder做视频格式转换

    首发:个人博客,持续更新和纠错 主要使用技术:1)FFmpeg,用于主流格式之间的转换,例如AVI,MP4,FLV等.2)MEncoder,用于奇葩格式转主流格式,例如RMVB转AVI.这样我们可以把 ...

  3. java调用FFmpeg及mencoder转换视频为FLV并截图

    Conver.java package com.ll19.flv; public class Conver { public void run() { try { // 转换并截图 String fi ...

  4. java使用ffmpeg实现上传视频的转码,提取视频的截图等功能

    ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用. 1.能支持的格式 ff ...

  5. Java使用FFmpeg处理视频文件指南

    Java使用FFmpeg处理视频文件指南 本文主要讲述如何使用Java + FFmpeg实现对视频文件的信息提取.码率压缩.分辨率转换等功能: 之前在网上浏览了一大圈Java使用FFmpeg处理音视频 ...

  6. Java使用FFmpeg处理视频文件的方法教程

    这篇文章主要给大家介绍了关于Java使用FFmpeg处理视频文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 本文主要 ...

  7. Java调用FFmpeg进行视频处理及Builder设计模式的应用

    1.FFmpeg是什么 FFmpeg(https://www.ffmpeg.org)是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它用来干吗呢?视频采集.视频格式转化.视频 ...

  8. FFmpeg在JAVA中的使用-音频提取&字幕压缩

    由于项目需求中涉及到视频中音频提取,以及字幕压缩的功能,一直在研究ffmpeg,仅仅两个功能,却深受ffmpeg的折磨. 今天谈谈ffmpeg在java中的简单使用,首先下载FFmpeg包,官方地址: ...

  9. java调用ffmpeg获取视频文件信息的一些参数

    一.下载ffmpeg http://www.ffmpeg.org/download.html 主要需要bin目录下的ffmpeg可执行文件 二.java代码实现 package com.aw.util ...

  10. 玩转音频、视频的利器:FFmpeg

    导语 当下直播平台发展十分迅猛,依靠游戏内直播平台的发展带动游戏活跃提升收入,那么对于我们开发来说如何玩转视频呢?下面就来介绍一个音频.视频处理利器——FFmpeg. FFmpeg 简介 FFmpeg ...

随机推荐

  1. [技术选型与调研] 流程引擎(工作流引擎|BPM引擎):Activiti、Flowable、Camunda

    1 概述:流程与流程引擎 低代码平台.办公自动化(OA).BPM平台.工作流系统均需要[流程引擎]功能 BPM平台与工作流系统的区别,参见本文档:3.2 章节 流程引擎是任务分配软件(例如业务流程管理 ...

  2. C++检测句柄的权限

    主要是依靠NtQueryObject函数,其中需要传入ObjectBasicInformation参数 PUBLIC_OBJECT_BASIC_INFORMATION结构包含可用于对象的全部信息的子集 ...

  3. 第123篇: JS函数属性与方法

    好家伙,本篇为<JS高级程序设计>第十章"函数"学习笔记 ECMAScript 中的函数是对象,因此有属性和方法. 1.函数属性 每个函数都有两个属性:length 和 ...

  4. [Rust] 变量的属性: 不可变(immutable), 可变(mutable), 重定义(shadowing), 常量(const), 静态(static)

    [Rust] 变量的属性: 不可变(immutable), 可变(mutable), 重定义(shadowing), 常量(const), 静态(static) 变量的可变性 在 Rust 中, 变量 ...

  5. ffmpeg 使用记录

    这周周末尝试把我硬盘上面的视频文件压缩了一下,但是效果并不理想.其中主要有两个原因, 视频本来就是h264的编码,再重新编码也没啥用,因为限制大小的主要是码率 ffmpeg GPU加速版的h265编码 ...

  6. Java 多线程------创建多线程的方式二:实现 Runnable接口 + 比较创建线程的两种方式:

    1 package com.bytezero.threadexer; 2 3 /** 4 * 5 * 创建多线程的方式二:实现 Runnable接口 6 * 1.创建一个实现了Runnable接口类 ...

  7. 发那科数控机床FanucCNC(NCGuide)仿真模拟器配置和数据采集测试

    开发日记3.12 此篇用于记录发那科数控机床(Fanuc CNC)采集程序开发中,用虚拟机做测试时,虚拟机的配置和使用以支持采集软件开发和测试. 配置虚拟机使用仿真软件 下载VMware15 「链接: ...

  8. mockjs 前端写完 给后台调 mock.js | 改到2.0版本

    需求:最近活太忙了,实在是联调没有时间了,无奈又拾起来mockjs 1 安装mockjs npm install mockjs // 这是个只在开发的时候用,打包后就没有了,业务更安全 npm ins ...

  9. 摆脱鼠标操作 vscode-vim-use-readme.md

    vscode-vim 学习笔记 梳理下自己定义的快捷键 Normal模式返回 ESC capsLock 双击shift ctrl+[ jj ctrl+c (这个键比较特殊 用习惯y的话,考虑这个) 一 ...

  10. 音标 舌侧音 /l/ 的发音 - 英语

    音标 舌侧音 /l/ 的发音 这个音标 首先确定下 就是一个音 发 了(注意 发音方式不是中文的了,是英文的了) 注意发音方式很重要 中文 '了',重点在 偏鼻音(发射方向为前上方) 英文 '了',重 ...