说明

Java压缩视频大小,10M视频压缩完成后大约是1M,用时大约2S
技术:基于 fffmpeg 技术实现视频压缩
条件:需要maven引入jar包

步骤一

  1. 引入pom基础依赖(前提是maven工程,在 pom.xml 文件中添加如下行)
    <dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>3.0.0</version></dependency>
  1. 依据服务器操作系统来设定如下包(此处我是用win10-64位),部署到服务器一般是linux,所以建议下面行都加入 pom.xml文件中
    <!-- 在windows上开发 开发机可实现压缩效果 window64位 --><dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-win64</artifactId><version>3.0.0</version></dependency><!-- 在linux上部署 linux服务器需要这个才能生效 linux64位 --><dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-linux64</artifactId><version>3.0.0</version></dependency>

步骤二

具体的代码(压缩视频)

import ws.schild.jave.Encoder;
import ws.schild.jave.MultimediaObject;
import ws.schild.jave.encode.AudioAttributes;
import ws.schild.jave.encode.EncodingAttributes;
import ws.schild.jave.encode.VideoAttributes;
import ws.schild.jave.info.AudioInfo;
import ws.schild.jave.info.VideoSize;import java.io.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.channels.FileChannel;/*** 传视频File对象(这是一个具体的文件),返回压缩后File对象信息* @param source*/public static File compressionVideo(File source,String picName) {if(source == null){return null;}String newPath = source.getAbsolutePath().substring(0, source.getAbsolutePath().lastIndexOf(File.separator)).concat(File.separator).concat(picName);File target = new File(newPath);try {MultimediaObject object = new MultimediaObject(source);AudioInfo audioInfo = object.getInfo().getAudio();// 根据视频大小来判断是否需要进行压缩,int maxSize = 5;double mb = Math.ceil(source.length()/ 1048576);int second = (int)object.getInfo().getDuration()/1000;BigDecimal bd = new BigDecimal(String.format("%.4f", mb/second));System.out.println("开始压缩视频了--> 视频每秒平均 "+ bd +" MB ");// 视频 > 5MB, 或者每秒 > 0.5 MB 才做压缩, 不需要的话可以把判断去掉boolean temp = mb > maxSize || bd.compareTo(new BigDecimal(0.5)) > 0;
//            if(temp){long time = System.currentTimeMillis();//TODO 视频属性设置int maxBitRate = 128000;int maxSamplingRate = 44100;int bitRate = 800000;int maxFrameRate = 20;int maxWidth = 1280;AudioAttributes audio = new AudioAttributes();// 设置通用编码格式10                   audio.setCodec("aac");// 设置最大值:比特率越高,清晰度/音质越好// 设置音频比特率,单位:b (比特率越高,清晰度/音质越好,当然文件也就越大 128000 = 182kb)if(audioInfo.getBitRate() > maxBitRate){audio.setBitRate(new Integer(maxBitRate));}// 设置重新编码的音频流中使用的声道数(1 =单声道,2 = 双声道(立体声))。如果未设置任何声道值,则编码器将选择默认值 0。audio.setChannels(audioInfo.getChannels());// 采样率越高声音的还原度越好,文件越大// 设置音频采样率,单位:赫兹 hz// 设置编码时候的音量值,未设置为0,如果256,则音量值不会改变// audio.setVolume(256);if(audioInfo.getSamplingRate() > maxSamplingRate){audio.setSamplingRate(maxSamplingRate);}//TODO 视频编码属性配置ws.schild.jave.info.VideoInfo videoInfo = object.getInfo().getVideo();VideoAttributes video = new VideoAttributes();video.setCodec("h264");//设置音频比特率,单位:b (比特率越高,清晰度/音质越好,当然文件也就越大 800000 = 800kb)if(videoInfo.getBitRate() > bitRate){video.setBitRate(bitRate);}// 视频帧率:15 f / s  帧率越低,效果越差// 设置视频帧率(帧率越低,视频会出现断层,越高让人感觉越连续),视频帧率(Frame rate)是用于测量显示帧数的量度。所谓的测量单位为每秒显示帧数(Frames per Second,简:FPS)或“赫兹”(Hz)。if(videoInfo.getFrameRate() > maxFrameRate){video.setFrameRate(maxFrameRate);}// 限制视频宽高int width = videoInfo.getSize().getWidth();int height = videoInfo.getSize().getHeight();if(width > maxWidth){float rat = (float) width / maxWidth;video.setSize(new VideoSize(maxWidth,(int)(height/rat)));}EncodingAttributes attr = new EncodingAttributes();
//                attr.setFormat("mp4");attr.setAudioAttributes(audio);attr.setVideoAttributes(video);// 速度最快的压缩方式, 压缩速度 从快到慢: ultrafast, superfast, veryfast, faster, fast, medium,  slow, slower, veryslow and placebo.
//                attr.setPreset(PresetUtil.VERYFAST);
//                attr.setCrf(27);
//                // 设置线程数
//                attr.setEncodingThreads(Runtime.getRuntime().availableProcessors()/2);Encoder encoder = new Encoder();encoder.encode(new MultimediaObject(source), target, attr);System.out.println("压缩总耗时:" + (System.currentTimeMillis() - time)/1000);return target;
//            }} catch (Exception e) {e.printStackTrace();}finally {if(target.length() > 0){source.delete();}}return source;}

注意事项

正常只在windows操作系统上开发代码没问题。
但是部署到linux上跑项目,还需要2个步骤:

1.在刚刚依赖的jar包中,找到箭头文件夹

上面箭头点进去,找到下面箭头文件

把它复制到桌面并解压它,得到如下 数字1 文件:

你需要重命名为跟pom.xml版本一致的名字,也就是 数字2 那个文件。

2.把数字2文件,复制丢到linux服务器的 /tmp/java 路径下(99%的linux服务器是这样的路径,如果没有就创建文件夹并丢进去)

提醒:如果“ffmpeg-amd64-3.0.0” 文件丢到 “ /tmp/java ”不起作用,建议到报错的代码,也就是下面这儿检查(我就是看源码解决的)

MultimediaObject object = new MultimediaObject(source);

或者到类 DefaultFFMPEGLocator.class 中看具体使用哪个路径,但是大部分都是 /tmp/java路径,相信我!!!!!!!!

JAVA,实现视频压缩(最全)相关推荐

  1. JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载

    JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载 JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的applet ...

  2. Java中的泛型全解析(二)

    Java中的泛型全解析(一) 泛型中的约束和局限性 现在我们有泛型类 不能用基本类型实例化类型参数 运行时类型查询只适用于原始类型 泛型类的静态上下文中类型变量失效 不能在静态域或方法中引用类型变量. ...

  3. Java中的泛型全解析(一)

    为什么我们需要泛型? 通过两段代码我们就可以知道为何我们需要泛型 实际开发中,经常有数值类型求和的需求,例如实现int类型的加法, 有时候还需要实现long类型的求和, 如果还需要double类型的求 ...

  4. [JAVA]全新java初学者实践教程(全)

    [JAVA]全新java初学者实践教程(全) 本教程适合初学者,高手飘过. 1.全新java初学者实践教程1(Java SE5.0版)--配置环境变量 2.全新java初学者实践教程2(Java SE ...

  5. JAVA帮助文档全系列

    JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的applet和应用程序的程序开发环境.它由一个处于操作系统层之上的运行环境还有开发者编译,调试和运 ...

  6. java做全选反选功能_[Java教程]js实现全选反选

    [Java教程]js实现全选反选 0 2017-04-04 00:00:12 在前端中用到全选反选的案例并不少,在这里呢我就实现这个功能给大家参考参考. 这里呢就先贴上我的html和css代码 快递 ...

  7. Java将汉字转换为全拼

    Java将汉字转换为全拼 pom依赖 <dependency><groupId>com.belerweb</groupId><artifactId>pi ...

  8. java汉字转拼音(全拼、简拼)

    java汉字转拼音(全拼.简拼) <dependency><groupId>com.belerweb</groupId><artifactId>piny ...

  9. 好家伙,阿里P8撰写的Java微服务架构全栈笔记GitHub一夜飞到榜首

    Java微服务作为当下最常用的架构技术,快速实现编程开发而且维护起来十分的方便,可以简单是实现高可用,分布式开发而且也很安全! 今天给大家分享的这份<Java微服务架构全栈笔记>,用140 ...

  10. Java面试----2018最全Redis面试题整理

    Java面试----2018最全Redis面试题整理 1.什么是Redis? 答:Redis全称为:Remote Dictionary Server(远程数据服务),是一个基于内存的高性能key-va ...

最新文章

  1. struts2 validate验证
  2. 新手探索NLP(六)——全文检索
  3. BRCM5.02编译九:cannot find -lncurses
  4. 关于TP-LINK宽带路由器上的“转发规则”功能用途及设置办法
  5. [MySQL 源码] 从buffer pool中获取空闲block流程
  6. 在天气预报中应用机器学习
  7. 小米 MySQL 数据实时同步到大数据数仓的架构与实践
  8. notepad++ 配置C/C++环境
  9. Redis系列--内存淘汰机制(含单机版内存优化建议)
  10. openCV,C++接口,cv::Mat矩阵数据元素读取
  11. 郭天祥 新概念51单片机C语言教程.入门、提高、开发.pdf下载地址
  12. 蚂蚁课堂-第四期-基于SpringCloud构建微服务电商项目 (无密) 解压密码是多少
  13. mac php fpm 502,nginx+php-fpm出现502(Bad Gateway)错误的分析与解决 | linux系统运维
  14. Python tkinter库Canvas操作(附涂鸦、颜色表、围棋盘三个实例)
  15. DDD中常提到的应用架构总结(六边形、洋葱、整洁、清晰)
  16. 题解 P1757 【通天之分组背包】
  17. 新手进阶建模 (写论文摘要和看论文)
  18. SSL VPN 与 IPsec VPN
  19. 在uni-app中使用element-ui
  20. 2.5 射频辐射电磁场抗扰度试验【电磁兼容EMC原理、设计与故障排除】

热门文章

  1. OpenStack云计算与HPC之一: 前言和OpenStack与HPC虚拟化
  2. 数据库新技术前沿总结
  3. Map.containsKey() 的一个使用场景.
  4. 软件设计师-数据结构知识
  5. 谷歌google自动打开开发调式工具问题DevTools
  6. endnote导入知网文献
  7. python interpreter 中没有torch_python自动化办公之 Python 解析 PDF
  8. 游戏测试工程师的光荣与梦想(一)-百炼成钢
  9. gprmax构造多层均质土壤模型
  10. 理财入门:财务报表(简单介绍,后续入门系列文章写完后,会写实践文章在详细介绍)