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. STC8H8K64U 的 USB 功能测试(未成功)

    对 STC8H8K64U 的 USB 功能测试, 因为存在很多问题并且未能解释/解决, 就不写到系列里了, 把记录放上来抛砖引玉吧. 代码 测试代码下载地址 http://www.stcmcudata ...

  2. Java利用反射实现运行时方法调用

    1.介绍 在这篇短文中,我们将快速了解如何在运行时使用Java反射API调用方法. 2.准备工作 来创建一个简单的类: public class Operations { public double ...

  3. [Android 逆向]旅行青蛙破解

    1. 旅行青蛙V1.0,4 apk 安装到手机,可以运行 2. jadx 打开apk 存在这两个dll ,说明是 unity开发的 3. 导出Assembly-CSharp.dll, 使用DnSpy ...

  4. 麒麟系统开发笔记(十二):在国产麒麟系统上编译GDAL库、搭建基础开发环境和基础Demo

    前言   麒麟系统上做全球北斗定位终端开发,北斗GPS发过来的是大地坐标,应用需要的是经纬度坐标,所以需要转换,可以使用公式转换,但是之前涉及到了山He智能一个项目使用WG.   大地坐标简介 概述 ...

  5. 深入解析Python并发编程的多线程和异步编程

    本文分享自华为云社区<Python并发编程探秘:多线程与异步编程的深入解析>,作者:柠檬味拥抱. 在Python编程中,多线程是一种常用的并发编程方式,它可以有效地提高程序的执行效率,特别 ...

  6. 问题:AttributeError: module 'lib' has no attribute 'OpenSSL_add_all_algorithms'

    分析 在使用支付宝沙箱时,报了这个错误,该问题是没有安装openssl包 解决 pip3 install pyOpenSSL 安装后再次运行如果还是报错,请降低加密库 pip install cryp ...

  7. 如何在矩池云复现开源对话语言模型 ChatGLM

    ChatGLM-6B 是一个开源的.支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数.结合模型量化技术,用户可以在消费级的显卡上进行 ...

  8. String对象和String常量池

    1. String的基本特性 String:字符串,使用一对 "" 引起来表示 String s1 = "mogublog" ; // 字面量的定义方式 Str ...

  9. Vue3音乐播放器组件,可显示歌词

    在线体验地址 音乐播放器 1,安装 npm install apple-music-player 或 yarn add apple-music-player 2,在main.ts中引入 import ...

  10. Servlet中访问路径配置为/*时,使用请求转发造成内存溢出

    一.问题由来 最近在测试Servlet的请求转发功能,准备抽取一个公共的PageJumpTestServlet,用来做页面跳转功能. 这样不用每次在测试的时候,都单独写一个Servlet用来做页面跳转 ...