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 实现压缩图片,视频,音频案例的更多相关文章

  1. 使用java来压缩图片

    使用java来压缩图片,简单几句,清清爽爽 使用0.3的压缩比得到的结果如下(从2.8M压缩到268K,且图片的清晰度看不出明显差别): package carlspringtest; import ...

  2. java 上传图片压缩图片

    package com.bitspace.flame.util; import java.io.File; import java.awt.Image;import java.awt.image.Bu ...

  3. java流压缩图片

    整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享.首先,要压缩的图片格式不能说动态图片,你可以使用bmp.png.gif等,至于压缩质量,可以通过BufferedImage来指定 ...

  4. Java 后端压缩图片

    import java.io.*;import java.util.Date;import java.awt.*;import java.awt.image.*;import javax.imagei ...

  5. 记录--java获取网络资源(图片、音频等)保存本地

    注:本人开始运行下面报 java.io.FileNotFoundException ,纠结很久后清理tomcat后运行成功 //获取wav文件地址 String vRecordUrl=(request ...

  6. python使用zlib库压缩图片,使用ffmpeg压缩视频

    python压缩图片.视频 图片压缩使用zlib库 视频压缩使用工具ffmpeg # ffmpeg -i 1.mp4 -r 10 -pix_fmt yuv420p -vcodec libx264 -p ...

  7. java 上传图片 并压缩图片大小

    Thumbnailator 是一个优秀的图片处理的Google开源Java类库.处理效果远比Java API的好.从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生 ...

  8. 富文本编辑器UEditor自定义工具栏(二、插入图片、音频、视频个性化功能按钮和弹层及自定义分页符)

    导读:本篇将简单探讨插入图片.音频.视频的功能按钮实现方式 传送门:富文本编辑器UEditor自定义工具栏(一.基础配置与字体.背景色.行间距.超链接实现) 一.效果图 1.UEditor自定义工具栏 ...

  9. 基于OpenCv和swing的图片/视频展示Java实现

    基于OpenCv和swing实现图片/视频的展示 图片的展示 swing展示图片,多为操作BufferedImage,这里要关注的核心是将Mat转为BufferedImage. 代码如下: publi ...

  10. java 上传图片 并压缩图片大小(转)

    Thumbnailator 是一个优秀的图片处理的Google开源Java类库.处理效果远比Java API的好.从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生 ...

随机推荐

  1. JS 一篇文章弄懂Object.defineProperty,现学现用,来试试相关笔试题吧

    壹 ❀ 引 早在大半年前,掘金某位用户分享的面试题整理中有一题,简述let与const区别,你能自己模拟实现它们吗?,题目意思大概如此,时间久远我也很难找到那篇文章,当时看到此题对于const实现我的 ...

  2. Linux 中iostat 命令详解

    iostat命令详解 iostat 主要是统计 磁盘活动情况. iostat有以下缺陷: iostat的输出结果大多数是一段时间内的平均值,因此难以反映峰值情况iostat仅能对系统整体情况进行分析汇 ...

  3. STM32F407VET6 / BLACK_F407VE开发板间隔0.5秒不断重启

    有一块 STM32F407VET6 的故障开发板, 之前的问题是经常无法烧录, 必须reset之后才能连接, 具体查看这篇 STM32F407VET6烧录出现flash download failed ...

  4. STC MCU的软件和硬件PCA/PWM输出

    软件方式输出PWM PWM用于输出强度的控制, 例如灯的亮度, 轮子速度等, STC89/90系列没有硬件PWM, 需要使用代码模拟 使用纯循环的方式实现PWM 非中断的实现(SDCC环境编译) #i ...

  5. Ubuntu18.04 Server部署Flannel网络的Kubernetes

    准备服务器 ESXi6.5安装Ubuntu18.04 Server, 使用三台主机, 计划使用hostname为 kube01, kube02, kube03, 配置为2核4G/160G, K8s要求 ...

  6. IoT(Internet of things)物联网入门介绍

    1.什么样的物可以入网? 要有数据传输通路 要有一点的存储功能 要有CPU 要有操作系统 要有专门的应用程序 遵循物联网的通信协议 在网络世界中有可被识别的唯一编号 2.MQTT协议 不是在说物联网吗 ...

  7. 图书管理系统---基于ajax删除数据

    book_list.html代码 {% load static %} <!DOCTYPE html> <html lang="en"> <head&g ...

  8. django1.11和django2.2中namespace的用法

    django1.11中namespace用法 urlpatterns = [ url(r'^user/', include('user.urls', namespace='user')) ] djan ...

  9. 【Azure 应用服务】Azure Function (PowerShell) 执行时报错 "out of memory"

    问题描述 在Azure Function App服务中,创建一个PowerShell脚本的函数,遇见了OOM(Out Of Memory)的异常报错: 2022-01-10T07:44:37 Welc ...

  10. Linux操作系统不同文件类型区别?

    蓝色代表目录,绿色代表可执行文件,红色代表压缩文件.浅蓝色表示连接文件.白色表示其他文件 相关目录及作用: Bin : 存放普通用户可执行的指令 Boot: 开机引导目录 Dev:设备目录 Etc: ...