背景

在一些业务场景中,会有如下的一些要求:比如有用户需要将Mp4视频转为Gif动图。当然有一些小伙伴说可以使用系统截图,然后使用之前提到过的技术:GIF图像动态生成-JAVA后台生成。需要处理的素材比较少,就一两个视频,确实可以通过这种方式来处理。试想一下,如果需要处理上百个,做处理的小伙伴是不是就抓狂了,这完全是实打实的工作量。那有没有直接从Mp4转成gif动态图的技术呢?运营的小伙伴就能按时下班了。

经过一番查询,找到一些思路,Mp4视频的组成也是一帧一帧的图像组成的。如果有什么技术可以去动态获取这些数据,通过动态截取每一帧,最后再合成图片。不久解决了吗?FFmpeg变进入技术选型的视野。本文主要讲解如何在Java中,使用FFmpeg进行视频的帧读取,并最终合并成Gif动态图。

一、FFmpeg是什么?

1、简介

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Max Os等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自项目MPlayer,而且当前FFmpeg也是放在MPlayer项目组的服务器上。

2、FFmpeg功能列表

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了领先的音/视频编码库libavcodec等。

  1. libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构
  2. 和读取音视频帧等功能;
  3. libavcodec:用于各种类型声音/图像编解码;
  4. libavutil:包含一些公共的工具函数;
  5. libswscale:用于视频场景比例缩放、色彩映射转换;
  6. libpostproc:用于后期效果处理;
  7. ffmpeg:该项目提供的一个工具,可用于格式转换、解码;
  8. ffsever:一个 HTTP 多媒体即时广播串流服务器;
  9. ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

二、Java集成JavaCV调用FFmpeg

1、JavaCv引入

JavaCv是基于openCv的一个非常强大的库,关于javaCv以后计划做几次讲解,这里不深入,有兴趣的小伙伴可以先行学习。在工程中新建一个Maven工程,在Pom.xml中引入支持,需要注意的是,这里为了演示简单,引入了完整的JavaCv的包,在实际项目中不需要如此,按需引入即可。

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yelang</groupId><artifactId>mp42gif</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform --><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.2</version></dependency><!-- https://mvnrepository.com/artifact/com.madgag/animated-gif-lib --><dependency><groupId>com.madgag</groupId><artifactId>animated-gif-lib</artifactId><version>1.4</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!-- lombok 代码自动生成组件 add by wuzuhu on 2022-11-01 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope></dependency></dependencies>
</project>

2、视频转换读取

public static void main(String[] args) {// 将指定目录的 MP4 文件生成同名的 gif 文件File videoDir = new File("E:/testv");for (File file : videoDir.listFiles()) {String videoPath = file.getPath();if (videoPath.endsWith(".mp4")) {String gifPath = videoPath.substring(0, videoPath.lastIndexOf(".")) + ".gif";try {video2Gif(videoPath, gifPath);System.out.println("转换完成");} catch (Exception e) {System.out.println("文件 [" + videoPath + "] 处理异常!");e.printStackTrace();}}}
}

上面定义了一个main函数调用,只是一个简单的示例,实际项目需要自己扩展。核心的视频转换函数如下:

private static void video2Gif(String videoPath, String gifPath) throws Exception {try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoPath);FileOutputStream targetFile = new FileOutputStream(gifPath)) {grabber.start();int frames = grabber.getLengthInFrames();System.out.println(frames);AnimatedGifEncoder encoder = new AnimatedGifEncoder();encoder.setFrameRate(frames);encoder.start(targetFile);Java2DFrameConverter converter = new Java2DFrameConverter();for (int i = 0; i < frames; i += 8) {// 8帧合成1帧?(反正越大动图越小、越快)encoder.setDelay((int) grabber.getDelayedTime());encoder.addFrame(converter.convert(grabber.grabImage()));grabber.setFrameNumber(i);}encoder.finish();}
}

通过FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoPath);获取视频信息,同时调用grabber.start();进行视频读取(这一步必须要设置,否则会影响后面的结果)。通过int frames = grabber.getLengthInFrames();获取Mp4视频的帧数,再循环帧,即可。上述的代码中不是读取每一帧,这样生成的结果会非常大,建议不要全部读取。

for (int i = 0; i < frames; i += 8) {// 8帧合成1帧)encoder.setDelay((int) grabber.getDelayedTime());encoder.addFrame(converter.convert(grabber.grabImage()));grabber.setFrameNumber(i);
}

3、运行结果

使用一段视频来测试相应的功能能否正常生效,在E盘新建一个mp4视频文件。

使用上述视频来验证代码是否正确运行,通过Debug来观察程序的运行。

        最后在测试的目录中,发现已经成功生成对应的gif图片,拖到浏览器中可以正常展示。

三、总结

以上就是今天要讲的内容,本文主要简单介绍了在Java中如何基于FFmpeg进行Mp4视频到Gif动图的转换。首先简单讲解FFmpeg的定义,常用的方法,然后重点介绍JavaCv中FFmpeg具体使用,如果在工作中有这种需要,不妨采用这种方式。希望本文对您有所帮助,欢迎指导交流。

