需求如题,综合考虑之后我选择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. 对象的反序列化流_ObjectInputStream类

    对象的反序列化流_ObjectInputStream类 ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象. 构造方法 public ...

  2. 完整工作流整合方案,自定义配置,Java+Vue+Activiti@附配套文档

    前言 activiti工作流引擎项目,企业erp.oa.hr.crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求. 一.项目形式 springboot+v ...

  3. .NET周报 【2月第2期 2023-02-11】

    国内文章 SQLSERVER的truncate和delete有区别吗? https://mp.weixin.qq.com/s/wTIeW8rjj3cRzoaQcg2sOw 在面试中我相信有很多朋友会被 ...

  4. 安卓逆向.5 xposed 替换方法-(实战贪吃蛇)

    代码剖析 调用成功方法 获取类 方法写入 实战例子(贪吃蛇)

  5. 郁金香-了解MFC信息机制

    控件的事件 窗口的信息

  6. vue-cli框架的下载以及框架目录介绍

    目录 vue-cli框架的下载以及框架目录介绍 一.vue-cli创建项目 二.Vue项目目录介绍 vue-cli框架的下载以及框架目录介绍 一.vue-cli创建项目 在终端下载先下载cnpm # ...

  7. TCP/IP协议(8): ICMP(Internet Control Message Protocol) 协议 ——诊断和控制 IP 协议层

    TCP/IP协议(8): ICMP(Internet Control Message Protocol) 协议 --诊断和控制 IP 协议层 关于网际控制报文协议(Internet Control M ...

  8. 2020.11.30【NOIP提高A组】模拟

    总结与反思 很不幸,估分 \(170\),可惜 \(T2\) 暴力 \(50pts\) 全掉了 \(T1\) 结论题,如果想到了,\(O(n)\) 过,只有十几行代码 感觉不好想,不过还是 \(A\) ...

  9. TNF拮抗剂的结构、功能与结核感染_Wallis2008

    中信国健临床通讯 2009年第2期 TNF拮抗剂的结构.功能与结核感染 Robert S. Wallis. THE LANCET Infectious Diseases. 2008; 8:601–61 ...

  10. vue data为什么是函数

    vue data是函数的原因: 1.防止data复用: 2.data独立性: 3.作用域: 4.js的特性. 总结来说,如果data是一个函数的话,这样每复用一次组件,就会返回一份新的data(类似于 ...