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. Java容器及其常用方法汇总

    1 概述 Java Collections 框架中包含了大量的接口及其实现类和操作它们的算法,主要包括列表(List).集合(Set).映射(Map),如下: 接口 实现类 数据结构 初始容量 加载因 ...

  2. 快速傅里叶变换(FFT)和小波分析在信号处理上的应用

    1前言 1.1傅里叶变换 函数f(t)为一元连续函数,其傅里叶变换定义为: F(w)的傅里叶逆变换定义为: 其中,i为虚数单位.由欧拉公式: 任意绝对可积的连续函数f(t),都可以用三角函数表示,由于 ...

  3. KQL笔记

    KQL: {'query': {'bool': {'must': [{'match': {'Sql': 'insert'}}, {'match': {'PolicyName.keyword': 'd8 ...

  4. Java并发编程实例--1.创建和运行一个线程

    从这一篇开始写Java并发编程实例,内容都翻译整理自书籍:<Java 7 Concurrency Cookbook> 谈到线程,无法逃避的一个问题就是: 并发(concurrency)和并 ...

  5. Google C++ 风格指南记录

    最近在看谷歌的 C++ 风格指南发现了一些有意思的知识点,遂记录下 1. 第六章第二小节介绍了右值引用 只在定义移动构造函数与移动赋值操作时使用右值引用. 不要使用 std::forward. 定义: ...

  6. 了解企业架构EA(Enterprise Architecture)

    一.企业架构简介 企业架构:Enterprise Architecture,EA,或企业体系结构,是在信息系统架构设计与实践基础上发展起来的一个特殊领域. 但是企业架构现在还没有一个公认的定义,综合现 ...

  7. Redis原理再学习03:数据结构-链表 list

    链表list介绍 1. 链表list简介 链表(linked list)是一种基础数据结构,是一种线性表,但是不会按照线性表的顺序存储数据,而是在每一个节点里存到下一个节点的指针. 链表插入节点时是 ...

  8. IntelliJ IDE使用指南

    下载IDEA 注释模板 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}; ...

  9. 【LeetCode剑指offer 01】数组中重复的数字、两个栈实现队列

    数组中重复的数字 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数 ...

  10. AntSK:打造你的本地AI知识库——离线运行详细教程

    亲爱的读者朋友们,今天我要给大家介绍一个强大的开源工具--AntSK.这个工具能让您在没有Internet连接时依然能使用人工智能知识库对话和查询,想象一下,即使在无网络的环境中,您也能与AI进行愉快 ...