java 截取视频_2种方式获取视频时长、截取视频帧作为封面(java or H5)
1、(JAVA)使用jave获取视频时长
mvn install:install-file -Dfile=E:\jave-1.0.2.jar -DgroupId=it.sauronsoftware -DartifactId=jave -Dversion=1.0.2 -Dpackaging=jar
命令说明:mvn install:install-file -Dfile=jar包的位置 -DgroupId=包的groupId -DartifactId=包的artifactId -Dversion=包的version -Dpackaging=jar
然后pom.xml中引入依赖
it.sauronsoftware
jave
1.0.2
代码(摘自网络)
package com.eya.video;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.MultimediaInfo;
import java.io.File;
/**
*
* description
*
*
* @author ll
* @date 06/11/20 10:23
*/
public class VideoTimeReader {
public static void main(String[] args) {
System.out.println(readTime(new File("E:\\personal\\video\\855558d1dcc2ad522c548cefe6a67bd8.mp4")));
}
// 获取视频时长
private static String readTime(File source) {
Encoder encoder = new Encoder();
String length = "";
try {
MultimediaInfo m = encoder.getInfo(source);
long ls = m.getDuration() / 1000;
int hour = (int) (ls / 3600);
int minute = (int) (ls % 3600) / 60;
int second = (int) (ls - hour * 3600 - minute * 60);
length = hour + "小时" + minute + "分" + second + "秒";
} catch (
Exception e) {
e.printStackTrace();
}
return length;
}
}
2、(JAVA)使用javacv-platform和javacv截取视频帧作为视频封面,支持直接通过视频网络地址截取帧
引入jar包,注意这2个包的版本需要匹配,不然会出错
org.bytedeco
javacv-platform
1.4.1
org.bytedeco
javacv
1.4.1
编写java代码
package com.eya.video;
import org.apache.commons.io.IOUtils;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.UUID;
/**
*
* description
*
*
* @author ll
* @date 06/04/20 10:29
*/
public class VideoCoverCut {
/**
* 截取视频第六帧的图片
*
* @param filePath 视频路径
* @param dir 文件存放的根目录
* @return 图片的相对路径 例:pic/1.png
*/
public static String videoImage(String filePath, String dir) throws Exception {
String pngPath = "";
// FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);
FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(new File(filePath));
ff.start();
int ffLength = ff.getLengthInFrames();
Frame f;
int i = 0;
while (i < ffLength) {
f = ff.grabFrame();
//截取第6帧
if ((i > 5) && (f.image != null)) {
//生成图片的相对路径 例如:pic/uuid.png
pngPath = getPngPath();
//执行截图并放入指定位置
System.out.println("存储图片 : " + (dir + pngPath));
doExecuteFrame(f, dir + pngPath);
break;
}
i++;
}
ff.stop();
return pngPath;
}
/**
* 截取视频第六帧的图片
*
* @param url 网络视频地址
* @param dir 文件存放的根目录
* @return 图片的相对路径 例:pic/1.png
*/
public static String getVideoCoverByURL(String url, String dir) throws Exception {
InputStream videoInputStream = getVideoInputStream(url);
String pngPath = "";
FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videoInputStream);
ff.start();
int ffLength = ff.getLengthInFrames();
Frame f;
int i = 0;
while (i < ffLength) {
f = ff.grabFrame();
//截取第6帧
if ((i > 5) && (f.image != null)) {
//生成图片的相对路径 例如:pic/uuid.png
pngPath = getPngPath();
//执行截图并放入指定位置
System.out.println("存储图片 : " + (dir + pngPath));
doExecuteFrame(f, dir + pngPath);
break;
}
i++;
}
ff.stop();
IOUtils.closeQuietly(videoInputStream);
return pngPath;
}
/**
* 将网络视频地址,转成输入流
*
* @param videoUrl
* @return
*/
private static InputStream getVideoInputStream(String videoUrl) {
// 1.下载网络文件
try {
URL url = new URL(videoUrl);
//2.获取链接
URLConnection conn = url.openConnection();
//3.输入流
InputStream inStream = conn.getInputStream();
return inStream;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 生成图片的相对路径
*
* @return 图片的相对路径 例:pic/1.png
*/
private static String getPngPath() {
return getUUID() + ".png";
}
/**
* 生成唯一的uuid
*
* @return uuid
*/
private static String getUUID() {
return UUID.randomUUID().toString().replace("-", "");
}
/**
* 截取缩略图
*
* @param f Frame
* @param targerFilePath:封面图片存放路径
*/
private static void doExecuteFrame(Frame f, String targerFilePath) {
String imagemat = "png";
if (null == f || null == f.image) {
return;
}
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bi = converter.getBufferedImage(f);
File output = new File(targerFilePath);
try {
ImageIO.write(bi, imagemat, output);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
// videoImage("E:\\personal\\video\\855558d1dcc2ad522c548cefe6a67bd8.mp4", "E:\\");
getVideoCoverByURL("http://video.zhihuishu.com/zhs/ablecommons/demo/201806/dddee1c446314b84a26c74a8def3c3c7.mp4", "E:\\");
}
}
3、(H5)使用H5的video获取视频的时长、截取视频图片作为封面,基于VUE语法
Vue通过视频地址获取时长和封面
地址:{{video}}
crossOrigin='*' @loadeddata="loadedListener">
new Vue({
el: '#app',
data: {
video: 'http://video.zhihuishu.com/zhs/ablecommons/demo/201806/dddee1c446314b84a26c74a8def3c3c7.mp4',
cover: ''
},
created() {
},
methods: {
getDuration() {
alert(this.$refs.divVideo);
},
loadedListener() {
if (this.video && this.$refs.divVideo && this.$refs.divVideo.readyState === 4) {
// 获取到的视频时长(s)
console.log(parseInt(this.$refs.divVideo.duration));
// console.log(this.$refs.divVideo)
_this = this;
// 截取封面,video标签内使用了autoplay让视频自动播放,这里设定延时2秒开始截图作为封面
setTimeout(function () {
var canvas = document.createElement("canvas");
console.log(canvas)
canvas.width = _this.$refs.divVideo.videoWidth * 0.8;
canvas.height = _this.$refs.divVideo.videoHeight * 0.8;
canvas.getContext('2d').drawImage(_this.$refs.divVideo, 0, 0, canvas.width, canvas
.height);
// 生成图片(base64)
const dataUrl = canvas.toDataURL('image/png')
_this.cover = dataUrl
// console.log(dataUrl)
// 截图完毕,停止视频
_this.$refs.divVideo.pause()
}, 2000)
}
}
}
})
java 截取视频_2种方式获取视频时长、截取视频帧作为封面(java or H5)相关推荐
- html javascript 音频、视频、 mp3 、mp4 的播放、暂停、重新播放、获取音频时长、视频自动全屏播放
html javascript 音频.视频. mp3 .mp4 的播放.暂停.重新播放.获取音频时长 视频 https://www.bilibili.com/video/BV1WE411o7Ft?fr ...
- java 字符串截取的几种方式 java获取当前路径的几种方法
java 字符串截取的几种方式: https://blog.csdn.net/qq_27603235/article/details/51604584 java获取当前路径的几种方法: https:/ ...
- Java操作Excel三种方式POI、Hutool、EasyExcel
Java操作Excel三种方式POI.Hutool.EasyExcel 1. Java操作Excel概述 1.1 Excel需求概述 1.2 Excel操作三种方式对比 2. ApachePOIExc ...
- java创建对象的五种方式
java创建对象的五种方式 一.使用new关键字 二.使用clone方法 三.使用反序列化 四.使用反射 五.使用Unsafe 一.使用new关键字 如 User user=new User(); 执 ...
- java实现线程三种方式_详解三种java实现多线程的方式
java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...
- Spring MVC 实战:三种方式获取登录用户信息
前言 Web 项目中,维持用户登录状态的常用方式有三种,分别是 Cookie.Session.Token,不管哪种方案,都需要获取到用户信息供业务层使用. 由于获取用户信息与具体业务无关,因此在普通的 ...
- Java技术分享:升级所安装Java版本的两种方式
在进行Java开发的时候我们可能会需要升级所安装的Java版本,那么你知道应该如何安装吗?小千今天就来给大家介绍两种方式. 一.卸载掉原本安装的Java,下载最新安装包安装即可. 这个步骤就不介绍了, ...
- Android之通过文件绝对路径获取音视频的时长和视频的缩略图
1 需求 遍历一个文件夹,需要获取音视频的时长和视频的第一帧图像 2 关键代码实现 获取本地音视频的时长(这里计算出来的是秒为单位),如果文件不是音视频,下面的函数会发生异常,也就是返回0,我们除了通 ...
- 2种方式获取StreamingAssets下音频
第一种 unityWebRequest var unityWebRequest = UnityWebRequest.GetAudioClip(s, 0);yield return unityWebRe ...
- Linux之Ubuntu20.04安装Java JDK8的两种方式
Linux之Ubuntu20.04远程安装Java JDK8的两种方式 安装openjdk8 更新软件包列表: sudo apt-get update 安装openjdk-8-jdk: sudo ap ...
最新文章
- c语言int t格式,如何在C中打印int64_t类型
- 安装配置Statspack
- 用WINRAR巧妙分割大压缩包
- docker for windows could not read CA certificate【转】
- Android Telephony分析(五) ---- TelephonyRegistry详解
- C经典之14-双向链表存储1-10---ShinePans
- vs2019功能介绍_MFC界面库BCGControlBar v30.0新功能详解:支持VS 2019
- 世界上迄今为止最安全的加密算法
- RMQ问题-ST表倍增处理静态区间最值
- java 转json_Java转JSON串的几种方式
- Qt4_使用SAX读取XML
- python决策评价模型_Python大规模建模的特征值选择和性能评估方法详解
- SHELL判断文件是否包含某个字串
- 前端——HTML百度首页制作
- linux内核源码分析之虚拟内存映射
- python自动生成文章原创_Python文章原创度检测脚本【亲测有效】
- Oracle 官方文档在线查看Oracle函数
- 2022年Unity 面试题 |五萬字 二佰道| Unity面试题大全,面试题总结【全网最全,收藏一篇足够面试】
- LINUX rhcsa小练习题(创建文件/目录,移动/复制文件,重定向/追加重定向,创建别名)
- linux bt 命令行,在Linux终端下进行BT下载