java使用Ffmpeg合成音频和视频
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合成音频和视频的更多相关文章
- Ubuntu下编译opencv 和Ubuntu使用ffmpeg实现音频、视频的抽取
一.使用Ubuntu编译opencv (前提是Ubuntu内已经正确配置了opencv,个人采用opencv3.2) g++ 1.cpp -o 1 `pkg-config --cflags --lib ...
- java使用ffmpeg和mencoder做视频格式转换
首发:个人博客,持续更新和纠错 主要使用技术:1)FFmpeg,用于主流格式之间的转换,例如AVI,MP4,FLV等.2)MEncoder,用于奇葩格式转主流格式,例如RMVB转AVI.这样我们可以把 ...
- java调用FFmpeg及mencoder转换视频为FLV并截图
Conver.java package com.ll19.flv; public class Conver { public void run() { try { // 转换并截图 String fi ...
- java使用ffmpeg实现上传视频的转码,提取视频的截图等功能
ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用. 1.能支持的格式 ff ...
- Java使用FFmpeg处理视频文件指南
Java使用FFmpeg处理视频文件指南 本文主要讲述如何使用Java + FFmpeg实现对视频文件的信息提取.码率压缩.分辨率转换等功能: 之前在网上浏览了一大圈Java使用FFmpeg处理音视频 ...
- Java使用FFmpeg处理视频文件的方法教程
这篇文章主要给大家介绍了关于Java使用FFmpeg处理视频文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 本文主要 ...
- Java调用FFmpeg进行视频处理及Builder设计模式的应用
1.FFmpeg是什么 FFmpeg(https://www.ffmpeg.org)是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它用来干吗呢?视频采集.视频格式转化.视频 ...
- FFmpeg在JAVA中的使用-音频提取&字幕压缩
由于项目需求中涉及到视频中音频提取,以及字幕压缩的功能,一直在研究ffmpeg,仅仅两个功能,却深受ffmpeg的折磨. 今天谈谈ffmpeg在java中的简单使用,首先下载FFmpeg包,官方地址: ...
- java调用ffmpeg获取视频文件信息的一些参数
一.下载ffmpeg http://www.ffmpeg.org/download.html 主要需要bin目录下的ffmpeg可执行文件 二.java代码实现 package com.aw.util ...
- 玩转音频、视频的利器:FFmpeg
导语 当下直播平台发展十分迅猛,依靠游戏内直播平台的发展带动游戏活跃提升收入,那么对于我们开发来说如何玩转视频呢?下面就来介绍一个音频.视频处理利器——FFmpeg. FFmpeg 简介 FFmpeg ...
随机推荐
- 金融机构的反洗钱(AML)合规工作和系统建设
声明 个人原创, 转载需注明来源 https://www.cnblogs.com/milton/p/16252061.html 反洗钱 AML 从国家机器的角度, 集体非法活动, 无论是金融还是非金融 ...
- kafka学习笔记02-kafka消息存储
kafka消息存储 broker.topic.partition kafka 的数据分布是一个 3 级结构,依次为 broker.topic.partition. 也可以理解为数据库的分库分表,然后还 ...
- 【Android逆向】破解黑宝宝apk,绕过签名校验
这是52pojie的一道题,实现输入任何密码都可以登录成功 他知道你最近在学习Android逆向 他想在游戏上线前让你测试一下他新加的签名验证是否能防住别人的破解. 下面是李华编写的黑宝宝apk 链接 ...
- Qt开发技术:QCharts(四)QChart面积图介绍、Demo以及代码详解
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- Navicat安装包和激活工具
链接:https://pan.baidu.com/s/11YuOKdgGakt3E8CL80aA2g 提取码:h4f3
- 【LeetCode回溯算法#05】分割回文串(复习双指针判断回文以及substr函数使用记录)
分割回文串 力扣题目链接 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 .返回 s 所有可能的分割方案. 回文串 是正着读和反着读都一样的字符串. 示例 1: 输入:s = ...
- c# 4.8 实现Windows 定时任务计划(Task Scheduler)
分享一个我自己写的 Windows 定时任务计划(Task Scheduler) 动态创建代码,没做太多封装,留个实现笔记 首先封装一个简单配置项的类 1 public class TaskSched ...
- Vue源码学习(十一):计算属性computed初步学习
好家伙, 1.Computed实现原理 if (opts.computed) { initComputed(vm,opts.computed); } function initComputed(v ...
- [Python] 超简单的 超星学习通自动签到
目录 概述 代码 其他的 文件编码问题 windows 和 linux下换行符不同的问题 概述 今天两节课的签到都错过了 /(ㄒoㄒ)/~~ 所以决定花点时间做一个自动签到的工具 经过观察发现超星的结 ...
- C++ auto与循环
C++ auto与循环 C++ auto 的介绍 typeid(p).name();可以输出auto的类型 auto 是 C++11 引入的一个关键字,用于自动类型推导.编译器会根据初始化表达式的类型 ...