package com.netsdk.module; import com.netsdk.lib.NativeString; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.Utils; import com.netsdk.lib.enumeration.ENUMERROR; import com.netsdk.lib.structure.NET_IN_PRE_UPLOAD_REMOTE_FILE; import com.netsdk.lib.structure.NET_OUT_PRE_UPLOAD_REMOTE_FILE; import com.netsdk.module.entity.DeliveryFileInfo; import com.netsdk.module.entity.FilePreUploadResult; import java.nio.charset.Charset; import java.util.Calendar; import java.util.Date; import java.util.List; import static com.netsdk.lib.NetSDKLib.MAX_DELIVERY_FILE_NUM; /** * @author 47081 * @version 1.0 * @description 操作文件的二次封装类 * @date 2020/9/14 */ public class FileModule extends BaseModule { public FileModule(NetSDKLib netSdkApi) { super(netSdkApi); } private FileModule() { this(NetSDKLib.NETSDK_INSTANCE); } /** * 检测文件是否可以上传 * * @param loginHandler 登录句柄 * @param srcPath 源文件路径 * @param destPath 上传到设备的路径 * @return null:预上传接口调用失败,FilePreUploadResult: canUpload:true,可以上传,false:不可上传,emType:不可上传的原因 */ public FilePreUploadResult canUpload(long loginHandler, String srcPath, String destPath) { NET_IN_PRE_UPLOAD_REMOTE_FILE inParam = new NET_IN_PRE_UPLOAD_REMOTE_FILE(); inParam.pszFileSrc = srcPath; inParam.pszFileDst = destPath; NET_OUT_PRE_UPLOAD_REMOTE_FILE outParam = new NET_OUT_PRE_UPLOAD_REMOTE_FILE(); boolean result = getNetsdkApi().CLIENT_PreUploadRemoteFile(new NetSDKLib.LLong(loginHandler), inParam, outParam, 5000); if (!result) { System.out.println("pre upload failed." + ENUMERROR.getErrorMessage()); return null; } return new FilePreUploadResult(outParam.bContinue2Upload, outParam.emType); } /** * 上传文件 * * @param srcPath 源文件路径,绝对路径 * @param destPath 上传到设备的目录 * @param fileName 上传后的文件的文件名 * @return */ public boolean uploadFile(long loginHandle, String srcPath, String destPath, String fileName) { NetSDKLib.NET_IN_UPLOAD_REMOTE_FILE uploadParam = new NetSDKLib.NET_IN_UPLOAD_REMOTE_FILE(); uploadParam.pszFileSrc = new NativeString(srcPath).getPointer(); if (destPath != null && !destPath.trim().equals("")) { uploadParam.pszFolderDst = new NativeString(destPath).getPointer(); } uploadParam.pszFileDst = new NativeString(fileName).getPointer(); //文件分包大小(字节): 0表示不分包 //大文件要分包,特别是dav视频,建议512kb uploadParam.nPacketLen = 1024 * 512; NetSDKLib.NET_OUT_UPLOAD_REMOTE_FILE uploadOutParam = new NetSDKLib.NET_OUT_UPLOAD_REMOTE_FILE(); uploadParam.write(); boolean isUpload = getNetsdkApi().CLIENT_UploadRemoteFile(new NetSDKLib.LLong(loginHandle), uploadParam, uploadOutParam, 3000); uploadParam.read(); if (!isUpload) { /** * 如果上传失败,请检查上传的文件大小,上传路径,上传格式 */ System.out.println(ENUMERROR.getErrorMessage()); return false; } return true; } /** * 向视频输出口投放视频和图片文件 * * @param loginHandle 登录句柄 * @param port 要投放文件的端口 * @param emPlayMode 播放类型 0:未知,1:播放一次,2:循环播放 * @param startTime 开始时间 * @param endTime 结束时间,当emPlayMode为2时有效 * @param infos 文件信息列表 * @return 是否投放成功 */ public boolean deliveryFileToDevice(long loginHandle, int port, int emPlayMode, Date startTime, Date endTime, List infos) { NetSDKLib.NET_CTRL_DELIVERY_FILE stuInfo = new NetSDKLib.NET_CTRL_DELIVERY_FILE(); stuInfo.nPort = port; stuInfo.emPlayMode = emPlayMode; if (startTime == null) { System.out.println("startTime is null"); return false; } if (infos.size() > MAX_DELIVERY_FILE_NUM) { System.out.println("out of delivery file num"); return false; } //时间赋值 Calendar calendar = Calendar.getInstance(); calendar.setTime(startTime); stuInfo.stuStartPlayTime.dwYear = calendar.get(Calendar.YEAR); stuInfo.stuStartPlayTime.dwMonth = calendar.get(Calendar.MONTH); stuInfo.stuStartPlayTime.dwDay = calendar.get(Calendar.DATE); //24小时制 stuInfo.stuStartPlayTime.dwHour = calendar.get(Calendar.HOUR_OF_DAY); stuInfo.stuStartPlayTime.dwMinute = calendar.get(Calendar.MINUTE); stuInfo.stuStartPlayTime.dwSecond = calendar.get(Calendar.SECOND); if (emPlayMode == 2) { calendar.setTime(endTime); stuInfo.stuStopPlayTime.dwYear = calendar.get(Calendar.YEAR); stuInfo.stuStopPlayTime.dwMonth = calendar.get(Calendar.MONTH); stuInfo.stuStopPlayTime.dwDay = calendar.get(Calendar.DATE); //24小时制 stuInfo.stuStopPlayTime.dwHour = calendar.get(Calendar.HOUR_OF_DAY); stuInfo.stuStopPlayTime.dwMinute = calendar.get(Calendar.MINUTE); stuInfo.stuStopPlayTime.dwSecond = calendar.get(Calendar.SECOND); } //文件赋值 stuInfo.nFileCount = infos.size(); DeliveryFileInfo info = null; for (int i = 0; i < infos.size(); i++) { info = infos.get(i); stuInfo.stuFileInfo[i].emFileType = info.getEmFileType().getType(); stuInfo.stuFileInfo[i].nImageSustain = info.getnImageSustain(); System.arraycopy(info.getSzFileUrl().getBytes(Charset.forName(Utils.getPlatformEncode())), 0, stuInfo.stuFileInfo[i].szFileURL, 0, info.getSzFileUrl().getBytes(Charset.forName(Utils.getPlatformEncode())).length); } stuInfo.write(); int emType = NetSDKLib.CtrlType.CTRLTYPE_CTRL_DELIVERY_FILE; boolean bRet = getNetsdkApi().CLIENT_ControlDevice(new NetSDKLib.LLong(loginHandle), emType, stuInfo.getPointer(), 3000); stuInfo.read(); if (!bRet) { System.out.println("deliveryFile failed." + ENUMERROR.getErrorMessage()); } System.out.println("deliveryFile success"); return bRet; } }