如何使用Java实现多张图片转换为视频

createh52个月前 (02-01)技术教程14

@Java讲坛杨33


开发背景

虽然前端也可以直接把一个几秒的视频传给后端,后端拿着这个视频继续做别的业务流程,但是前端这种操作的方式,有两个问题

  • 打开摄像头录制视频会跳转到另外一个页面,对客户使用不友好;
  • 苹果手机不支持跳转到另外一个页面录制视频。

基于以上两个前端处理不了的问题,只能交给后端的开发人员去慢慢探索了。

编码实现

刚开始我也是在网上搜集相关资料,但是这方面的资料非常稀少,并且还不是免费的。

最终我也没消费,就是到处搜罗相关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() {
            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}表示项目的根目录


   Jim2mov
   Jim2mov
   1.0.0
   system
   ${project.basedir}/src/main/webapp/WEB-INF/lib/Jim2mov.jar


   jmf
   jmf
   1.0.0
   system
   ${project.basedir}/src/main/webapp/WEB-INF/lib/jmf.jar

只需把以上两部分的内容在自己的电脑上准备好,即可使用Java语言将多张图片转换成视频。

下面两张截图是我在实现功能时,使用的图片以及最后生成的视频。


到此,本次知识分享就结束了,谢谢大家对我的创作方面的鼓励。我会继续努力。

作者:杨33,北京互联网公司在职Java开发,专注分享写作干货。欢迎关注我,期待你的点赞评论。

相关文章

SITEFACTORY粘贴图片自动上传到服务器(JAVA版)

学校和政府单位用SiteFactory还是有一些,最近给客户做的一个网站,用的动易SiteFactory,用户是一个学校的,现在需要支持在SiteFactory中粘贴WORD图片,客户每天需要发新闻和...

wangEditor 实现ctrl+v粘贴图片并上传、word粘贴带图片

wangEditor 实现ctrl+v粘贴图片并上传、word粘贴带图片,wangEditor实现粘贴word图片,wangEditor实现粘贴word图文,wangEditor实现粘贴word,wa...

Java基于Tinify实现4M图片无损压缩到1M

引言在当今的数字化时代,图片已成为网站、应用和社交媒体中不可或缺的元素。然而,大尺寸的图片不仅会增加页面或者客户端加载时间,还会占用大量的存储空间。为了解决这个问题,可以使用图片压缩工具来减小图片的尺...

使用jQuery ajaxFileUpload+servlet实现文件上传

1,首先需要引入两个jar包2,需要在页面引入jQuery的js库和上传需要的ajaxfileupload.js文件,因为我的上传ajax方法在project里面写的,所以需要引入,增加type类型为...

往服务器上传大文件(往服务器上传文件导致ssh挂了怎么办)

往服务器上传大文件,如何往服务器上传大文件,怎样往服务器上传大文件,往服务器上传大文件方法,往服务器上传大文件配置,往服务器上传大文件代码,往服务器上传大文件源码,往服务器上传大文件源代码,往服务器上...

一张图片即可入侵你的电脑(电脑被入侵图片)

一张看起来十分正常的可爱猫咪或美女图片,可以把恶意代码隐藏在图片像素中。当你点击这张图片时,计算机便会中招。印度安全研究人员萨米尔·沙哈把他发现的这种隐藏恶意程序的方法称为“stegosploit”,...