根据用户ID和视频名称VideoName,在服务器生成一个用于保存原视频、中间结果和最终结果的目录结构。
——EasyCut
——ID
——ID_VideoName
——Original_Video #存储原视频
——SceneSeg_Video #存储场景划分结果
——Key_Frame #存储视频摘要结果
——SceneFeature #存储视频摘要后视频的场景特征
——SceneSimilar #存储相似场景的视频聚类结果
——Resources #人脸检测结果
——video
——result
——gif
——featureMean
——featureDB
——faceS
代码实现:
create_files.py:
import os
def create_dir(ID,VideoName):
filename=ID+'_'+VideoName
path='/opt/data/private/xuyunyang/EasyCut/'
path0=path+ID+'/'+filename
path1=path0+'/Original_Video'
path2=path0+'/SceneSeg_Video'
path3=path0+'/Resources'
path4=path0+'/Key_Frame'
path41=path3+'/video'
path42=path3+'/result'
path43=path3+'/gif'
path44=path3+'/featureDB'
path45=path3+'/featureMean'
path46=path3+'/faceS'
path47=path3+'/ScenePhoto'
path5=path0+'/SceneFeature'
path6=path0+'/SceneSimilar'
isExists=os.path.exists(path0)
if not isExists:
os.makedirs(path0)
os.makedirs(path1)
os.makedirs(path2)
os.makedirs(path3)
os.makedirs(path4)
os.makedirs(path41)
os.makedirs(path42)
os.makedirs(path43)
os.makedirs(path44)
os.makedirs(path45)
os.makedirs(path46)
os.makedirs(path47)
os.makedirs(path5)
os.makedirs(path6)
if __name__ == '__main__':
parser = argparse.ArgumentParser("Create Files")
parser.add_argument('ID')
parser.add_argument('VideoName')
args = parser.parse_args()
create_dir(args.ID,args.VideoName)
二、SSH-2实现java连接远程服务器并进行视频传输及命令执行
1、SSH:
Secure Shell Protocol,安全外壳协议,是专门为了远程登录会话和其他网络服务提供的安全性协议,是一种非对称加密协议,使用SSH协议可以有效的防止远程连接会话的时候出现信息泄密,在数据传输的时候SSH会先对联机的数据包通过加密技术进行加密处理,加密后在进行数据的传输,确保了传输中的安全性,SSH服务主要提供两个服务功能:一个是远程联机的SSH服务,一个是借助SSH协议来传输数据的SFTP服务。
2、SSH原理:① 服务端开启ssh服务监听22端口
② 客户端发送联机请求(携带IP和端口)
③ 客户端服务端进行联机加密认证
④ 认证通过联机成功
(1) 基于密码口令的认证:
只要知道服务器的SSH连接账号和密码(当然也要知道服务器的IP和端口(默认22)),就可以通过客户端远程登录到主机了,所以的传输过程都是加密的。
(2) 基于秘钥的安全认证:
① 运行SSH服务,生成密钥对
② 客户端发送公钥到服务端(通过ssh-copy-id或者其他的方式)
③ 客户端发送连接请求
④ 服务端进行对密钥的验证
⑤ 验证成功服务端将用公钥加密质询,发送给客户端
⑥ 客户端用自己的私钥解密质询
⑦ 客户端将解密后的质询发送给服务端
⑧ 服务端验证质询
⑨ 验证通过,建立连接
需要导入3个jar包:
注:使用用户名密码方式远程登录linux服务器
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.log4j.Logger;
import org.apache.commons.lang.StringUtils;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
public class Connection_to_Sever {
private static final Logger logger = Logger.getLogger(Connection_to_Sever.class);
private static String DEFAULTCHARTSET = "UTF-8";
private static Connection conn;
//用户名密码方式 远程登录linux服务器
public static Boolean login(RemoteConnect remoteConnect) {
boolean flag = false;
try {
conn = new Connection(remoteConnect.getIp(),remoteConnect.getPort());
conn.connect();// 连接
flag = conn.authenticateWithPassword(remoteConnect.getUserName(), remoteConnect.getPassword());// 认证
if (flag) {
logger.info("认证成功!");
} else {
logger.info("认证失败!");
conn.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return flag;
}
//远程执行shell脚本或者命令,命令执行成功后返回的结果值,如果命令执行失败,返回空字符串,不是null
public static String executeSuccess(String cmd){
String result = "";
//int ret=-1;
try {
Session session = conn.openSession();// 打开一个会话
session.execCommand(cmd);// 执行命令
result = processStdout(session.getStdout(), DEFAULTCHARTSET);
//ret = session.getExitStatus();
conn.close();
session.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
//解析脚本执行的返回结果
public static String processStdout(InputStream in, String charset){
InputStream stdout = new StreamGobbler(in);
StringBuffer buffer = new StringBuffer();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));
String line = null;
while ((line = br.readLine()) != null) {
buffer.append(line + "n");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return buffer.toString();
}
//通过用户名和密码关联linux服务器
public static boolean connectLinux(String ip,int port,String userName,String password,String commandStr) {
logger.info("ConnectLinuxCommand scpGet===" + "ip:" + ip +" port:"+port+ " userName:" + userName + " commandStr:"
+ commandStr);
String returnStr = "";
boolean result = true;
RemoteConnect remoteConnect = new RemoteConnect();
remoteConnect.setIp(ip);
remoteConnect.setPort(port);
remoteConnect.setUserName(userName);
remoteConnect.setPassword(password);
try {
if (login(remoteConnect)) {
returnStr = executeSuccess(commandStr);
System.out.println(result);
}
} catch (Exception e) {
e.printStackTrace();
}
if (StringUtils.isBlank(returnStr)) {
result = false;
}
return result;
}
//从其他服务器获取文件到本服务器指定目录
public static void scpGet(String ip,int port, String userName, String password, String remoteFile, String localDir)
throws IOException {
logger.info("ConnectLinuxCommand scpGet===" + "ip:" + ip +" port:"+port+ " userName:" + userName + " remoteFile:"
+ remoteFile + " localDir:" + localDir);
RemoteConnect remoteConnect = new RemoteConnect();
remoteConnect.setIp(ip);
remoteConnect.setPort(port);
remoteConnect.setUserName(userName);
remoteConnect.setPassword(password);
if (login(remoteConnect)) {
SCPClient client = new SCPClient(conn);
client.get(remoteFile, localDir);
conn.close();
}
}
//将文件复制到其他计算机中
public static void scpPut(String ip,int port, String userName, String password, String localFile, String remoteDir)
throws IOException {
logger.info("ConnectLinuxCommand scpPut===" + "ip:" + ip +ip +" port:"+port+ " userName:" + userName + " localFile:"
+ localFile + " remoteDir:" + remoteDir);
RemoteConnect remoteConnect = new RemoteConnect();
remoteConnect.setIp(ip);
remoteConnect.setPort(port);
remoteConnect.setUserName(userName);
remoteConnect.setPassword(password);
if (login(remoteConnect)) {
SCPClient client = new SCPClient(conn);
client.put(localFile, remoteDir);
conn.close();
}
}
}
public class RemoteConnect {
private String ip;
private int port;
private String userName;
private String password;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
定义一些操作的函数并进行测试,四个操作:
1、创建目录结构,执行服务器命令python create_files.py
2、在faceS下建立一个以照片名为文件名的文件夹,上传人脸照片到该文件夹下,用于第三阶段人脸检测算法
3、上传本地文件(视频)到服务器
4、下载服务器的文件到本地(返回给用户)
public class FileOperate {
//创建目录结构,执行服务器命令python create_files.py
public static void createDir(String ID,String VideoName){
String commandStr="cd ../opt/data/private/xuyunyang/2022419/SceneSeg/lgss/;python create_files.py "+ID+" "+VideoName;
Boolean result=Connection_to_Sever.connectLinux("222.206.4.160",25935,"root","shixun123",commandStr);
}
//在faceS下建立一个以照片名为文件名的文件夹,上传照片到该文件夹下
public static void file_to_faces(String local_dir,String ID,String VideoName,String picture_name){
try {
String commandStr="cd ../opt/data/private/xuyunyang/EasyCut/"+ID+"/"+ID+"_"+VideoName+"/Resources/faceS/;mkdir "+picture_name;
Boolean result=Connection_to_Sever.connectLinux("222.206.4.160",25935,"root","shixun123",commandStr);
Connection_to_Sever.scpPut("222.206.4.160",25935,"root","shixun123", local_dir,"../opt/data/private/xuyunyang/EasyCut/"+ID+"/"+ID+"_"+VideoName+"/Resources/faceS/"+picture_name);
} catch (Exception e) {
e.printStackTrace();
}
}
//上传照片到ScenePhoto
public static void file_to_scenePhoto(String local_dir,String ID,String VideoName){
try {
String commandStr="cd ../opt/data/private/xuyunyang/EasyCut/"+ID+"/"+ID+"_"+VideoName+"/Resources/ScenePhoto/";
Boolean result=Connection_to_Sever.connectLinux("222.206.4.160",25935,"root","shixun123",commandStr);
Connection_to_Sever.scpPut("222.206.4.160",25935,"root","shixun123", local_dir,"../opt/data/private/xuyunyang/EasyCut/"+ID+"/"+ID+"_"+VideoName+"/Resources/ScenePhoto/");
} catch (Exception e) {
e.printStackTrace();
}
}
//上传本地文件到服务器
public static void upload(String local_dir,String ID,String VideoName){
try {
Connection_to_Sever.scpPut("222.206.4.160",25935,"root","shixun123", local_dir,"../opt/data/private/xuyunyang/EasyCut/"+ID+"/"+ID+"_"+VideoName+"/Original_Video");
} catch (Exception e) {
e.printStackTrace();
}
}
//下载服务器的文件到本地
public static void download(String remote_dir,String local_dir){
try {
Connection_to_Sever.scpGet("222.206.4.160",25935,"root","shixun123", remote_dir,local_dir);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String [] args){
upload("D:/study/项目实训/SceneSeg1/data/demo/video/S01E01.mp4","ID","VideoName");
download("../opt/data/private/xuyunyang/EasyCut/ID/ID_VideoName/Original_Video/S01E01.mp4","D:/study/项目实训/SceneSeg1/data/demo/video");
createDir("00","testvideo");
file_to_faces("D:/study/项目实训/SceneSeg1/data/demo/video/2.png","ID","VideoName","2");
file_to_scenePhoto("D:/study/项目实训/SceneSeg1/data/demo/video/2.png","ID","VideoName");
}
}
经过测试,四个操作都执行成功。



