需求如题,综合考虑之后我选择python去做视频处理,最终结果也让我非常满意。

我是windows 环境,安装的python3.8和moviepy模块

第一步:安装python3.8

第二步:修改python模块下载源,在Roaming下直接新建pip文件夹,新建pip.ini文件

我的路径是C:\Users\用户名\AppData\Roaming\pip\pip.ini 可进行参考,如下:

[global]
timeout = 6000
index-url = https://mirrors.aliyun.com/pypi/simple
[install]
use-mirrors = true
mirros = https://pypi.mirrors.ustc.edu.cn/simple

第三步:下载moviepy模块

cmd 执行 pip install moviepy

第四步:编写python 剪切拼接视频的代码(123.mp4,456.mp4都是测试视频,自己找一个)

import moviepy
import sys
from moviepy.editor import * def main(a):
print(url) # 打印java 传来的参数 video = VideoFileClip("C:\\Users\\HG\\123.mp4").subclip(1,5)# 表示截取123.mp4的1-5秒
video1 = VideoFileClip("C:\\Users\\HG\\456.mp4").subclip(5,10)
video2 = concatenate_videoclips([video,video1])# 拼接两个剪切好的视频
result = CompositeVideoClip([video2])
result.to_videofile("video_1.mp4")# 输出到工作目录下 if __name__ == '__main__':
for i in range(0, len(sys.argv)):
url = sys.argv[i]# 按数组的方式取出java 传来的参数
main(url)# 执行打印方法

第五步:写java 调用python 脚本的代码,这个地方我了解了一下,有两种办法①引入jython包执行,便捷但不能传参,故舍弃。②用Runtime.getRuntime().exec() 执行,可传参。

保存python执行日志到文件的java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; /**
* @ClassName: StreamReaderThread
* @Description: 执行python 脚本打印执行日志
* @Date 2022/10/18 14:28
*/
public class StreamReaderThread implements Runnable {
private Logger logger = LoggerFactory.getLogger(StreamReaderThread.class); /*
* 输出流
*/
private InputStream inputStream;
/*
* 输出信息保存的文件名称
*/
private String logName; public StreamReaderThread(InputStream inputStream, String logName) {
this.inputStream = inputStream;
this.logName = logName;
} /**
* FileWriter将日志写入某文件
* 也可以用logger打印日志记录。
*/
@Override
public void run() {
BufferedReader in = null;
FileWriter fwriter = null;
try {
in = new BufferedReader(new InputStreamReader(this.inputStream, "gbk"));
fwriter = new FileWriter(logName, true);
String line = null;
while ((line = in.readLine()) != null) {
fwriter.write(line);
logger.info(line);
} } catch (IOException e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
fwriter.flush();
fwriter.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
} }
}
}

python 调用的java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.IOException;
import java.rmi.ServerException; /**
* @ClassName: PythonScriptUtils
* @Description: 调用python脚本
* @Date 2022/10/18 14:25
*/
public class PythonScriptUtils { private static Logger logger = LoggerFactory.getLogger(PythonScriptUtils.class); /**
* 执行python脚本
* @param path 文件地址:比如 D:\\xxx\\helloWorld.py
*/
public static Boolean exePython(String path) throws ServerException {
logger.info("======python start"); boolean success = false;
Process proc = null;
try {
// linux 用 "python3", windows 用python.exe的绝对路径("D:\\xxx\\Python\\Python39-32\\python.exe")
String a = "hello world";
String url = "www.baidu.com";
// String[] args1 = new String[]{"python3", path,a,url}; //linux 系统使用此代码进行执行
String[] args1 = new String[]{"C:\\Users\\HG\\AppData\\Local\\Programs\\Python\\Python38\\python.exe", path,a,url};
proc = Runtime.getRuntime().exec(args1); // 读写日志线程,分成两个也是为了避免线程堵塞之类的问题,具体原因网络上有很多说明
Thread thread1 = new Thread(new StreamReaderThread(proc.getInputStream(),"info.txt"));
Thread thread2 = new Thread(new StreamReaderThread(proc.getErrorStream(),"error.txt")); thread2.start();
//必须后执行,否则正确消息容易接收不到
thread1.start();
// result是结果,具体有哪些值,可以自己去查一下
int result = proc.waitFor();
success = result != -1; //等待后台线程读写完毕
Thread.sleep(1000); } catch (Exception e) {
e.printStackTrace();
throw new ServerException("python error:" + e); } finally {
try {
proc.getErrorStream().close();
proc.getInputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
proc.destroy();
logger.info("======python end");
}
return success;
} public static void main(String[] args) throws Exception {
exePython("C:\\Users\\HG\\test.py");
} }

  

java传递参数调用python完成剪切多个视频最终拼接成一个的更多相关文章

  1. java web应用调用python深度学习训练的模型

