JPG图片转视频

  • 需要引入的依赖Jim2mov 和 Jmf
    我的Jim2mov是从官网下载 然后放到本地仓库
    Jmf可以直接maven引入,也可以从官网下载
<!-- 图片转视频 --><dependency><groupId>javax.media</groupId><artifactId>jmf</artifactId><version>2.1.1e</version></dependency><dependency><groupId>com.cyf</groupId><artifactId>Jim2mov</artifactId><version>1.0.0</version></dependency>
  • 传入文件路径,获取文件路径下的image文件夹下的文件。

⚠️ 视频的宽度和高度必须和生成视频的宽高相同,否则生成的视频不能播放!!!

public static void imageToMov(String imagePath){File imageDir = new File(imagePath+File.separator+"image");File[] files = imageDir.listFiles();// 每秒播放的帧数int fps = 10;// 视频的宽度int mWidth = 640;// 视频的高度int mHeight = 480;//视频名称(视频的后缀为mov或则mp4都可以,都是可以播放的)String aviFileName = imagePath+".mp4";boolean result = convertPicToAvi(files, aviFileName, fps, mWidth, mHeight);if (result){deleteImages(imagePath);}}
  • 生成视频
  1. springBoot项目启动报错:java.awt.HeadlessException
    配置项目启动类的VM options :-Djava.awt.headless=false

    但是如果打成jar包这个配置是不会被打包的,所以最好使用代码配置。在项目启动类中写:
System.setProperty("java.awt.headless","false");
SpringApplication.run(ParkingLotApplication.class, args);
  1. 在开发时用的是Mac开发的,当时测试是没有问题的,但是最后在windows电脑跑的时候,会报找不到Error instantiating class: com.sun.media.processor.E.Handler处理类。中间那个E是我当时传入的文件夹的盘符其实,它需要找到的处理类应该是:com.sun.media.processor.file.Handle。报错位置:

    通过看源码分析:
    是在创建这个实体的时候,它根据createMediaLocator这个方法
//是在创建这个实体的是否,它根据createMediaLocator这个方法判断
public DefaultMovieInfoProvider(String fileToSave) {this(MovieUtils.createMediaLocator(fileToSave));}

可以清楚的看到,它创建对象的时候会根据传的路径去判断,mac和linux的文件路径格式和windows是不同的,mac和linux没有盘符一说,那么在下面那个方法中会走第一个else里的判断,创建的MediaLocator中的对象

/**
* 这个是上面那个方法里面的代码,我直接粘贴过来看到清楚
*/
public static MediaLocator createMediaLocator(String url) {MediaLocator ml;if (url.indexOf(":") > 0 && (ml = new MediaLocator(url)) != null) {return ml;} else {if (url.startsWith(File.separator)) {if ((ml = new MediaLocator("file:" + url)) != null) {return ml;}} else {String file = "file:" + System.getProperty("user.dir") + File.separator + url;if ((ml = new MediaLocator(file)) != null) {return ml;}}return null;}}

我们再看下创建完MediaLocator对象后,在报错位置的调用此方法获取处理类的。

 public String getProtocol() {String protocol = "";//58是“:”号,是截取冒号前int colonIndex = this.locatorString.indexOf(58);if (colonIndex != -1) {protocol = this.locatorString.substring(0, colonIndex);}return protocol;}

所以我在创建 DefaultMovieInfoProvider 实体的时候,给文件路径前加了"file:"。
DefaultMovieInfoProvider dmip = new DefaultMovieInfoProvider("file:"+aviFileName);

  • 生成视频方法完整代码:
/*** 将图片转换成视频** @param jpgs  jpg图片* @param aviFileName  生成的avi视频文件名* @param fps 每秒帧数* @param mWidth 视频的宽度* @param mHeight 视频的高度* @throws Exception*/public static boolean convertPicToAvi(File[] jpgs, String aviFileName, int fps, int mWidth, int mHeight) {// jpgs目录放置jpg图片,图片文件名为(1.jpg,2.jpg...)if (jpgs == null || jpgs.length == 0) {log.info("没有找到图片文件");return false;}// 对文件名进行排序Arrays.sort(jpgs);// 生成视频的名称DefaultMovieInfoProvider dmip = new DefaultMovieInfoProvider("file:"+aviFileName);// 设置每秒帧数 ,如果未设置,默认为3dmip.setFPS(fps > 0 ? fps : 3);// 设置总帧数dmip.setNumberOfFrames(jpgs.length);// 设置视频宽和高(最好与图片宽高保持一直)// 如果未设置,默认为640*480dmip.setMWidth(mWidth > 0 ? mWidth : 640);dmip.setMHeight(mHeight > 0 ? mHeight : 480);try {Jim2Mov jim2Mov = new Jim2Mov(new ImageProvider() {@Overridepublic byte[] getImage(int frame) {try {// 设置压缩比return MovieUtils.convertImageToJPEG((jpgs[frame]), 1.0f);} catch (IOException e) {log.error("图片转JPEG异常,{}", e.getMessage());e.printStackTrace();}return null;}}, dmip, null);jim2Mov.saveMovie(MovieInfoProvider.TYPE_QUICKTIME_JPEG);log.info("create mov success.");return true;} catch (MovieSaveException e) {log.error("视频保存异常:{}",e.getMessage());e.printStackTrace();}return false;}
  • 最后我会删除了生成视频的图片
    /*** 删除图片* @param url*/public static void deleteImages(String url){Path path = Paths.get(url);try {Files.walkFileTree(path,new SimpleFileVisitor<Path>() {// 先去遍历删除文件@Overridepublic FileVisitResult visitFile(Path file,BasicFileAttributes attrs) throws IOException {Files.delete(file);return FileVisitResult.CONTINUE;}// 再去遍历删除目录@Overridepublic FileVisitResult postVisitDirectory(Path dir,IOException exc) throws IOException {Files.delete(dir);return FileVisitResult.CONTINUE;}});}catch (IOException e){log.error("文件删除异常:{}",e.getMessage());e.printStackTrace();}}

最后提示下:⚠️目前生成的视频格式是Photo - JPEG 但是如果想要使用浏览器播放编码格式必须是H264或者H265好像都可以的,现在看jim2mov里没有生成这个格式的。想要转编码格式的话还需要使用ffmpeg解编码器。
因为这块相关的东西比较少,在开发过程中比较困难,所以还是要学会读源码,有时候比百度靠谱,哈哈,以上代码有些处理方式不知道对不对,但是都是可用的哦,有不对的地方,还得指出下,我学习学习

JPG图片转视频(Jim2mov)相关推荐

  1. 借助深度卷积神经网络对图片 GIF 视频进行超分辨率放大(即放大与降噪) 以及 对视频进行 插帧(即补帧).

    借助深度卷积神经网络对图片 & GIF & 视频进行超分辨率放大(即放大与降噪) 以及 对视频进行 插帧(即补帧). 软件下载地址:下载地址 界面效果: 处理效果: 图像清晰化 图像放 ...

  2. android获取图片缩略图,Android系获取图片和视频的缩略图

    获取手机里视频缩略图: public static Bitmap getVideoThumbnail(ContentResolver cr,Uri uri) { Bitmap bitmap = nul ...

  3. 【深度学习】深入浅出YOLOv3目标检测算法和实现(图片和视频)

    [深度学习]深入浅出YYOLOv3目标检测算法(图片和视频) 文章目录 1 概述 2 一个全卷积神经网络--Darknet-53 3 解释输出 4 代码实现4.1 导入项目4.2 执行脚本4.3 预测 ...

  4. 通过python建立一个web服务查看服务器上的文本、图片、视频等文件

    通过python建立一个web服务查看服务器上的文本.图片.视频等文件 文章目录: 1 在服务器端开启一个服务 2 在本地浏览器中输入服务器的ip地址 1 在服务器端开启一个服务 python -m ...

  5. jQuery 人脸识别插件,支持图片和视频

    jQuery Face Detection 是一款人脸检测插件,能够检测到图片,视频和画布中的人脸坐标.它跟踪人脸并输出人脸模型的坐标位置为一个数组.我们相信,面部识别技术能够给我们的 Web 应用带 ...

  6. WeChat之小工具:基于C++程序代码设计的查看微信撤销、撤回消息(包括文本、图片、视频等)GUI小工具

    WeChat之小工具:基于C++程序代码设计的查看微信撤销.撤回消息(包括文本.图片.视频等)GUI小工具 导读      哈哈,千万不要给程序猿随便发信息,程序猿认真起来,别说你发的微信信息,就连你 ...

  7. Android之获取手机上的图片和视频缩略图thumbnails

    2019独角兽企业重金招聘Python工程师标准>>> [0]大家都知道Android从1.5开始刚插入SD卡时系统会调用MediaScanner服务进行后台扫描,索引新的歌曲.图片 ...

  8. Win隐藏 Win10 中的3D对象、文档、音乐、图片、视频、下载、桌面7个文件夹

    Windows 10 的 3D对象.文档.音乐.图片.视频.下载.桌面 这7个自作多情的文件夹,不过出现在[此电脑]里面,还出现在[另存为]对话框里面,烦死了,让它消失! 以下代码保存为 reg 文件 ...

  9. android 分享图片和视频

    今天,简单讲讲如何调用手机的分享功能进行分享. 目前实现一键分享功能的方式有两种: 1.需要集成第三方官方SDK包,在获得官方授权后调用其API来完成一键分享功能,例如使用友盟分享等     优点:无 ...

最新文章

  1. 2014-3-6 星期四 [第一天执行分析]
  2. 论面向组合子程序设计方法 之 燃烧的荆棘
  3. DataGridView 添加ComboBox
  4. C4C HTML mashup debug
  5. HALCON示例程序class_2dim_unsup.hdev基于二维直方图的聚类分类
  6. HTML+CSS+JS实现 ❤️酷炫的canvas全屏背景动画特效❤️
  7. Google Protobuf
  8. Ubuntu18.04安装BeyondCompare
  9. c++MFC 截取字符串
  10. iocomp控件 Crack V512-sp6
  11. fudanNLP keyword Extraction
  12. 图音80系列车载导航/DVD分体机安装DSA
  13. java todo注释_Java自定义注解
  14. 玩转5800XM资源大搜罗--软件篇
  15. pygame初探:复刻小游戏《Flappy Bird》
  16. 我的工程师爸爸 - 音频应用DIY系列之三:汤姆猫
  17. 了解区块链(一)——加密货币以及区块链的价值
  18. 雅俗共享的微信小程序《老子探秘》,大家评价一下好坏
  19. Windows10创建还原点备份系统(解决类似网络重置网卡错误代码56问题!!!)
  20. scale实现页面缩放自适应

热门文章

  1. stm32单片机应用ucOS III ,操作浮点数导致死机解决方法
  2. 服务正在启动或停止中
  3. 小程序搜索框组件,带历史记录和搜索推荐。
  4. 谷粒商城renren-fast项目启动报错 wagon-maven-plugin docker-maven-plugin标红
  5. 《PyInstaller打包实战指南》制作软件安装包
  6. 【郭东白架构课 模块一:生存法则】02|法则一:为什么有些架构活动会没有正确的目标?
  7. 短视频创作者私域运营
  8. 【龙芯1B】:DS18B20测温例程
  9. 牛客IOI周赛22-提高组 华丽转身 C++
  10. android运行activity时报 Unfortunately,TestLayout has stopped 问题