Java 实现压缩图片,视频,音频案例
Java 实现压缩图片,视频,音频案例
在 Java 中,要实现视频压缩通常需要使用外部的库或工具,因为 Java 标准库本身并不提供直接的视频处理功能。以下是一些常用的方法和工具来压缩视频:
FFmpeg:
FFmpeg 是一个开源跨平台的多媒体处理工具,可以用来对音频、视频等多媒体数据进行编解码、转换和流处理。你可以通过 Java 调用 FFmpeg 的命令行来实现视频压缩。
Xuggler:
Xuggler 是一个 Java 语言的多媒体处理库,基于 FFmpeg 和 X264 构建,提供了 Java API 来进行视频和音频的处理。你可以使用 Xuggler 来实现视频的压缩和转换。
JCodec:
JCodec 是一个专门用于视频编解码的 Java 库,支持常见的视频编解码格式,包括 H.264、MPEG-4 等。你可以使用 JCodec 来实现视频的压缩和编解码操作。
接下来我们使用FFmpeg实现音频及视频的压缩
导入Maven依赖
<dependency>
<groupId>com.vaadin.external.google</groupId>
<artifactId>android-json</artifactId>
<version>0.0.20131108.vaadin1</version>
<scope>compile</scope>
</dependency>
参数说明
1. ffmpegPath:FFmpeg可执行文件的路径。
2. "-i", inputFile.getAbsolutePath():指定输入文件的路径。
3. "-c:v", "libx264":指定视频编解码器为libx264。
4. "-crf", "28":设置视频的质量,数值越小,视频质量越高,推荐范围是18-28。
5. "-preset", "fast":设置编码速度和质量的平衡,"fast"为快速编码。
6. "-c:a", "aac":指定音频编解码器为AAC。
7. "-b:a", "64k":设置音频比特率为64kbps。
8. "-movflags", "+faststart":对生成的MP4文件进行优化,使其能够逐步播放。
9. outputFile.getAbsolutePath() + ".mp4":指定输出文件的路径和文件名,同时指定了输出文件的格式为MP4。
压缩视频
//压缩视频
public static void compressVideo(File inputFile, File outputFile) {
Long startTime = System.currentTimeMillis();
try {
String ffmpegPath = "D:\\develop\\ffmpeg-master-latest-win64-gpl\\bin\\ffmpeg.exe";
// FFmpeg可执行文件路径
// 构建FFmpeg命令
String[] command = {
ffmpegPath,
"-i", inputFile.getAbsolutePath(),
"-c:v", "libx264",
"-crf", "28",
"-preset", "fast",
"-c:a", "aac",
"-b:a", "64k",
"-movflags", "+faststart",
outputFile.getAbsolutePath() + ".mp4"
};
// 创建进程生成器
ProcessBuilder processBuilder = new ProcessBuilder(command);
// 重定向进程的输入、输出和错误流
processBuilder.inheritIO();
// 启动进程
Process process = processBuilder.start();
// 等待进程完成
process.waitFor();
Long endTime = System.currentTimeMillis();
System.out.println("视频压缩完成!用时: " + (endTime - startTime));
} catch (Exception e) {
e.printStackTrace();
}
}
压缩音频
//压缩音频
public static byte[] compressAudio(InputStream inputStream) {
Long startTime = System.currentTimeMillis();
try {
// FFmpeg可执行文件路径
String[] command = {
"ffmpeg",
"-i", "pipe:0",
"-b:a", "64k",
"-f", "mp3",
"pipe:1"
};
ProcessBuilder processBuilder = new ProcessBuilder(command);
// 重定向进程的输入、输出和错误流
processBuilder.redirectInput(ProcessBuilder.Redirect.PIPE);
processBuilder.redirectOutput(ProcessBuilder.Redirect.PIPE);
processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT);
// 启动进程
Process process = processBuilder.start();
// 将输入流拷贝到进程的输入流中
Thread copyThread = new Thread(() -> {
try {
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) > 0) {
process.getOutputStream().write(buffer, 0, len);
}
process.getOutputStream().close();
} catch (Exception e) {
e.printStackTrace();
}
});
copyThread.start();
// 将进程的输出流缓存到字节数组输出流中
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = process.getInputStream().read(buffer)) > 0) {
byteArrayOutputStream.write(buffer, 0, len);
}
// 等待输入流拷贝线程完成
copyThread.join();
// 等待进程完成
process.waitFor();
Long endTime = System.currentTimeMillis();
System.out.println("音频压缩完成!用时: " + (endTime - startTime));
// 返回压缩后的音频文件数据
return byteArrayOutputStream.toByteArray();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
实现压缩图片
//压缩图片
public static InputStream compressImage(InputStream inputStream, String outputFormat) {
BufferedImage image = null;
try {
image = ImageIO.read(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
int newWidth = (int) (image.getWidth() * compressionRatio);
int newHeight = (int) (image.getHeight() * compressionRatio);
BufferedImage compressedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
compressedImage.createGraphics().drawImage(image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ImageIO.write(compressedImage, outputFormat, out);
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
ByteArrayInputStream compressedInputStream = new ByteArrayInputStream(out.toByteArray());
return compressedInputStream;
}
Java 实现压缩图片,视频,音频案例的更多相关文章
- 使用java来压缩图片
使用java来压缩图片,简单几句,清清爽爽 使用0.3的压缩比得到的结果如下(从2.8M压缩到268K,且图片的清晰度看不出明显差别): package carlspringtest; import ...
- java 上传图片压缩图片
package com.bitspace.flame.util; import java.io.File; import java.awt.Image;import java.awt.image.Bu ...
- java流压缩图片
整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享.首先,要压缩的图片格式不能说动态图片,你可以使用bmp.png.gif等,至于压缩质量,可以通过BufferedImage来指定 ...
- Java 后端压缩图片
import java.io.*;import java.util.Date;import java.awt.*;import java.awt.image.*;import javax.imagei ...
- 记录--java获取网络资源(图片、音频等)保存本地
注:本人开始运行下面报 java.io.FileNotFoundException ,纠结很久后清理tomcat后运行成功 //获取wav文件地址 String vRecordUrl=(request ...
- python使用zlib库压缩图片,使用ffmpeg压缩视频
python压缩图片.视频 图片压缩使用zlib库 视频压缩使用工具ffmpeg # ffmpeg -i 1.mp4 -r 10 -pix_fmt yuv420p -vcodec libx264 -p ...
- java 上传图片 并压缩图片大小
Thumbnailator 是一个优秀的图片处理的Google开源Java类库.处理效果远比Java API的好.从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生 ...
- 富文本编辑器UEditor自定义工具栏(二、插入图片、音频、视频个性化功能按钮和弹层及自定义分页符)
导读:本篇将简单探讨插入图片.音频.视频的功能按钮实现方式 传送门:富文本编辑器UEditor自定义工具栏(一.基础配置与字体.背景色.行间距.超链接实现) 一.效果图 1.UEditor自定义工具栏 ...
- 基于OpenCv和swing的图片/视频展示Java实现
基于OpenCv和swing实现图片/视频的展示 图片的展示 swing展示图片,多为操作BufferedImage,这里要关注的核心是将Mat转为BufferedImage. 代码如下: publi ...
- java 上传图片 并压缩图片大小(转)
Thumbnailator 是一个优秀的图片处理的Google开源Java类库.处理效果远比Java API的好.从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生 ...
随机推荐
- NC20240 [SCOI2005]互不侵犯KING
题目链接 题目 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案. 国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. 输入描述 只有一行 ...
- NC16758 [NOIP2000]单词接龙
题目链接 题目 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在&quo ...
- NC16645 [NOIP2007]矩阵取数游戏
题目链接 题目 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵 ...
- C语言中,指针变量的坑
先看一个初始化带头结点单链表的例子,LNode是结点变量,LinkList是结点指针变量,等同于LNode* typedef struct LNode{ // 定义单链表节点类型 int data; ...
- 【Unity3D】花瓣特效
1 花瓣绘制原理 如下图是实现的花瓣特效效果,为方便描述,我们将每个红色的扁状长条称为花瓣,每个花瓣中心的绿点称为花蕊,花朵的正中心称为花心. 我们在 xOz 平面上绘制花朵,假设花心为 O ...
- Detours 的使用
Detours 是一个用于在 ARM, ARM64, X86, X64 和 IA64 机器上拦截二进制函数的库. Detours 最常用来拦截应用程序中的 win32 api 调用,比如添加调试工具. ...
- 系统环境变量中 HTTPS_PROXY 的误区
前段时间在测试一个连麦 demo,demo 简要说可以在内网环境中运行时,输入频道号就可以模拟连麦 但是在加入连麦时,一直返回错误 -2 EOF,询问得知,该错误的解释信息是"Service ...
- dpt-shell 抽取壳实现原理分析(执行逻辑)
开源项目位置(为大佬开源精神点赞) https://github.com/luoyesiqiu/dpt-shell 抽取壳分为两个步骤 加壳逻辑: 一 对apk进行解析,将codeItem抽出到一个文 ...
- 细说Spring Boot初始化DispatcherServlet
DispatcherServlet概述 在Spring Boot框架未出现之前,要开发一个基于Spring MVC框架的项目,通常需要在Java web项目的描述符文件web.xml中添加如下配置: ...
- Generating equals/hashCode implementation but without a call to superclass
Generating equals/hashCode implementation but without a call to superclass1.lombok 警告,没有注入父类的字段当我们给一 ...