1078-支持设备录像FTP方式下载

This commit is contained in:
panlinlin 2024-06-10 00:33:55 +08:00
parent a030c15c8f
commit f564ff0aba
6 changed files with 56 additions and 70 deletions

View File

@ -354,8 +354,10 @@ public class JT1078Controller {
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true) @Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@Parameter(name = "startTime", description = "开始时间,格式: yyyy-MM-dd HH:mm:ss", required = true) @Parameter(name = "startTime", description = "开始时间,格式: yyyy-MM-dd HH:mm:ss", required = true)
@Parameter(name = "endTime", description = "结束时间,格式: yyyy-MM-dd HH:mm:ss", required = true) @Parameter(name = "endTime", description = "结束时间,格式: yyyy-MM-dd HH:mm:ss", required = true)
@Parameter(name = "type", description = "0.音视频 1.音频 2.视频 3.视频或音视频", required = true) @Parameter(name = "alarmSign", description = "报警标志", required = true)
@Parameter(name = "rate", description = "0.所有码流 1.主码流 2.子码流(如果此通道只传输音频,此字段置0)", required = true) @Parameter(name = "mediaType", description = "音视频资源类型: 0.音视频 1.音频 2.视频 3.视频或音视频", required = true)
@Parameter(name = "streamType", description = "码流类型0.所有码流 1.主码流 2.子码流(如果此通道只传输音频,此字段置0)", required = true)
@Parameter(name = "storageType", description = "存储器类型", required = true)
@GetMapping("/playback/download") @GetMapping("/playback/download")
public DeferredResult<Void> recordDownload(HttpServletRequest request, public DeferredResult<Void> recordDownload(HttpServletRequest request,
HttpServletResponse response, HttpServletResponse response,
@ -363,21 +365,23 @@ public class JT1078Controller {
@Parameter(required = true) Integer channelId, @Parameter(required = true) Integer channelId,
@Parameter(required = true) String startTime, @Parameter(required = true) String startTime,
@Parameter(required = true) String endTime, @Parameter(required = true) String endTime,
@Parameter(required = false) Integer type, @Parameter(required = false) Integer alarmSign,
@Parameter(required = false) Integer rate @Parameter(required = false) Integer mediaType,
@Parameter(required = false) Integer streamType,
@Parameter(required = false) Integer storageType
) throws IOException { ) throws IOException {
logger.info("[1078-录像] 下载,设备:{} 通道: {} 开始时间: {} 结束时间: {} 音视频类型: {} 码流类型: {} ", logger.info("[1078-录像] 下载,设备:{} 通道: {} 开始时间: {} 结束时间: {}报警标志: {}, 音视频类型: {} 码流类型: {},存储器类型: {} ",
phoneNumber, channelId, startTime, endTime, type, rate); phoneNumber, channelId, startTime, endTime, alarmSign, mediaType, streamType, storageType);
if (!ftpSetting.getEnable()) { if (!ftpSetting.getEnable()) {
throw new ControllerException(ErrorCode.ERROR100.getCode(), "未启用ftp服务无法下载录像"); throw new ControllerException(ErrorCode.ERROR100.getCode(), "未启用ftp服务无法下载录像");
} }
DeferredResult<Void> result = new DeferredResult<>(); DeferredResult<Void> result = new DeferredResult<>(600000L);
ServletOutputStream outputStream = response.getOutputStream(); ServletOutputStream outputStream = response.getOutputStream();
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(phoneNumber + "_" + channelId + ".mp4", "UTF-8")); response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(phoneNumber + "_" + channelId + ".mp4", "UTF-8"));
response.setStatus(HttpServletResponse.SC_OK); response.setStatus(HttpServletResponse.SC_OK);
service.recordDownload(phoneNumber, channelId, startTime, endTime, type, rate, (code, msg, data) -> { service.recordDownload(phoneNumber, channelId, startTime, endTime, alarmSign, mediaType, streamType, storageType, (code, msg, data) -> {
String filePath = "ftp" + data; String filePath = "ftp" + data;
File file = new File(filePath); File file = new File(filePath);
if (!file.exists()) { if (!file.exists()) {

View File

@ -40,7 +40,7 @@ public class J1205 extends Re {
item.setStartTime(DateUtil.jt1078Toyyyy_MM_dd_HH_mm_ss(startTime)); item.setStartTime(DateUtil.jt1078Toyyyy_MM_dd_HH_mm_ss(startTime));
String endTime = ByteBufUtil.hexDump(buf.readSlice(6)); String endTime = ByteBufUtil.hexDump(buf.readSlice(6));
item.setEndTime(DateUtil.jt1078Toyyyy_MM_dd_HH_mm_ss(endTime)); item.setEndTime(DateUtil.jt1078Toyyyy_MM_dd_HH_mm_ss(endTime));
item.setWarn(buf.readLong()); item.setAlarmSign(buf.readLong());
item.setMediaType(buf.readUnsignedByte()); item.setMediaType(buf.readUnsignedByte());
item.setStreamType(buf.readUnsignedByte()); item.setStreamType(buf.readUnsignedByte());
item.setStorageType(buf.readUnsignedByte()); item.setStorageType(buf.readUnsignedByte());
@ -89,7 +89,7 @@ public class J1205 extends Re {
private String endTime; private String endTime;
// 报警标志 // 报警标志
private long warn; private long alarmSign;
// 音视频资源类型 // 音视频资源类型
private int mediaType; private int mediaType;
@ -127,12 +127,12 @@ public class J1205 extends Re {
this.endTime = endTime; this.endTime = endTime;
} }
public long getWarn() { public long getAlarmSign() {
return warn; return alarmSign;
} }
public void setWarn(long warn) { public void setAlarmSign(long alarmSign) {
this.warn = warn; this.alarmSign = alarmSign;
} }
public int getMediaType() { public int getMediaType() {
@ -173,7 +173,7 @@ public class J1205 extends Re {
"channelId=" + channelId + "channelId=" + channelId +
", startTime='" + startTime + '\'' + ", startTime='" + startTime + '\'' +
", endTime='" + endTime + '\'' + ", endTime='" + endTime + '\'' +
", warn=" + warn + ", warn=" + alarmSign +
", mediaType=" + mediaType + ", mediaType=" + mediaType +
", streamType=" + streamType + ", streamType=" + streamType +
", storageType=" + storageType + ", storageType=" + storageType +

View File

@ -34,7 +34,7 @@ public class J9206 extends Rs {
private String endTime; private String endTime;
// 报警标志 // 报警标志
private final int warnType = 0; private int alarmSign = 0;
// 音视频资源类型0.音视频 1.音频 2.视频 3.视频或音视频 // 音视频资源类型0.音视频 1.音频 2.视频 3.视频或音视频
private int mediaType; private int mediaType;
@ -71,7 +71,7 @@ public class J9206 extends Rs {
buffer.writeByte(channelId); buffer.writeByte(channelId);
buffer.writeBytes(ByteBufUtil.decodeHexDump(startTime)); buffer.writeBytes(ByteBufUtil.decodeHexDump(startTime));
buffer.writeBytes(ByteBufUtil.decodeHexDump(endTime)); buffer.writeBytes(ByteBufUtil.decodeHexDump(endTime));
buffer.writeLong(warnType); buffer.writeLong(alarmSign);
buffer.writeByte(mediaType); buffer.writeByte(mediaType);
buffer.writeByte(streamType); buffer.writeByte(streamType);
buffer.writeByte(storageType); buffer.writeByte(storageType);
@ -144,8 +144,8 @@ public class J9206 extends Rs {
this.endTime = endTime; this.endTime = endTime;
} }
public int getWarnType() { public int getAlarmSign() {
return warnType; return alarmSign;
} }
public int getMediaType() { public int getMediaType() {
@ -180,6 +180,10 @@ public class J9206 extends Rs {
this.taskConditions = taskConditions; this.taskConditions = taskConditions;
} }
public void setAlarmSign(int alarmSign) {
this.alarmSign = alarmSign;
}
@Override @Override
public String toString() { public String toString() {
return "J9206{" + return "J9206{" +
@ -191,7 +195,7 @@ public class J9206 extends Rs {
", channelId=" + channelId + ", channelId=" + channelId +
", startTime='" + startTime + '\'' + ", startTime='" + startTime + '\'' +
", endTime='" + endTime + '\'' + ", endTime='" + endTime + '\'' +
", warnType=" + warnType + ", warnType=" + alarmSign +
", mediaType=" + mediaType + ", mediaType=" + mediaType +
", streamType=" + streamType + ", streamType=" + streamType +
", storageType=" + storageType + ", storageType=" + storageType +

View File

@ -118,7 +118,7 @@ public interface Ijt1078Service {
void playbackControl(String phoneNumber, Integer channelId, Integer command, Integer playbackSpeed, String time); void playbackControl(String phoneNumber, Integer channelId, Integer command, Integer playbackSpeed, String time);
void recordDownload(String phoneNumber, Integer channelId, String startTime, String endTime, Integer type, Integer rate, GeneralCallback<String> fileCallback); void recordDownload(String phoneNumber, Integer channelId, String startTime, String endTime, Integer alarmSign, Integer mediaType, Integer streamType, Integer storageType, GeneralCallback<String> fileCallback);
PageInfo<JTChannel> getChannelList(int page, int count, int deviceId, String query); PageInfo<JTChannel> getChannelList(int page, int count, int deviceId, String query);

View File

@ -470,7 +470,7 @@ public class jt1078ServiceImpl implements Ijt1078Service {
} }
@Override @Override
public void recordDownload(String phoneNumber, Integer channelId, String startTime, String endTime, Integer type, Integer rate, GeneralCallback<String> fileCallback) { public void recordDownload(String phoneNumber, Integer channelId, String startTime, String endTime, Integer alarmSign, Integer mediaType, Integer streamType, Integer storageType, GeneralCallback<String> fileCallback) {
String filePath = UUID.randomUUID().toString(); String filePath = UUID.randomUUID().toString();
fileUploadMap.put(filePath, fileCallback); fileUploadMap.put(filePath, fileCallback);
dynamicTask.startDelay(filePath, ()->{ dynamicTask.startDelay(filePath, ()->{
@ -489,11 +489,17 @@ public class jt1078ServiceImpl implements Ijt1078Service {
j92026.setPassword(ftpSetting.getPassword()); j92026.setPassword(ftpSetting.getPassword());
j92026.setPath(filePath); j92026.setPath(filePath);
if (type != null) { if (mediaType != null) {
j92026.setMediaType(type); j92026.setMediaType(mediaType);
} }
if (rate != null) { if (streamType != null) {
j92026.setStreamType(rate); j92026.setStreamType(streamType);
}
if (storageType != null) {
j92026.setStorageType(storageType);
}
if (alarmSign != null) {
j92026.setAlarmSign(alarmSign);
} }
jt1078Template.fileUpload(phoneNumber, j92026, 7200); jt1078Template.fileUpload(phoneNumber, j92026, 7200);
} }

View File

@ -101,7 +101,6 @@
</el-main> </el-main>
</el-container> </el-container>
<recordDownload ref="recordDownload"></recordDownload>
</div> </div>
</template> </template>
@ -110,12 +109,11 @@
import uiHeader from '../layout/UiHeader.vue' import uiHeader from '../layout/UiHeader.vue'
import player from './common/jessibuca.vue' import player from './common/jessibuca.vue'
import moment from 'moment' import moment from 'moment'
import recordDownload from './dialog/recordDownload.vue'
import JTDeviceService from "./service/JTDeviceService"; import JTDeviceService from "./service/JTDeviceService";
export default { export default {
name: 'app', name: 'app',
components: { components: {
uiHeader, player,recordDownload uiHeader, player
}, },
data() { data() {
return { return {
@ -320,48 +318,22 @@
this.control(command[0], command[1]) this.control(command[0], command[1])
}, },
downloadRecord: function (row) { downloadRecord: function (row) {
if (!row) { let baseUrl = window.baseUrl ? window.baseUrl : "";
let startTimeStr = moment(new Date(this.chooseDate + " 00:00:00").getTime() + this.playTime[0]*1000).format("YYYY-MM-DD HH:mm:ss"); let downloadFile = ((process.env.NODE_ENV === 'development') ? process.env.BASE_API : baseUrl) +
let endTimeStr = moment(new Date(this.chooseDate + " 00:00:00").getTime() + this.playTime[1]*1000).format("YYYY-MM-DD HH:mm:ss"); `/api/jt1078/playback/download?phoneNumber=${this.phoneNumber}&channelId=${this.channelId}&startTime=${row.startTime}&endTime=${row.endTime}`+
console.log(startTimeStr); `&alarmSign=${row.alarmSign}&mediaType=${row.mediaType}&streamType=${row.streamType}&storageType=${row.storageType}`
console.log(endTimeStr); console.log(downloadFile)
row = { let x = new XMLHttpRequest();
startTime: startTimeStr, x.open("GET", downloadFile, true);
endTime: endTimeStr x.responseType = 'blob';
} x.onload=(e)=> {
} let url = window.URL.createObjectURL(x.response)
if (this.streamId !== "") { let a = document.createElement('a');
this.stopPlayRecord(()=> { a.href = url
this.streamId = ""; a.download = this.phoneNumber + "-" + this.channelId + ".mp4";
this.downloadRecord(row); a.click()
})
}else {
this.$axios({
method: 'get',
url: '/api/jt1078/playback/start/',
params: {
phoneNumber: this.phoneNumber,
channelId: this.channelId,
startTime: this.startTime,
endTime: this.endTime,
type: 0,
rate: 0,
playbackType: 0,
playbackSpeed: 0
}
}).then( (res)=> {
if (res.data.code === 0) {
let streamInfo = res.data.data;
this.$refs.recordDownload.openDialog(this.deviceId, this.channelId, streamInfo.app, streamInfo.stream, streamInfo.mediaServerId);
}else {
this.$message({
showClose: true,
message: res.data.msg,
type: "error",
});
}
});
} }
x.send();
}, },
stopDownloadRecord: function (callback) { stopDownloadRecord: function (callback) {
this.$refs["recordVideoPlayer"].pause(); this.$refs["recordVideoPlayer"].pause();