java项目中使用ffmpeg剪辑部分视频
在项目中,有个需求是分享视频链接地址到微信、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 这个命令,文章如下
java项目中使用ffmpeg剪辑部分视频的更多相关文章
- Java Web 中使用ffmpeg实现视频转码、视频截图
Java Web 中使用ffmpeg实现视频转码.视频截图 转载自:[ http://www.cnblogs.com/dennisit/archive/2013/02/16/2913287.html ...
- 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. ...
- java项目中build path的设置
右键点击项目新建文件libs 添加jtds jar包引用本地动态链接库(dll)的设置方法 配置LibraryJRE的添加和更换 Java项目中build path的设置总结,包括JRE的添加和更 ...
- 在Java项目中整合Scala
Scala是一个运行在Java JVM上的面向对象的语言.它支持函数编程,在语法上比Java更加灵活,同时通过Akka库,Scala支持强大的基于Actor的多线程编程.具有这些优势,使得我最近很想在 ...
- XML在JAVA项目中的作用
java项目中,xml文件一般都是用来存储一些配置信息 一般的编程, 多数用来存储配置信息 . 拿JDBC来说,可以把数据库连接字符串写到xml,如果要修改数据源,只需要改xml就可以了,没必要再去重 ...
- ckeditor编辑器在java项目中配置
一.基本使用: 1.所需文件架包 A. Ckeditor基本文件包,比如:ckeditor_3.6.2.zip 下载地址:http://ckeditor.com/download 2.配置使用 A.将 ...
- redis在java项目中的使用
在上一篇文章中已经讲了redis的spring配置,这篇将会描述redis在java项目中的使用. redis存储形式都是key-value(键值对),按照存储的内容分为两种,一种是存简单数据,即数字 ...
- Redis学习笔记之二 :在Java项目中使用Redis
成功配置redis之后,便来学习使用redis.首先了解下redis的数据类型. Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set( ...
- SuperDiamond在JAVA项目中的三种应用方法实践总结
SuperDiamond在JAVA项目中的三种应用方法实践总结 1.直接读取如下: @Test public static void test_simple(){ PropertiesConfigur ...
随机推荐
- 下载文件时-修改文件名字 Redis在Windows中安装方法 SVN安装和使用(简单版) WinForm-SQL查询避免UI卡死 Asp.Net MVC Https设置
下载文件时-修改文件名字 1后台代码 /// <summary> /// 文件下载2 /// </summary> /// <param name="Fil ...
- java 获取当前方法的被调用信息(被那个方法那个类那一行调用)
public void testMethod(){ Test1 t1 = new Test1(); t1.my(); } public static void main(String[] args) ...
- Mysql 存储过程初识
存储过程 认识 在一些编程语言中, 如pascal, 有一个概念叫"过程" procedure, 和"函数" function, 如VB中的sub. Java, ...
- .Net Core 2.2 发布IIS遇到的那些坑
这两天在研究.Net Core 发布iis总结一下. 我主要是参照官方文档: https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/ ...
- aws centos系统磁盘扩容
growpart /dev/xvda 1 展开修改后的分区(注意是:空格 1,而非打错了) # ext3/4 1.resize2fs /dev/xvda1 将分区调整为新的卷容量 # xfs分区 2 ...
- springboot+jndi+tomcat配置多数据源
1.在application.properties中,添加jndi配置,如下图 2.新建dataSourceConfig类 3.dataSourceConfig类详细代码,这里只贴出其中一个,多个数据 ...
- C语言几个术语: 数据对象,左值,右值
1. 数据对象 赋值表达式语句的目的是把值存储到内存位置上. 用于存储值的数据存储区域统称为数据对象. 2. 左值 左值是C语言的术语, 用于标识特定数据对象的名称或表达式. 对象指的是实际的数据存储 ...
- vue.js生成横向拓扑图
1.前端代码 <link href="https://magicbox.bk.tencent.com/static_api/v3/assets/bootstrap-3.3.4/css/ ...
- 《TensorFlow2深度学习》学习笔记(一)Tensorflow基础
本系列笔记记录了学习TensorFlow2的过程,主要依据 https://github.com/dragen1860/Deep-Learning-with-TensorFlow-book 进行学习 ...
- 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 ...