application.properties

server.port=8908
file.uploadfolder=D:/school/
#分片文件临时目录
file.chunkfolder=D:/school/tempfile/ffmpegpath=D:/tools/ffmpeg-4.2-win64-static/bin/ffmpeg.exe
officehome=C:/Program Files/LibreOffice
logging.file.name=E:/logs/schoolfile.txt#单个文件最大500M(524288000)
spring.servlet.multipart.max-file-size=100MB
#设置总上传数据总大小
spring.servlet.multipart.max-request-size=10000MB#打印日志的两种方式第一种可以指定包名,第二种都可以打印
logging.level.com.xhkjedu.mapper=debugserver.tomcat.uri-encoding=UTF-8
server.tomcat.accesslog.encoding=utf-8

ConfigKey配置文件读取类

package com.xhkjedu.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** @description 配置文件读取类* @date 2020/5/20 14:51**/
@Component
public class ConfigKey {public static String uploadfolder;//文件保存文件夹public static String tempschool;//分片上传临时文件保存目录public static String ffmpegpath;//ffmpeg目录public static String officehome;//office目录@Value("${file.uploadfolder}")public void setUploadfolder(String uploadfolder) {this.uploadfolder = uploadfolder;}@Value("${file.chunkfolder}")public void setTempschool(String tempschool) {this.tempschool = tempschool;}@Value("${ffmpegpath}")public void setFfmpegpath(String ffmpegpath){ this.ffmpegpath = ffmpegpath;}@Value("${officehome}")public static void setOfficehome(String officehome) {ConfigKey.officehome = officehome;}
}

VideoUtil视频工具类

package com.xhkjedu.utils;import com.xhkjedu.config.ConfigKey;
import com.xhkjedu.vo.VideoVo;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.MultimediaInfo;
import it.sauronsoftware.jave.VideoInfo;
import lombok.extern.slf4j.Slf4j;import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** @ClassName VideoUtil* Description TODO 视频* Author WN* Date 2020/6/23 11:44**/
@Slf4j
public class VideoUtil {private static String  uploadfolder = ConfigKey.uploadfolder; //文件保存的目录private static String ffmpegpath = ConfigKey.ffmpegpath;//ffpeg目录public static Map<String, Integer> videoMap = new ConcurrentHashMap<>();public static VideoVo getVideo(String filepath){VideoVo videoVo = new VideoVo();videoVo.setVideopath(filepath);Long duration = getVideoDuration(videoVo);int d = Math.round(duration/1000);videoVo.setDuration(d);String coverpath = getVideoCover(uploadfolder + filepath);videoVo.setCoverpath(coverpath);return videoVo;}//获取视频时长private static Long getVideoDuration(VideoVo videoVo) {Long duration = 0l;try {String videopath = uploadfolder + videoVo.getVideopath();File video = new File(videopath);Encoder encoder = new Encoder();MultimediaInfo mi = encoder.getInfo(video);duration = mi.getDuration();} catch (Exception e) {log.error("获取视频时长失败!  viedoPath:{}", videoVo.getVideopath(), e);}return duration;}//获取视频封面图private static String getVideoCover(String videopath){File file = new File(videopath);if (!file.exists()) {System.err.println("路径[" + videopath + "]对应的视频文件不存在!");return "";}String coverpath = videopath.substring(0, videopath.lastIndexOf(".")).replaceFirst("vedio", "file") + ".jpg";List<String> commands = new java.util.ArrayList<String>();commands.add(ffmpegpath);commands.add("-i");commands.add(videopath);commands.add("-y");commands.add("-f");commands.add("image2");commands.add("-ss"); 添加参数"-ss",该参数指定截取的起始时间commands.add("2");// 这个参数是设置截取视频多少秒时的画面commands.add("-t");// 添加参数"-t",该参数指定持续时间commands.add("0.001");// 添加持续时间为1毫秒//commands.add("-s");//commands.add("700x525");commands.add(coverpath);String rtnstr = coverpath.replace(uploadfolder,"");try {ProcessBuilder builder = new ProcessBuilder();builder.command(commands);builder.start();} catch (Exception e) {e.printStackTrace();log.error("获取视频封面图失败:" + e.getMessage());return "";}return rtnstr;}/*** 获取mp4文件编码 mpeg4编码网页端不能播放,需调用transfer方法转为h264编码才能播放* @Param [filePath]* @Author ywx* @Date 2020/8/24 10:26* @return java.lang.String**/public static String getVideoCoder(String filePath){try {File file = new File(filePath);Encoder encoder = new Encoder();MultimediaInfo info = encoder.getInfo(file);VideoInfo video = info.getVideo();String decoder = video.getDecoder();return decoder;} catch (EncoderException e) {return null;}}/*** mp4 mpeg4编码转为h264编码* @Param [infile, outfile]* @Author ywx* @Date 2020/8/24 10:28* @return void**/public static String transferToH264(String infile, Integer resourceid, String type) throws Exception {infile = uploadfolder + infile;File inFile = new File(infile);String outfile = inFile.getParent() + File.separator + "transfer" + File.separator +inFile.getName();File outFile = new File(outfile);if (!inFile.exists() && outFile.exists()){//视频存在直接返回视频地址return outfile.replaceAll("\\\\", "/").replaceAll(uploadfolder,"");}if (!inFile.exists()){throw new Exception("该视频不存在");}String key = type +resourceid;Integer value = videoMap.get(key);if (value == null && outFile.exists()){outFile.delete();//重启服务或程序异常结束视频未转换完成,删除转换后的视频重新转换}if (inFile.exists() && outFile.exists()){//视频转码中return null;}File directory = new File(outFile.getParent());directory.setWritable(true,false);if (!directory.exists()) {directory.mkdirs();}//文件名包含空格转码失败解决方案:给路径加上引号String videoCommend = ffmpegpath+" -threads 5 -i \"" + infile + "\" -vcodec libx264 -preset ultrafast -r 29.97 -b 768k -ar 24000 -ab 64k -s 1280x720 \""+ outfile +"\"";try {videoMap.put(key,resourceid);Runtime rt = Runtime.getRuntime();Process proc = rt.exec(videoCommend);InputStream stderr = proc.getErrorStream();InputStreamReader isr = new InputStreamReader(stderr);BufferedReader br = new BufferedReader(isr);while ( br.readLine() != null) {}int exitVal = proc.waitFor();if (exitVal == 0) {inFile.delete();videoMap.remove(key);} else {throw new Exception("视频转码失败");}} catch (Exception t) {log.error("视频转码失败:"+t.getMessage());throw new Exception("视频转码失败");}return outfile.replaceAll("\\\\", "/").replaceAll(uploadfolder,"");}
}

