在项目中,有个需求是分享视频链接地址到微信、qq或者朋友圈,只能试看两分钟,本想着通过h5界面就能控制实现效果,代码如下,但是前端终究不是安全的,其次监听事件,如果拉播放进度条,中途停顿多次,就会出现多次弹框,对用户体验终究不是好的,因此,后面想着后端截取原视频部分视频,然后让用户播放,只要监听用户播放结束,弹框显示即可。

var audio = document.getElementById("chqrpzkgzjulberajk"); //获取视频元素id
audio.loop = false;//视频不循环播放
var time = 0;//初始化播放时间
audio.addEventListener('timeupdate', timeupdate);//设置监听事件

function timeupdate(){
//因为当前的格式是带毫秒的float类型的如:12.231233,所以把他转成String了便于后面分割取秒
var time = audio.currentTime+"";
console.log('当前播放时长'+time);
if(time > 60){
if(audio.paused){
alert("观看完整视频,请下载APP!");
audio.pause();
}
}
}
查了很多资料,眼睛都要瞎了,但是没一个微博写的很详细,作为初学者基本上都不可能操作完成,经过我一个礼拜的努力,有两种实施方案。

1.通过截取视频流的方式:读取流的时候只读取一部分,但是这样就会有个问题,视频时长还是原视频时长,其次有个重要的问题,有些视频截取之后播放不了,破坏了原本的视频流。

2.通过ffmpeg工具进行截取,功能还是很强大,具体可以百度下。

ffmpeg下载(也可以去官网上下载):
windows:链接:https://pan.baidu.com/s/1EAQDkEUmh5WnaF9_qKJgcA  提取码:3v31

linux:链接:https://pan.baidu.com/s/16c7krsFOP29lj6wOMxL5mQ 提取码:x1y3

Windows 下使用代码:
/**
* 视频剪辑
* @param file 源文件
* @param outFilePath 输出文件路径
* @return
* @throws Exception
*/
public static String getPartVideoForWindows(File file ,String outFilePath){
String filePaths = PathUtil.getFilePath(outFilePath);//获取输出视频绝对地址
String fileName = DateUtil.getRanddom() + ".mp4";//生成输出视频文件格式,也可以用源文件的格式
String fileFinalPath = filePaths + fileName;//完整的输出视频绝对路径
// 创建一个List集合来保存转换视频文件为flv格式的命令
List<String> convert = new ArrayList<String>();
convert.add(PathUtil.getFilePath("/tools/ffmpeg.exe")); // 添加转换工具路径
convert.add("-ss");//起始时间
convert.add("00:00:10.0");
convert.add("-i"); // 添加参数"-i",该参数指定要转换的文件
convert.add(file.getAbsolutePath()); // 添加要转换格式的视频文件的路径
convert.add("-to");//结束时间
convert.add("00:02:00");//
convert.add("-c");//操作方式
convert.add("copy");
convert.add(fileFinalPath);
convert.add("-y"); // 添加参数"-y",该参数指定将覆盖已存在的文件

ProcessBuilder builder = new ProcessBuilder();
try {
builder.command(convert);
builder.start();
return outFilePath+fileName;
} catch (Exception e) {
System.out.println(e);
return null ;
}
}
linux 下使用代码:
/**
* 执行linux 系统的ffpemg
* @param file 视频源文件
* @param outFilePath 输出视频地址
*/
public static String linuxCommend(File file ,String outFilePath) {
String filePaths = PathUtil.getFilePath(outFilePath);//获取输出视频绝对地址
String fileName = DateUtil.getRanddom() + ".mp4";//生成输出视频文件格式,也可以用源文件的格式
String fileFinalPath = filePaths + fileName;//完整的输出视频绝对路径
String command = "ffmpeg -ss 00:00:10.0 -i "+file.getAbsolutePath()+" -to 00:02:00 -c copy "+fileFinalPath+" -y";//剪辑命令
try {
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(command);
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null){
System.out.println(line);
}
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
return outFilePath+fileName;
} catch (IOException e) {
System.out.println(e.getMessage());
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
return null ;
}
但是linux 系统下,是使用不了ffmpeg.exe,必须要安装之后才能使用 ffmpeg 这个命令,文章如下

linux 系统下安装ffmpeg

使用ffmpeg进行简单的视频编辑命令