    之前参见了中国软件杯大赛,在大赛中用到了深度学习的相关算法,也训练了一些简单的模型.项目线上平台是用java编写的web应用程序,而深度学习使用的是python语言,这就涉及到了在java代码中调用p ...

  2. [DEBUG] java中用Runtime调用python 简单程序输出null

    今天需要在java中调用python脚本,首先考虑的是java自带的Runtime 在ubuntu和win10下分别测试,发现win10报错 java源代码 @Test public void tes ...

  3. Java程序中调用Python脚本的方法

    在程序开发中,有时候需要Java程序中调用相关Python脚本,以下内容记录了先关步骤和可能出现问题的解决办法. 1.在Eclipse中新建Maven工程: 2.pom.xml文件中添加如下依赖包之后 ...

  4. Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决

    问题描述: mac笔记本本身会自带几个python版本,比如python2.7版本,我没有改动mac默认的python版本,只是安装了python3.7版本. 使用Pycharm开发Python项目没 ...

  5. java 通过runtime 调用python 不显示python运行内容的bug

    先说下上面问题的原因,上面问题是因为python中用到了第三方的类库,你的电脑上没有那个类库,所以程序没有运行,在控制台也就看不到输出.只要导入那个类库就好... python 导入类库,可以单独下载 ...

  6. java中怎么调用python 脚本

    调用方法: import java.io.BufferedReader; import java.io.InputStreamReader; public class PythonInvoke { p ...

  7. C#传递参数调用exe程序

    今天公司让我把Winform程序里的一块单独成一个exe文件,从原程序中打开新的exe程序,这就涉及到参数的传递,故来记录下传递参数到exe程序的方式 第一种方式 首先在程序A中添加引用using S ...

  8. unity 如何在botton AddListen中传递参数调用函数

    使用Deleget方法包含该函数即可. levelItem.GetComponent<Toggle().onValueChanged.AddListener(SetSelectedLevel(l ...

  9. python 读hdf4文件,再转写成一个tif文件

    1.安装pyhdf包 (1)通过此链接查找并下载pyhdf包:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame(根据自己的系统及python版本选择 ...

  10. python中如何将两个list合并成一个list,不用for语句

    1, add 2, 用list的extend方法,L1.extend(L2),该方法将参数L2的全部元素添加到L1的尾部,例如: 3, 用切片(slice)操作,L1[len(L1):len(L1)] ...

随机推荐

  1. Mybatis Plus整合PageHelper分页的实现示例

    1.依赖引入 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pag ...

  2. Linux基础之用户、组和权限管理

    用户类别分为:普通用户.系统用户.登陆用户 用户标识:UserID, UID 是16bits二进制数字: 0-65535管理员:0普通用户:0-65536系统用户:1-499(CentOS6)1-99 ...

  3. 微信小程序自定义导航栏机型适配

    自定义微信小程序头部导航栏,有几种方式 方式一 { "navigationStyle": "custom" // 将navigationStyle从默认defa ...

  4. K8S发布应用步骤详解

    前言 首先以SpringBoot应用为例介绍一下k8s的发布步骤. 1.从代码仓库下载代码,比如GitLab: 2.接着是进行打包,比如使用Maven: 3.编写Dockerfile文件,把步骤2产生 ...

  5. LG P4980【模板】Pólya 定理

    \(\text{Solution}\) \[ans = \frac{1}{n}\sum_{i=1}^n n^{(i,n)} = \frac{1}{n}\sum_{d|n}n^d\varphi(\fra ...

  6. CentOS7加入AD域(winbind)

    作者:独笔孤行 官网:​​ ​http://anyamaze.com​​ 公众号:云实战 前言 AD域(Active Directory)是Windows服务器的活动目录,在目录中可以收录公司的电脑账 ...

  7. CCRD_TOC_2008年第4期

    中信国健临床通讯 2008年第4期 目 录   类风湿关节炎 1.        大型系统评价分析:生物制剂与传统DMARD联用是MTX难治性RA患者的最佳治疗策略 Donahue KE, et al ...

  8. OpenLayers地图标注及弹窗实现

    1. 引言 地图标注是在地图中进行文字或图标的标注,从而显示对应的信息 本文基于OpenLayers实现地图上图文的标注与弹窗显示 OpenLayers官网:OpenLayers - Welcome ...

  9. Chai3D之触觉设备

    推荐:将 NSDT场景编辑器 加入你的3D开发工具链 介绍   触觉设备是一种双向仪表/致动的人机界面,由人类操作员用于与计算机模拟虚拟环境进行主动交互.触觉设备可以是鼠标.方向盘.指垫.机器人手柄. ...

  10. 免费ASP空间

    free免费asp空间的申请方法: free免费asp空间的ftp使用方法: sise.host3v.vip/1