异常

转换命令1(path下添加ffmpeg的环境变量,通过ffmpeg环境变量转码):
String videoCommend = "ffmpeg -threads 5 -i \"" + infile + "\" -vcodec libx264 -preset ultrafast -r 29.97 -b 768k -ar 24000 -ab 64k -s 1280x720 \""+ outfile +"\"";转换命令2(通过ffmpeg绝对地址转码):
String videoCommend = ffmpegpath+" -threads 5 -i \"" + infile + "\" -vcodec libx264 -preset ultrafast -r 29.97 -b 768k -ar 24000 -ab 64k -s 1280x720 \""+ outfile +"\"";转换命令1在本地(win10环境下正常),在服务器(Windows Server 2012 R2配置一个文件测试服务器正常,启动文件正式服务器时报错)报错信息:Cannot run program "ffmpeg": CreateProcess error=2, 系统找不到指定的文件。转换命令2在本地和服务器上都正常

mp4视频获取时长、封面图、编码、转码(mpeg4转h264)工具类相关推荐

  1. 关于java 上传的音频或视频文件获取时长及视频封面

    1.引入依赖,由于在Github上面的maven依赖,下载不下来,需要手动下载jar,然后安装到本地的maven仓库 <!-- https://mvnrepository.com/artifac ...

  2. python如何下载MP4视频和获取时长

    我们做爬虫工作时,经常会遇到要把爬取的视频下载到本地做存储,那么我们如何使用python去下载视频呢,下载视频不是本文章的重点,在此废话不多说,直接上完整的代码: def download_file( ...

  3. ffmpeg 获取视频的时长

    简单写个程序获取视频的时长,以便做视频播放器的进度条. 很简单,头文件我懒的敲了,直接复制别的,所以有些多余. 代码如下: #include <libavcodec/avcodec.h> ...

  4. Java使用FFmpeg(自定义cmd)系列之获取视频/音频时长(File文件方式)

    ffmpeg系列 Java使用FFmpeg(自定义cmd) Java使用FFmpeg(自定义cmd)系列之获取视频/音频时长 Java使用FFmpeg(自定义cmd)系列之官方API获取视频/音频信息 ...

  5. js获取上传视频的时长

    今天又给大家发福利了,楼主很辛苦的 小伙伴们肯定遇到本地上传视频要获取其时长,话不多说,楼主给大家写了一个demo <!DOCTYPE html> <html> <hea ...

  6. js 获取上传图片和视频的宽高,还有视频的时长

    场景: 当产品经理告诉你说:我们需要限制上传的图片或视频的尺寸,不符合要求不允许上传,这个时候你该怎么做? 不用多想,很明显我们需要想办法拿到图片或视频的宽度,然后和预期的尺寸进行对比过滤,就能轻易实 ...

  7. java 根据URL获取时长,视频大小

    /*** 根据网络路径获取时长* @author ZhangShaobo**/ public class VideoInfoTest {/*** 获取网络文件,暂存为临时文件* @param url* ...

  8. C#随手笔记——获取mp4文件属性(时长)

    客户需求将一段视频重复播放3遍,本来是另一个同事的活,不过说急求找我帮忙,那我肯定也义不容辞呀~第一反应是在播放器中设置重复播放的次数,但想想这种方法不知道有没有,而且也不通用,万一换一款播放器岂不又 ...

  9. Android之通过文件绝对路径获取音视频的时长和视频的缩略图

    1 需求 遍历一个文件夹,需要获取音视频的时长和视频的第一帧图像 2 关键代码实现 获取本地音视频的时长(这里计算出来的是秒为单位),如果文件不是音视频,下面的函数会发生异常,也就是返回0,我们除了通 ...

最新文章

  1. 6.3 优化-机器学习笔记-斯坦福吴恩达教授
  2. [转]FFT倒序算法—雷德算法
  3. 【蓝桥杯Java_C组·从零开始卷】第四节、一维数组与二维数组
  4. 水晶报表的显示与打印不一至问题
  5. java word 转换 图片_怎样把手机上的图片转换成word?
  6. 是什么时候开始学习gulp了
  7. 专为小机械迷而造,培养STEM思维,千万别错过!物理机械力学知识边玩边学,5岁以上请入手...
  8. 《scikit-learn》随机森林之分类预测乳腺癌模型
  9. python1011无标题_讲解:Python:COMP1011 Programming For The WebPython
  10. 基于RV1126平台imx291分析 --- rkcif_mipi注册
  11. 2022华为杯研究生数学建模竞赛E题思路解析
  12. STM32F030F4驱动TIM1637数码管芯片
  13. WINDOWS安装.cab文件
  14. 在QQ远程协助为什么键盘无法输入?一起来学习!
  15. 转 网页游戏外挂的设计与编写:QQ摩天大楼3
  16. 数学建模论文写作学习——数模论文概述
  17. 15款jQuery幻灯片插件
  18. Eclipse启动问题:A java runtime Environment(JRE) or java Development的解决办法
  19. 2019上海埃森哲软件开发面试
  20. wps在线预览接口_金山文档在线编辑 - 快速接入 - 《WPS开放平台技术文档》 - 书栈网 · BookStack...

热门文章

  1. API文档管理工具折射出的技术视野
  2. ORACLE 9i卸载并重新安装
  3. 项目管理学习总结(1)——项目管理最佳实践入门
  4. FlowJo 视频 3.6G 中英文字幕教程教学资料 流式细胞数据分析
  5. 2021年二级c语言软件下载,二级c语言模拟考试软件下载 无忧考吧二级c语言考试系统 v2021.3官方安装版 下载-脚本之家...
  6. 移动WEB开发之流式布局-京东案例
  7. 【Offer】ThoughtWorks 2020校招-国内-软件测试工程师 | 线上测评+群面+技术面+HR面(2019.8.4 - 8.22)
  8. 哪个版本Rhinoceros支持M1intel Monterey系统?Rhinoceros for mac(犀牛建模)v7.3.21053.23032中文激活方法 功能介绍
  9. 台式电脑可以练计算机二级吗,全国计算机二级考试(考二级能用office2019练吗)...
  10. linux 单曲循环函数,怀旧音乐播放器 Exaile(也有单曲循环)