这里是引用

视频上传、转码、播放、下载及截图的工具类

import com.example.demo.model.Contants;import java.io.*;
import java.util.ArrayList;
import java.util.List;/**** @Title: ConverVideoUtils.java* @Package:com.resource.mytools* @Description:(2.转码和截图功能)* @see:接收Contants实体的路径*/
public class ConverVideoUtils {private String sourceVideoPath;                          //源视频路径private String filerealname;                         //文件名不包括后缀名private String filename;                                 //包括后缀名private String videofolder = Contants.videofolder;      // 别的格式视频的目录private String targetfolder = Contants.targetfolder;   // flv视频的目录private String ffmpegpath = Contants.ffmpegpath;         // ffmpeg.exe的目录private String mencoderpath = Contants.mencoderpath;  // mencoder的目录private String imageRealPath = Contants.imageRealPath;   // 截图的存放目录public ConverVideoUtils() {}//重构构造方法,传入源视频public ConverVideoUtils(String path) {sourceVideoPath = path;}//set和get方法传递pathpublic String getPATH() {return sourceVideoPath;}public void setPATH(String path) {sourceVideoPath = path;}/*** 转换视频格式* @param  targetExtension 目标视频后缀名 .xxx* @param  isDelSourseFile 转换完成后是否删除源文件* @return*/public boolean beginConver(String targetExtension, boolean isDelSourseFile) {File fi = new File(sourceVideoPath);filename = fi.getName();              //获取文件名+后缀名filerealname = filename.substring(0, filename.lastIndexOf(".")); //获取不带后缀的文件名-后面加.toLowerCase()小写System.out.println("----接收到文件("+sourceVideoPath+")需要转换-------");//检测本地是否存在/*if (checkfile(sourceVideoPath)) {System.out.println(sourceVideoPath + "========该文件存在哟 ");return false;}*/System.out.println("----开始转文件(" + sourceVideoPath + ")-------------------------- ");//执行转码机制if (process(targetExtension,isDelSourseFile)) {System.out.println("视频转码结束,开始截图================= ");//视频转码完成,调用截图功能--zoutaoif (processImg(sourceVideoPath)) {System.out.println("截图成功! ");} else {System.out.println("截图失败! ");}//删除原视频+临时视频/*if (isDelSourseFile) {deleteFile(sourceVideoPath);}*//*File file1 = new File(sourceVideoPath);if (file1.exists()){System.out.println("删除原文件-可用:"+sourceVideoPath);file1.delete();}*/String temppath=videofolder + filerealname + ".avi";File file2 = new File(temppath);if (file2.exists()){System.out.println("删除临时文件:"+temppath);file2.delete();}sourceVideoPath = null;return true;} else {sourceVideoPath = null;return false;}}/*** 检查文件是否存在-多处都有判断* @param path* @return*//*private boolean checkfile(String path) {path = sourceVideoPath;File file = new File(path);try {if (file.exists()) {System.out.println("视频文件不存在============="+path);return true;} else {System.out.println("视频文件存在"+path);return false;}} catch (Exception e) {// TODO: handle exceptionSystem.out.println("拒绝对文件进行读访问");}return false;}*//*** 视频截图功能* @param sourceVideoPath 需要被截图的视频路径(包含文件名和后缀名)* @return*/public boolean processImg(String sourceVideoPath) {//先确保保存截图的文件夹存在File TempFile = new File(imageRealPath);if (TempFile.exists()) {if (TempFile.isDirectory()) {System.out.println("该文件夹存在。");}else {System.out.println("同名的文件存在,不能创建文件夹。");}}else {System.out.println("文件夹不存在,创建该文件夹。");TempFile.mkdir();}File fi = new File(sourceVideoPath);filename = fi.getName();            //获取视频文件的名称。filerealname = filename.substring(0, filename.lastIndexOf(".")); //获取视频名+不加后缀名 后面加.toLowerCase()转为小写List<String> commend = new ArrayList<String>();//第一帧: 00:00:01//截图命令:time ffmpeg -ss 00:00:01 -i test1.flv -f image2 -y test1.jpgcommend.add(ffmpegpath);            //指定ffmpeg工具的路径commend.add("-ss");commend.add("00:00:01");          //1是代表第1秒的时候截图commend.add("-i");commend.add(sourceVideoPath);     //截图的视频路径commend.add("-f");commend.add("image2");commend.add("-y");commend.add(imageRealPath + filerealname + ".jpg");        //生成截图xxx.jpg//打印截图命令StringBuffer test = new StringBuffer();for (int i = 0; i < commend.size(); i++) {test.append(commend.get(i) + " ");}System.out.println("截图命令:"+test);//转码后完成截图功能-还是得用线程来解决--zoutaotry {/*ProcessBuilder builder = new ProcessBuilder();builder.command(commend);Process p =builder.start();*///调用线程处理命令ProcessBuilder builder = new ProcessBuilder();builder.command(commend);Process p = builder.start();//获取进程的标准输入流final InputStream is1 = p.getInputStream();//获取进程的错误流final InputStream is2 = p.getErrorStream();//启动两个线程,一个线程负责读标准输出流,另一个负责读标准错误流new Thread() {public void run() {BufferedReader br = new BufferedReader(new InputStreamReader(is1));try {String lineB = null;while ((lineB = br.readLine()) != null) {if (lineB != null){//System.out.println(lineB);    //必须取走线程信息避免堵塞}}} catch (IOException e) {e.printStackTrace();}//关闭流finally{try {is1.close();} catch (IOException e) {e.printStackTrace();}}}}.start();new Thread() {public void run() {BufferedReader br2 = new BufferedReader(new InputStreamReader(is2));try {String lineC = null;while ((lineC = br2.readLine()) != null) {if (lineC != null)   {//System.out.println(lineC);   //必须取走线程信息避免堵塞}}} catch (IOException e) {e.printStackTrace();}//关闭流finally{try {is2.close();} catch (IOException e) {e.printStackTrace();}}}}.start();// 等Mencoder进程转换结束,再调用ffmepg进程非常重要!!!p.waitFor();System.out.println("截图进程结束");return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 实际转换视频格式的方法* @param targetExtension 目标视频后缀名* @param isDelSourseFile 转换完成后是否删除源文件* @return*/private boolean process(String targetExtension, boolean isDelSourseFile) {//先判断视频的类型-返回状态码int type = checkContentType();boolean status = false;//根据状态码处理if (type == 0) {System.out.println("ffmpeg可以转换,统一转为mp4文件");status = processVideoFormat(sourceVideoPath,targetExtension,isDelSourseFile);//可以指定转换为什么格式的视频} else if (type == 1) {//如果type为1,将其他文件先转换为avi,然后在用ffmpeg转换为指定格式System.out.println("ffmpeg不可以转换,先调用mencoder转码avi");String avifilepath = processAVI(type);if (avifilepath == null){// 转码失败--avi文件没有得到System.out.println("mencoder转码失败,未生成AVI文件");return false;}else {System.out.println("生成AVI文件成功,ffmpeg开始转码:");status = processVideoFormat(avifilepath,targetExtension,isDelSourseFile);}}return status;   //执行完成返回布尔类型true}/*** 检查文件类型* @return*/private int checkContentType() {//取得视频后缀-String type = sourceVideoPath.substring(sourceVideoPath.lastIndexOf(".") + 1, sourceVideoPath.length()).toLowerCase();System.out.println("源视频类型为:"+type);// 如果是ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)if (type.equals("avi")) {return 0;} else if (type.equals("mpg")) {return 0;} else if (type.equals("wmv")) {return 0;} else if (type.equals("3gp")) {return 0;} else if (type.equals("mov")) {return 0;} else if (type.equals("mp4")) {return 0;} else if (type.equals("asf")) {return 0;} else if (type.equals("asx")) {return 0;} else if (type.equals("flv")) {return 0;}else if (type.equals("mkv")) {return 0;}// 如果是ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),// 就先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.else if (type.equals("wmv9")) {return 1;} else if (type.equals("rm")) {return 1;} else if (type.equals("rmvb")) {return 1;}System.out.println("上传视频格式异常");return 9;}/***  对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),*  可以先用(mencoder)转换为avi(ffmpeg能解析的)格式.再用ffmpeg解析为指定格式* @param type* @return*/private String processAVI(int type) {System.out.println("调用了mencoder.exe工具");List<String> commend = new ArrayList<String>();commend.add(mencoderpath);                //指定mencoder.exe工具的位置commend.add(sourceVideoPath);             //指定源视频的位置commend.add("-oac");commend.add("mp3lame");            //lavc 原mp3lamecommend.add("-lameopts");commend.add("preset=64");commend.add("-ovc");commend.add("xvid");      //mpg4(xvid),AVC(h.264/x264),只有h264才是公认的MP4标准编码,如果ck播放不了,就来调整这里commend.add("-xvidencopts");  //xvidencopts或x264encoptscommend.add("bitrate=600");        //600或440commend.add("-of");commend.add("avi");commend.add("-o");commend.add(videofolder + filerealname + ".avi");   //存放路径+名称,生成.avi视频//打印出转换命令-zoutaoStringBuffer test = new StringBuffer();for (int i = 0; i < commend.size(); i++) {test.append(commend.get(i) + " ");}System.out.println("mencoder输入的命令:"+test);// cmd命令:mencoder 1.rmvb -oac mp3lame -lameopts preset=64 -ovc xvid// -xvidencopts bitrate=600 -of avi -o rmvb.avitry {//调用线程命令启动转码ProcessBuilder builder = new ProcessBuilder();builder.command(commend);Process p = builder.start();   //多线程处理加快速度-解决数据丢失//doWaitFor(p);//获取进程的标准输入流final InputStream is1 = p.getInputStream();//获取进程的错误流final InputStream is2 = p.getErrorStream();//启动两个线程,一个线程负责读标准输出流,另一个负责读标准错误流new Thread() {public void run() {BufferedReader br = new BufferedReader(new InputStreamReader(is1));try {String lineB = null;while ((lineB = br.readLine()) != null) {if (lineB != null){System.out.println(lineB);    //打印mencoder转换过程代码-可注释}}} catch (IOException e) {e.printStackTrace();}//关闭流finally{try {is1.close();} catch (IOException e) {e.printStackTrace();}}  }}.start();new Thread() {public void run() {BufferedReader br2 = new BufferedReader(new InputStreamReader(is2));try {String lineC = null;while ((lineC = br2.readLine()) != null) {if (lineC != null)   {System.out.println(lineC);    //打印mencoder转换过程代码}}} catch (IOException e) {e.printStackTrace();}//关闭finally{try {is2.close();} catch (IOException e) {e.printStackTrace();}} }}.start();// 等Mencoder进程转换结束,再调用ffmepg进程非常重要!!!p.waitFor();System.out.println("Mencoder进程结束");return videofolder + filerealname + ".avi";      //返回转为AVI以后的视频地址} catch (Exception e) {e.printStackTrace();return null;}}/*** 转换为指定格式--zoutao* ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)* @param oldfilepath* @param targetExtension 目标格式后缀名 .xxx* @param isDelSourceFile 转换完成后是否删除源文件* @return*/private boolean processVideoFormat(String oldfilepath, String targetExtension, boolean isDelSourceFile) {System.out.println("调用了ffmpeg.exe工具");//先确保保存转码后的视频的文件夹存在File TempFile = new File(targetfolder);if (TempFile.exists()) {if (TempFile.isDirectory()) {System.out.println("该文件夹存在。");}else {System.out.println("同名的文件存在,不能创建文件夹。");}}else {System.out.println("文件夹不存在,创建该文件夹。");TempFile.mkdir();}List<String> commend = new ArrayList<String>();commend.add(ffmpegpath);         //ffmpeg.exe工具地址commend.add("-i");commend.add(oldfilepath);          //源视频路径commend.add("-vcodec");commend.add("h263");  //commend.add("-ab");     //新增4条commend.add("128");      //高品质:128 低品质:64commend.add("-acodec");commend.add("mp3");      //音频编码器:原libmp3lamecommend.add("-ac");commend.add("2");       //原1commend.add("-ar");commend.add("22050");   //音频采样率22.05kHzcommend.add("-r");commend.add("29.97");  //高品质:29.97 低品质:15commend.add("-c:v");commend.add("libx264");  //视频编码器:视频是h.264编码格式commend.add("-strict");commend.add("-2");commend.add(targetfolder + filerealname + targetExtension);  // //转码后的路径+名称,是指定后缀的视频//打印命令--StringBuffer test = new StringBuffer();for (int i = 0; i < commend.size(); i++) {test.append(commend.get(i) + " ");}System.out.println("ffmpeg输入的命令:"+test);try {//多线程处理加快速度-解决rmvb数据丢失builder名称要相同ProcessBuilder builder = new ProcessBuilder();builder.command(commend);Process p = builder.start();   //多线程处理加快速度-解决数据丢失final InputStream is1 = p.getInputStream();final InputStream is2 = p.getErrorStream();new Thread() {public void run() {BufferedReader br = new BufferedReader(new InputStreamReader(is1));try {String lineB = null;while ((lineB = br.readLine()) != null) {if (lineB != null)System.out.println(lineB);    //打印mencoder转换过程代码}} catch (IOException e) {e.printStackTrace();}}}.start();new Thread() {public void run() {BufferedReader br2 = new BufferedReader(new InputStreamReader(is2));try {String lineC = null;while ((lineC = br2.readLine()) != null) {if (lineC != null)System.out.println(lineC);    //打印mencoder转换过程代码}} catch (IOException e) {e.printStackTrace();}}}.start();p.waitFor();        //进程等待机制,必须要有,否则不生成mp4!!!System.out.println("生成mp4视频为:"+videofolder + filerealname + ".mp4");return true;}catch (Exception e) {e.printStackTrace();return false;}}}设置转码工具各个路径类
public class Contants {/*** @Description:(3.工具类主类)设置转码工具的各个路径* @param:@param args* @return:void*/public static final String ffmpegpath = "D:/ffmpeg/bin/ffmpeg.exe";     // ffmpeg工具安装位置public static final String mencoderpath = "D:/ffmpeg/bin/mencoder";   // mencoder工具安装的位置public static final String videofolder = "E://Projectpicture/websiteimages/temp/";     // 需要被转换格式的视频目录public static final String videoRealPath = "E://Projectpicture/websiteimages/temp/";  // 需要被截图的视频目录public static final String targetfolder = "E://Projectpicture/websiteimages/finshvideo/"; // 转码后视频保存的目录public static final String imageRealPath = "E://Projectpicture/websiteimages/finshimg/"; // 截图的存放目录}

java实现多种格式视频上传、转码、播放、下载工具类相关推荐

