在项目中,有个需求是分享视频链接地址到微信、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. 下载文件时-修改文件名字 Redis在Windows中安装方法 SVN安装和使用(简单版) WinForm-SQL查询避免UI卡死 Asp.Net MVC Https设置

    下载文件时-修改文件名字   1后台代码 /// <summary> /// 文件下载2 /// </summary> /// <param name="Fil ...

  2. java 获取当前方法的被调用信息(被那个方法那个类那一行调用)

    public void testMethod(){ Test1 t1 = new Test1(); t1.my(); } public static void main(String[] args) ...

  3. Mysql 存储过程初识

    存储过程 认识 在一些编程语言中, 如pascal, 有一个概念叫"过程" procedure, 和"函数" function, 如VB中的sub. Java, ...

  4. .Net Core 2.2 发布IIS遇到的那些坑

    这两天在研究.Net Core 发布iis总结一下. 我主要是参照官方文档: https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/ ...

  5. aws centos系统磁盘扩容

    growpart /dev/xvda 1  展开修改后的分区(注意是:空格 1,而非打错了) # ext3/4 1.resize2fs /dev/xvda1 将分区调整为新的卷容量 # xfs分区 2 ...

  6. springboot+jndi+tomcat配置多数据源

    1.在application.properties中,添加jndi配置,如下图 2.新建dataSourceConfig类 3.dataSourceConfig类详细代码,这里只贴出其中一个,多个数据 ...

  7. C语言几个术语: 数据对象,左值,右值

    1. 数据对象 赋值表达式语句的目的是把值存储到内存位置上. 用于存储值的数据存储区域统称为数据对象. 2. 左值 左值是C语言的术语, 用于标识特定数据对象的名称或表达式. 对象指的是实际的数据存储 ...

  8. vue.js生成横向拓扑图

    1.前端代码 <link href="https://magicbox.bk.tencent.com/static_api/v3/assets/bootstrap-3.3.4/css/ ...

  9. 《TensorFlow2深度学习》学习笔记(一)Tensorflow基础

    本系列笔记记录了学习TensorFlow2的过程,主要依据 https://github.com/dragen1860/Deep-Learning-with-TensorFlow-book 进行学习 ...

  10. Bean property ‘mapperHelper’ is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

    spring boot 报错: Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property ...