如何使用Java实现多张图片转换为视频
lipiwang 2024-10-23 13:56 14 浏览 0 评论
开发背景
虽然前端也可以直接把一个几秒的视频传给后端,后端拿着这个视频继续做别的业务流程,但是前端这种操作的方式,有两个问题:
- 打开摄像头录制视频会跳转到另外一个页面,对客户使用不友好;
- 苹果手机不支持跳转到另外一个页面录制视频。
基于以上两个前端处理不了的问题,只能交给后端的开发人员去慢慢探索了。
编码实现
刚开始我也是在网上搜集相关资料,但是这方面的资料非常稀少,并且还不是免费的。
最终我也没消费,就是到处搜罗相关Java的API,最终编码实现了多张图片转换成视频。
代码demo如下:
public static void main(String[] args) {
//图片保存路径,图片的文件名为(1.jpg,2.jpg...)
String imagesPath = "C:\\Users\\yangj\\Desktop\\pic";
//读取所有图片
final File[] jpgs = new File(imagesPath).listFiles();
if (jpgs == null || jpgs.length == 0) {
System.err.println("图片数量为0");
return;
}
//对文件名为(1.jpg,2.jpg...)图片进行排序。这样做,最后生成的视频图像才是流畅的
Arrays.sort(jpgs, new Comparator<File>() {
public int compare(File file1, File file2) {
String numberName1 = file1.getName().replace(".jpg", "");
String numberName2 = file2.getName().replace(".jpg", "");
return new Integer(numberName1) - new Integer(numberName2);
}
});
//图片转成视频后的文件名
String saveMp4name = "demo.mp4";
DefaultMovieInfoProvider dmip = new DefaultMovieInfoProvider(saveMp4name);
//设置每秒帧数
dmip.setFPS(25);
//设置总帧数
dmip.setNumberOfFrames(jpgs.length);
//设置视频宽和高(最好与图片宽高保持一直)
dmip.setMWidth(500);
dmip.setMHeight(500);
//设置图像的无头模式
System.setProperty("java.awt.headless", "false");
try {
new Jim2Mov(new ImageProvider() {
public byte[] getImage(int frame) {
try {
//设置压缩比
return MovieUtils.convertImageToJPEG((jpgs[frame]), 0.7f);
} catch (IOException e) {
System.err.println(e);
}
return null;
}
}, dmip, null).saveMovie(MovieInfoProvider.TYPE_QUICKTIME_JPEG);
} catch (MovieSaveException e) {
System.err.println(e);
}
System.out.println("创建视频成功");
}
解释下编码过程中需特别注意的地方:
- 图片文件的命名:必须用数字从大到小命名,后缀是.jpg格式。这样方便后面对图片进行排序,生成流畅的视频图像。
- 生成视频的存放路径:从DefaultMovieInfoProvider的源码中可以看出,在Windows系统下测试该代码,生成的视频文件是保存在项目的根目录下;Linux系统上运行该代码,可以自定义目录,来存放生成的视频文件。
//生成视频的名称
String videoName = WapUtility.getUUID() + ".mp4";
//视频的Linux服务器上传路径
String videoPath = "uploadPath" + File.separator + "video" + File.separator + videoName;
DefaultMovieInfoProvider dmip = new DefaultMovieInfoProvider(videoPath);
- 设置每秒帧数:帧数越大,转换后的视频越清晰,但是文件占内存也越大。所以按实际业务情况综合考虑,设定一个数值即可。
- 设置视频宽和高:一般根据图片的长宽设定即可,也可与前端开发人员商定一个具体的值。
- 设置图像的无头模式:如果没有该设置,运行程序会抛出如下异常java.awt.HeadlessException
Caused by: javax.media.NoProcessorException: Error instantiating class: com.sun.media.processor.unknown.Handler : java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
at javax.media.Manager.createProcessorForSource(Manager.java:1755)
at javax.media.Manager.createProcessor(Manager.java:666)
at org.jim2mov.sun.ImagesToMovie.saveMovie(ImagesToMovie.java:81)
at org.jim2mov.core.Jim2Mov.saveMovie(Jim2Mov.java:143)
... 47 more
- 设置压缩比:修改代码示例中的0.7f即可,它的数值范围为0.0到1.0之间。生成视频的清晰度与它息息相关,数值越大,越清晰,随之文件的内存占用越来越大。所以该值的设置也需按实际业务情况综合考虑。
- 涉及的jar依赖:要正常使用上面的示例代码,必须添加这两个依赖包,Jim2mov.jar和jmf.jar。
需要这俩jar包的伙伴,关注我,私信即可。
添加外部jar包到maven项目的方式
Jim2mov.jar和jmf.jar这两个包在maven的中心仓库中是找不到的,所以只能用其他方式来满足开发的需要。
- 第一种方式:将jar包上传到公司的maven私服仓库中,然后在pom.xml文件中引用。一般是项目经理或者主管才有权限上传。
使用仓库的web管理界面或者命令行的方式,都可以上传jar包私服上。
- 第二种方式:将jar包放置在本地项目的目录下,然后在pom.xml文件中直接引用。
然后pom.xml文件引入即可,${project.basedir}表示项目的根目录
<dependency>
<groupId>Jim2mov</groupId>
<artifactId>Jim2mov</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/Jim2mov.jar</systemPath>
</dependency>
<dependency>
<groupId>jmf</groupId>
<artifactId>jmf</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/jmf.jar</systemPath>
</dependency>
只需把以上两部分的内容在自己的电脑上准备好,即可使用Java语言将多张图片转换成视频。
下面两张截图是我在实现功能时,使用的图片以及最后生成的视频。
到此,本次知识分享就结束了,谢谢大家对我的创作方面的鼓励。我会继续努力。
作者:杨33,北京互联网公司在职Java开发,专注分享写作干货。欢迎关注我,期待你的点赞评论。
相关推荐
- Redis 常见面试问题总结和答案(redisson面试题)
-
什么是Redis?Redis(RemoteDictionaryServer)Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Ke...
- 青云QingCloud新增Memcached功能 完善缓存集
-
北京2015年1月30日电/美通社/--基础云服务商青云QingCloud日前宣布,为了更好的满足用户对缓存服务多样性的需求,正式推出基于Memcached的缓存集群服务。此次发布的M...
- 还不懂什么是Redis?一文详解Redis,入门学习看这一篇就够了
-
在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量...
- redis一些常见的面试题(附答案)(redis经典面试题)
-
1、什么是redis?Redis是一个基于内存的高性能key-value数据库。2、Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统...
- Java面试官最爱问的那些Redis面试题盘点
-
一、概述二、数据类型STRINGLISTSETHASHZSET三、数据结构字典跳跃表四、使用场景计数器缓存查找表消息队列会话缓存分布式锁实现其它五、Redis与Memcached数据类型数据持久化...
- Redis为什么「操作速度」这么快以及在实际开发中的「应用场景」
-
Redis在目前分布式开发大环境下应用的场景比较多,但是大家有没有思考过为什么大家都愿意使用Redis呢?以及Redis为什么速度会这么快的原因呢?还有我们实际开发过程中使用Redis的场景又有哪些呢...
- Redis分片(分布式缓存)(redis分片存储)
-
分片(partitioning)就是将你的数据拆分到多个Redis实例的过程,这样每个实例将只包含所有键的子集.(相关推荐:Redis教程)1分片何用Redis的分片承担着两个主要目标:o允...
- 您应该了解的20大系统设计概念(系统设计有哪些)
-
您应该了解的20大系统设计概念我应该从基础开始,比如可扩展性、可用性、可靠性这些。这些都是系统设计的核心要素。接下来,可能需要考虑性能相关的,比如延迟和吞吐量,这两者常常被一起讨论。然后是存储,数据库...
- 一文彻底弄懂 TPS RPS QPS(tps/cps)
-
以下是关于RPS、QPS、TPS的核心区别与关联的总结,结合实际场景和优化建议:一、核心定义与区别RPS:RequestsPerSecond每秒请求数客户端到服务器的完整请求数量Web服务...
- redis,memcached,nginx网络组件
-
1.理解阻塞io,非阻塞io,同步io,异步io的区别2.理解BIO和AIO的区别io多路复用只负责io检测,不负责io操作阻塞io中的write,能写多少是多少,只要写成功就返回,譬如准备写500字...
- 为什么 Redis 单线程却能支撑高并发?
-
#暑期创作大赛#为什么Redis单线程却能支撑高并发?Redis和memcached有什么区别?Redis的线程模型是什么?为什么Redis单线程却能支撑高并发?这个是问Redis的...
- 值得一看的35个Redis面试题总结(redis面试题汇总)
-
Redis是一个基于内存的高性能key-value数据库。作者:民工哥1.什么是redis?Redis是一个基于内存的高性能key-value数据库。2.Reids的特点 Redis本质上是一...
- 内存数据库优缺点一览:Redis、Memcached、MongoDB和Ignite
-
内存数据库是一种将数据存储在内存中的数据库,相比于传统的磁盘数据库,内存数据库具有更高的性能、更低的延迟和更好的并发能力。内存数据库广泛应用于高速缓存、实时分析、游戏、社交网络等场景。本文将对比介绍四...
- Java面试 | 关于Redis 的面试题(redis面试题2021)
-
1.Redis是什么?Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因...
- 数字化与智能化技术:分布式缓存数据库Redis
-
一、Redis概述Redis远程字典服务(RemoteDictionaryServer),是一个开源的使用ANSIC语言编写的,基于内存的分布式缓存Key-Value数据库。1、Redis数据...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)