java项目中使用ffmpeg剪辑部分视频的更多相关文章

  1. Java Web 中使用ffmpeg实现视频转码、视频截图

    Java Web 中使用ffmpeg实现视频转码.视频截图 转载自:[ http://www.cnblogs.com/dennisit/archive/2013/02/16/2913287.html  ...

  2. eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错? java.lang.ClassNotFoundException: com.branchitech.app.startup.AppStartupContextListener java.lang.ClassN

    eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错?java. ...

  3. java项目中build path的设置

    右键点击项目新建文件libs 添加jtds  jar包引用本地动态链接库(dll)的设置方法 配置LibraryJRE的添加和更换  Java项目中build path的设置总结,包括JRE的添加和更 ...

  4. 在Java项目中整合Scala

    Scala是一个运行在Java JVM上的面向对象的语言.它支持函数编程,在语法上比Java更加灵活,同时通过Akka库,Scala支持强大的基于Actor的多线程编程.具有这些优势,使得我最近很想在 ...

  5. XML在JAVA项目中的作用

    java项目中,xml文件一般都是用来存储一些配置信息 一般的编程, 多数用来存储配置信息 . 拿JDBC来说,可以把数据库连接字符串写到xml,如果要修改数据源,只需要改xml就可以了,没必要再去重 ...

  6. ckeditor编辑器在java项目中配置

    一.基本使用: 1.所需文件架包 A. Ckeditor基本文件包,比如:ckeditor_3.6.2.zip 下载地址:http://ckeditor.com/download 2.配置使用 A.将 ...

  7. redis在java项目中的使用

    在上一篇文章中已经讲了redis的spring配置,这篇将会描述redis在java项目中的使用. redis存储形式都是key-value(键值对),按照存储的内容分为两种,一种是存简单数据,即数字 ...

  8. Redis学习笔记之二 :在Java项目中使用Redis

    成功配置redis之后,便来学习使用redis.首先了解下redis的数据类型. Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set( ...

  9. SuperDiamond在JAVA项目中的三种应用方法实践总结

    SuperDiamond在JAVA项目中的三种应用方法实践总结 1.直接读取如下: @Test public static void test_simple(){ PropertiesConfigur ...

随机推荐

  1. python 常用的标准库

    glob模块   提供了一个函数,用于匹配符合要求的文件: import glob list=glob.glob("*.py") #匹配当前目录下的所有匹配的文件名(包括后缀),以 ...

  2. python笔记--------二

    tolist()方法: 列表可通过array()转换为数组或mat()转为矩阵 而tolist()可把数组对象或矩阵对象转为列表 数组对象: array([[1, 2, 3], [1, 2, 3]]) ...

  3. Python 字符集

    什么是字符? 1.在Python中,字符串中的内容都是字符. 2.什么是字符编码(encode)和字符集(charset)? 计算机只能识别数值,而字符不能识别,为了让计算机能处理字符,必须将字符和数 ...

  4. 在visual studio中找到属性管理器

    方法一: 我们可以在新建的项目中通过视图-->其他窗口-->属性管理器来找到. 这样就能找到属性管理器了. 感谢:https://blog.csdn.net/qq_37939434/art ...

  5. 逆向破解之160个CrackMe —— 021

    CrackMe —— 021 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...

  6. 编程题:SaturdayNightStay

    "输入2019年的一个时间段,开始时间代表出发,结束时间代表在那一天返回,判断在该时间段内,如果旅行有多少个子时间段可以在周六晚上休息" * 周六晚上休息,即子时间段必须包含周六, ...

  7. jmeter压测学习2-linux运行jmeter环境

    前言 使用jmeter做压测的时候,在windows上不太稳定,所有一直在linux服务器上使用jmeter做压力测试. 本篇记录下linux上搭建jmeter环境,以及运行jmeter脚本,查看报告 ...

  8. 搭建unity客户端

    1.新建个unity的项目ChatClient 2.在unity的Main Camera下挂载个脚本PhotonServerEngine做为与服务器端通信的脚本 3.在PhotonServerEngi ...

  9. SpringBoot 过滤器, 拦截器, 监听器 对比及使用场景

    1. 过滤器 (实现 javax.servlet.Filter 接口) ① 过滤器是在web应用启动的时候初始化一次, 在web应用停止的时候销毁. ② 可以对请求的URL进行过滤, 对敏感词过滤, ...

  10. multipart/form-data与数据封装

    方案一: 将所有数据先格式化(编码)成可读字符串,然后转化成bytes的形式. 方案二: 将每一个部分分别转化成(或者直接使用)bytes的形式,然后串联到一起. http://www.jianshu ...