  1. web/java实现多种格式视频上传、转码、截图、播放、下载等功能附源码(详细)

    web /java 实现多种格式视频上传.转码.播放.下载 1.前言 前段时间一直在做一个生物资源共享平台,采用SSM框架技术,其中涉及一个模块,是关于视频资源的播放. 本来不是很大的问题,但是无奈用 ...

  2. java web转码_web/java实现多种格式视频上传、转码、截图、播放、下载等功能附源码(详细)...

    /** * @Description:(视频资源的单独上传的接收) * @param:@param request * @param:@param response * @param:@param s ...

  3. 【FFmpeg】java实现利用ffmpeg视频上传转码同时截取一帧保存为同名图片,并获取视频分辨率

    〇.前情提要 完成了视频上传,接下来是给上传的视频保存一张同名的jpg文件在同样文件夹中,并且获取到视频的分辨率. macOS Catalina 10.15.1 ffmpeg version 4.3. ...

  4. kindeditor支持视频flv, mp4格式视频上传播放

    首先声明本人用的版本为4.1.12 1.mp4视频格式上传: 修改kindeditor-all.js  _mediaImg()方法 原代码 function _mediaImg(blankPath, ...

  5. 无广告的免费视频存储空间并提供视频上传转码的功能,很不错的哦

    我们把做好的视频,存放在第三方视频网站平台,再调用时,视频一般都有50秒,甚至70秒的广告,这就看观看者,带来非常难受的体验. 示例1: 示例2: 示例3: 示例4: 广告过长,会影响观看者的耐心,有 ...

  6. php上传png_PHP支持多种格式图片上传(支持jpg、png、gif)

    此处一次支持上传2个图片,上传后生成原图和质量较差的图,原图用于保存质量高的图片,质量差的图用于网页显示. PHP Code include_once("db.php"); inc ...

  7. OSS视频上传后直接播放只有声音没有画面

    原因:OSS作为存储服务,不对音视频文件进行任何处理,但Web浏览器支持解码常见的音视频文件.通过Web浏览器访问OSS中的音视频资源时,Web浏览器对该音视频资源进行解码并播放.如果该视频文件为MP ...

  8. 上传PDF文件转换图片工具类

    一,pdf图片转换工具 import org.apache.http.entity.ContentType; import org.apache.pdfbox.pdmodel.PDDocument; ...

  9. 网站实现视频上传、转码、截图及在线播放功能

    网站实现视频上传.转码.截图及在线播放功能 时间 2014-10-15 22:46:05 IT社区推荐资讯 原文   http://itindex.net/detail/51396-网站-视频-上传 ...

  10. java 上传视频并播放_java实现视频上传和播放..doc

    java实现视频上传和播放. Java实现视频网站的视频上传.视频转码.视频关键帧抽图, 及视频播放功能 视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过F ...

最新文章

  1. 【274天】每日项目总结系列012(2017.11.06)
  2. 动态数组 allocator
  3. MySQL带BETWEEN AND关键字的查询
  4. 期权定价理论及其matlab实现过程,期权定价理论及其Matlab实现过程
  5. mysql函数lead用指定的字符串实现左填充指定长度
  6. CSS基础必备知识点04
  7. 人人学IoT 助学思维导图
  8. 使用new和delete
  9. linux 系统如何启动服务,如何查看和停止Linux启动的服务
  10. 【keil5】pwm驱动步进电机
  11. java applepay_ApplePay对接java后台详细代码
  12. 高科技口罩可以5分钟内灭活新冠病毒;华伦天奴美妆全线产品将登陆中国市场 | 美通企业日报...
  13. 2019第十届蓝桥杯国赛C组C/C++第I题 胖子走迷宫
  14. ORACLE EBS中消息队列fnd_msg_pub、fnd_message在PL/SQL中的应用
  15. 压缩WinSxS文件夹
  16. 基于Snort的入侵检测系统
  17. UniApp 小程序实现PDF电子签名 拖拽
  18. Unity + SteamVR + VIVE Pro进行动作捕捉
  19. lcoal Storage 介绍
  20. Linux命令行提示符颜色设置PS1

热门文章

  1. 大数据实战之路-数据仓库-项目运维交接文档
  2. 条形码的码制分类详解
  3. C++句柄类 [ 资深博主 ]
  4. Linux screen capture
  5. 几款超好看的英文字体
  6. 闪信霸屏短信USSD是什么?
  7. 应用随机过程-复习笔记-Chapter4-关于期望的各态历经性习题答案
  8. openGauss数据库日志管理指导
  9. JAVA多线程是什么
  10. VMware中安装CentOS7(设置静态IP地址)超详细过程,并通过docker容器安装mySql数据库