mirror of
https://gitee.com/pan648540858/wvp-GB28181-pro.git
synced 2026-05-23 05:37:48 +08:00
1078-支持设备录像FTP方式下载
This commit is contained in:
parent
a030c15c8f
commit
f564ff0aba
@ -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()) {
|
||||||
|
|||||||
@ -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 +
|
||||||
|
|||||||
@ -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 +
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user