基于FFmpeg的Java视频Mp4转GIF初探相关推荐

  1. Java 利用ffmpeg工具实现视频MP4转m3u8

    Java 利用ffmpeg工具实现视频MP4转m3u8(一) 前言 (一)ffmpeg工具转码 1.如何安装ffmpeg工具 2.如何使用ffmpeg工具进行视频转码 (二)播放m3u8文件 1.vi ...

  2. 基于FFMPEG 的跨平台视频编解码研究

    第33卷 第11期 2011年11月 武 汉 理 工 大 学 学 报 JOURNALOF WUHANUNIVERSITYOFTECHNOLOGY Vol.33 No.11 췍췍췍췍췍췍췍췍췍췍췍췍췍췍 ...

  3. php 图片生成视频,PHP基于ffmpeg实现转换视频,截图及生成缩略图的方法

    本文实例讲述了PHP基于ffmpeg实现转换视频,截图及生成缩略图的方法.分享给大家供大家参考,具体如下: 这里把ffmpeg 和  生成缩略图整合了一下: include("ImageRe ...

  4. 基于FFmpeg的运动视频分析

    本文来自英特尔资深软件工程师李忠,张华在LiveVideoStackCon 2018大会上的分享,由LiveVideoStack整理而成.分享中两位老师重点介绍了基于FFmpeg的运动视频分析技术架构 ...

  5. 基于FFMPEG的音视频截取(C++Qt 版)

    基于FFMPEG的音视频截取(C++Qt 版) 这篇博客是基于上篇博客的: https://blog.csdn.net/liyuanbhu/article/details/121744275 上篇博客 ...

  6. 基于FFmpeg的封装格式MP4(TS)

    一. 封装MP4原理: 每一帧音频或视频都有一个持续时间:duration: 采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数. .正常人听觉的频率范围大约在20Hz~20kHz之 ...

  7. 基于ffmpeg的音视频转码、压制、录屏、裁切、合并、提取

    ffmpeg转码.压制.录屏.裁切.合并.提取 1.ffmpeg介绍 2.转换格式 3.音频转码 4.视频转码 5.码率控制模式 6.合并.提取音视频 7.截取.连接音视频 8.截图.水印.动图 9. ...

  8. 基于SSM的Java Web应用开发原理初探

    SSM开发Web的框架已经很成熟了,成熟得以至于有点落后了.虽然如今是SOA架构大行其道,微服务铺天盖地的时代,不过因为仍有大量的企业开发依赖于SSM,本文简单对基于SSM的Java开发做一快速入门, ...

  9. 基于FFMPEG采集摄像头图像编码MP4视频+时间水印

    1.硬件平台 操作系统:Ubuntu18.04 ffmpeg版本:ffmpeg4.2.5 摄像头:电脑自带或USB免驱摄像头 水印处理:avfilter 图像渲染:SDL库   摄像头图像采集+MP4 ...

最新文章

  1. 【Linux】02-Linux远程管理常用命令
  2. 三次握手,四次挥手的过程??为什么三握??
  3. C++ 中不能被继承的类实现,及从中体现virtual 继承的一个特性
  4. c语言函数编正切余切运算,浅谈正切函数与余切函数的应用
  5. java 中文 转义_java下载url路径包含中文需要转义的操作
  6. flume avro java_flume之Avro Source和Avro Sink
  7. VARCHART XGantt甘特图具有更多功能的HTML5 / Gantt图表的可视计划小部件
  8. 实践Hive的点点滴滴
  9. tensorflow api训练3(ckpt转成pb和pbtxt)完结
  10. 第13届蓝桥杯省赛真题剖析-2022年4月17日Scratch编程初中级组
  11. Handlebars.js入门教程
  12. 类似QQ农场的html模板,这个机器人种菜像玩QQ农场一样简单 你只需收割
  13. JPEG图像压缩探索_zigzag扫描(原创)
  14. antd Upload手动上传(react)
  15. # MAC备份/导出IDEA配置
  16. 大学计算机试题在线,大学计算机信息技术一级试题(新)
  17. 内网渗透神器xerosploit
  18. 微网站中加入一键拨号功能代码
  19. 清除css万能浮动代码
  20. Java重定向输出输入错误流实现程序日志

热门文章

  1. 用于自动驾驶的激光雷达里程计方法综述
  2. 货币政策市场化协同与大数据机制研究
  3. 移远EC25-xxx国外支持列表
  4. 32款网页设计开发人员必备的谷歌浏览器扩展
  5. 【图像分割】基于形态学重建和过滤改进FCM算法(FRFCM)实现图像分割matlab代码
  6. PPT制作(文字排版)
  7. 华为eNSP的介绍与简单使用
  8. 联想小新潮7000黑苹果教程_联想Lenovo小新 潮7000-14 完美运行win7的方法
  9. linux 统计字数 行数
  10. 使用多可用区Kubernetes进行灾难恢复