合并开源主线
This commit is contained in:
@@ -9,17 +9,12 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.net.ConnectException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@Component
|
||||
public class AssistRESTfulUtils {
|
||||
@@ -137,6 +132,11 @@ public class AssistRESTfulUtils {
|
||||
return sendGet(mediaServerItem, "api/record/file/duration",param, callback);
|
||||
}
|
||||
|
||||
public JSONObject getInfo(MediaServerItem mediaServerItem, RequestCallback callback){
|
||||
Map<String, Object> param = new HashMap<>();
|
||||
return sendGet(mediaServerItem, "api/record/info",param, callback);
|
||||
}
|
||||
|
||||
public JSONObject addStreamCallInfo(MediaServerItem mediaServerItem, String app, String stream, String callId, RequestCallback callback){
|
||||
Map<String, Object> param = new HashMap<>();
|
||||
param.put("app",app);
|
||||
|
||||
@@ -119,10 +119,11 @@ public class ZLMHttpHookListener {
|
||||
* 服务器定时上报时间,上报间隔可配置,默认10s上报一次
|
||||
*/
|
||||
@ResponseBody
|
||||
|
||||
@PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8")
|
||||
public HookResult onServerKeepalive(@RequestBody OnServerKeepaliveHookParam param) {
|
||||
|
||||
logger.info("[ZLM HOOK] 收到zlm心跳:" + param.getMediaServerId());
|
||||
// logger.info("[ZLM HOOK] 收到zlm心跳:" + param.getMediaServerId());
|
||||
|
||||
taskExecutor.execute(() -> {
|
||||
List<ZlmHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_server_keepalive);
|
||||
@@ -142,6 +143,7 @@ public class ZLMHttpHookListener {
|
||||
* 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件。
|
||||
*/
|
||||
@ResponseBody
|
||||
|
||||
@PostMapping(value = "/on_play", produces = "application/json;charset=UTF-8")
|
||||
public HookResult onPlay(@RequestBody OnPlayHookParam param) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
@@ -264,9 +266,28 @@ public class ZLMHttpHookListener {
|
||||
}
|
||||
|
||||
}
|
||||
if (mediaInfo.getRecordAssistPort() > 0 && userSetting.getRecordPath() == null) {
|
||||
logger.info("推流时发现尚未设置录像路径,从assist服务中读取");
|
||||
JSONObject info = assistRESTfulUtils.getInfo(mediaInfo, null);
|
||||
if (info != null && info.getInteger("code") != null && info.getInteger("code") == 0 ) {
|
||||
JSONObject dataJson = info.getJSONObject("data");
|
||||
if (dataJson != null) {
|
||||
String recordPath = dataJson.getString("record");
|
||||
userSetting.setRecordPath(recordPath);
|
||||
result.setMp4_save_path(recordPath);
|
||||
// 修改zlm中的录像路径
|
||||
if (mediaInfo.isAutoConfig()) {
|
||||
taskExecutor.execute(() -> {
|
||||
mediaServerService.setZLMConfig(mediaInfo, false);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* rtsp/rtmp流注册或注销时触发此事件;此事件对回复不敏感。
|
||||
*/
|
||||
@@ -293,8 +314,12 @@ public class ZLMHttpHookListener {
|
||||
subscribe.response(mediaInfo, json);
|
||||
}
|
||||
}
|
||||
// 流消失移除redis play
|
||||
|
||||
List<OnStreamChangedHookParam.MediaTrack> tracks = param.getTracks();
|
||||
// TODO 重构此处逻辑
|
||||
|
||||
if (param.isRegist()) {
|
||||
// 处理流注册的鉴权信息
|
||||
if (param.getOriginType() == OriginType.RTMP_PUSH.ordinal()
|
||||
|| param.getOriginType() == OriginType.RTSP_PUSH.ordinal()
|
||||
|| param.getOriginType() == OriginType.RTC_PUSH.ordinal()) {
|
||||
|
||||
@@ -334,9 +334,9 @@ public class ZLMRESTfulUtils {
|
||||
sendPost(mediaServerItem, "kick_sessions",param, null);
|
||||
}
|
||||
|
||||
public void getSnap(MediaServerItem mediaServerItem, String flvUrl, int timeout_sec, int expire_sec, String targetPath, String fileName) {
|
||||
public void getSnap(MediaServerItem mediaServerItem, String streamUrl, int timeout_sec, int expire_sec, String targetPath, String fileName) {
|
||||
Map<String, Object> param = new HashMap<>(3);
|
||||
param.put("url", flvUrl);
|
||||
param.put("url", streamUrl);
|
||||
param.put("timeout_sec", timeout_sec);
|
||||
param.put("expire_sec", expire_sec);
|
||||
sendGetForImg(mediaServerItem, "getSnap", param, targetPath, fileName);
|
||||
|
||||
@@ -262,8 +262,11 @@ public class ZLMRTPServerFactory {
|
||||
logger.info("[保持端口] {}->监听端口到期继续保持监听", ssrc);
|
||||
keepPort(serverItem, ssrc);
|
||||
});
|
||||
}
|
||||
logger.info("[保持端口] {}->监听端口: {}", ssrc, localPort);
|
||||
logger.info("[保持端口] {}->监听端口: {}", ssrc, localPort);
|
||||
}else {
|
||||
logger.info("[保持端口] 监听端口失败: {}", ssrc);
|
||||
}
|
||||
return localPort;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,21 +10,87 @@ public class ZLMServerConfig {
|
||||
@JSONField(name = "api.secret")
|
||||
private String apiSecret;
|
||||
|
||||
@JSONField(name = "api.snapRoot")
|
||||
private String apiSnapRoot;
|
||||
|
||||
@JSONField(name = "api.defaultSnap")
|
||||
private String apiDefaultSnap;
|
||||
|
||||
@JSONField(name = "ffmpeg.bin")
|
||||
private String ffmpegBin;
|
||||
|
||||
@JSONField(name = "ffmpeg.cmd")
|
||||
private String ffmpegCmd;
|
||||
|
||||
@JSONField(name = "ffmpeg.snap")
|
||||
private String ffmpegSnap;
|
||||
|
||||
@JSONField(name = "ffmpeg.log")
|
||||
private String ffmpegLog;
|
||||
|
||||
@JSONField(name = "ffmpeg.restart_sec")
|
||||
private String ffmpegRestartSec;
|
||||
|
||||
@JSONField(name = "protocol.modify_stamp")
|
||||
private String protocolModifyStamp;
|
||||
|
||||
@JSONField(name = "protocol.enable_audio")
|
||||
private String protocolEnableAudio;
|
||||
|
||||
@JSONField(name = "protocol.add_mute_audio")
|
||||
private String protocolAddMuteAudio;
|
||||
|
||||
@JSONField(name = "protocol.continue_push_ms")
|
||||
private String protocolContinuePushMs;
|
||||
|
||||
@JSONField(name = "protocol.enable_hls")
|
||||
private String protocolEnableHls;
|
||||
|
||||
@JSONField(name = "protocol.enable_mp4")
|
||||
private String protocolEnableMp4;
|
||||
|
||||
@JSONField(name = "protocol.enable_rtsp")
|
||||
private String protocolEnableRtsp;
|
||||
|
||||
@JSONField(name = "protocol.enable_rtmp")
|
||||
private String protocolEnableRtmp;
|
||||
|
||||
@JSONField(name = "protocol.enable_ts")
|
||||
private String protocolEnableTs;
|
||||
|
||||
@JSONField(name = "protocol.enable_fmp4")
|
||||
private String protocolEnableFmp4;
|
||||
|
||||
@JSONField(name = "protocol.mp4_as_player")
|
||||
private String protocolMp4AsPlayer;
|
||||
|
||||
@JSONField(name = "protocol.mp4_max_second")
|
||||
private String protocolMp4MaxSecond;
|
||||
|
||||
@JSONField(name = "protocol.mp4_save_path")
|
||||
private String protocolMp4SavePath;
|
||||
|
||||
@JSONField(name = "protocol.hls_save_path")
|
||||
private String protocolHlsSavePath;
|
||||
|
||||
@JSONField(name = "protocol.hls_demand")
|
||||
private String protocolHlsDemand;
|
||||
|
||||
@JSONField(name = "protocol.rtsp_demand")
|
||||
private String protocolRtspDemand;
|
||||
|
||||
@JSONField(name = "protocol.rtmp_demand")
|
||||
private String protocolRtmpDemand;
|
||||
|
||||
@JSONField(name = "protocol.ts_demand")
|
||||
private String protocolTsDemand;
|
||||
|
||||
@JSONField(name = "protocol.fmp4_demand")
|
||||
private String protocolFmp4Demand;
|
||||
|
||||
@JSONField(name = "general.enableVhost")
|
||||
private String generalEnableVhost;
|
||||
|
||||
@JSONField(name = "general.mediaServerId")
|
||||
private String generalMediaServerId;
|
||||
|
||||
@JSONField(name = "general.flowThreshold")
|
||||
private String generalFlowThreshold;
|
||||
|
||||
@@ -34,6 +100,25 @@ public class ZLMServerConfig {
|
||||
@JSONField(name = "general.streamNoneReaderDelayMS")
|
||||
private int generalStreamNoneReaderDelayMS;
|
||||
|
||||
@JSONField(name = "general.resetWhenRePlay")
|
||||
private String generalResetWhenRePlay;
|
||||
|
||||
@JSONField(name = "general.mergeWriteMS")
|
||||
private String generalMergeWriteMS;
|
||||
|
||||
@JSONField(name = "general.mediaServerId")
|
||||
private String generalMediaServerId;
|
||||
|
||||
@JSONField(name = "general.wait_track_ready_ms")
|
||||
private String generalWaitTrackReadyMs;
|
||||
|
||||
@JSONField(name = "general.wait_add_track_ms")
|
||||
private String generalWaitAddTrackMs;
|
||||
|
||||
@JSONField(name = "general.unready_frame_cache")
|
||||
private String generalUnreadyFrameCache;
|
||||
|
||||
|
||||
@JSONField(name = "ip")
|
||||
private String ip;
|
||||
|
||||
@@ -59,6 +144,18 @@ public class ZLMServerConfig {
|
||||
@JSONField(name = "hls.segNum")
|
||||
private String hlsSegNum;
|
||||
|
||||
@JSONField(name = "hls.segRetain")
|
||||
private String hlsSegRetain;
|
||||
|
||||
@JSONField(name = "hls.broadcastRecordTs")
|
||||
private String hlsBroadcastRecordTs;
|
||||
|
||||
@JSONField(name = "hls.deleteDelaySec")
|
||||
private String hlsDeleteDelaySec;
|
||||
|
||||
@JSONField(name = "hls.segKeep")
|
||||
private String hlsSegKeep;
|
||||
|
||||
@JSONField(name = "hook.access_file_except_hls")
|
||||
private String hookAccessFileExceptHLS;
|
||||
|
||||
@@ -104,6 +201,18 @@ public class ZLMServerConfig {
|
||||
@JSONField(name = "hook.on_stream_not_found")
|
||||
private String hookOnStreamNotFound;
|
||||
|
||||
@JSONField(name = "hook.on_server_started")
|
||||
private String hookOnServerStarted;
|
||||
|
||||
@JSONField(name = "hook.on_server_keepalive")
|
||||
private String hookOnServerKeepalive;
|
||||
|
||||
@JSONField(name = "hook.on_send_rtp_stopped")
|
||||
private String hookOnSendRtpStopped;
|
||||
|
||||
@JSONField(name = "hook.on_rtp_server_timeout")
|
||||
private String hookOnRtpServerTimeout;
|
||||
|
||||
@JSONField(name = "hook.timeoutSec")
|
||||
private String hookTimeoutSec;
|
||||
|
||||
@@ -813,4 +922,292 @@ public class ZLMServerConfig {
|
||||
public void setPortRange(String portRange) {
|
||||
this.portRange = portRange;
|
||||
}
|
||||
|
||||
public String getApiSnapRoot() {
|
||||
return apiSnapRoot;
|
||||
}
|
||||
|
||||
public void setApiSnapRoot(String apiSnapRoot) {
|
||||
this.apiSnapRoot = apiSnapRoot;
|
||||
}
|
||||
|
||||
public String getApiDefaultSnap() {
|
||||
return apiDefaultSnap;
|
||||
}
|
||||
|
||||
public void setApiDefaultSnap(String apiDefaultSnap) {
|
||||
this.apiDefaultSnap = apiDefaultSnap;
|
||||
}
|
||||
|
||||
public String getFfmpegSnap() {
|
||||
return ffmpegSnap;
|
||||
}
|
||||
|
||||
public void setFfmpegSnap(String ffmpegSnap) {
|
||||
this.ffmpegSnap = ffmpegSnap;
|
||||
}
|
||||
|
||||
public String getFfmpegRestartSec() {
|
||||
return ffmpegRestartSec;
|
||||
}
|
||||
|
||||
public void setFfmpegRestartSec(String ffmpegRestartSec) {
|
||||
this.ffmpegRestartSec = ffmpegRestartSec;
|
||||
}
|
||||
|
||||
public String getProtocolModifyStamp() {
|
||||
return protocolModifyStamp;
|
||||
}
|
||||
|
||||
public void setProtocolModifyStamp(String protocolModifyStamp) {
|
||||
this.protocolModifyStamp = protocolModifyStamp;
|
||||
}
|
||||
|
||||
public String getProtocolEnableAudio() {
|
||||
return protocolEnableAudio;
|
||||
}
|
||||
|
||||
public void setProtocolEnableAudio(String protocolEnableAudio) {
|
||||
this.protocolEnableAudio = protocolEnableAudio;
|
||||
}
|
||||
|
||||
public String getProtocolAddMuteAudio() {
|
||||
return protocolAddMuteAudio;
|
||||
}
|
||||
|
||||
public void setProtocolAddMuteAudio(String protocolAddMuteAudio) {
|
||||
this.protocolAddMuteAudio = protocolAddMuteAudio;
|
||||
}
|
||||
|
||||
public String getProtocolContinuePushMs() {
|
||||
return protocolContinuePushMs;
|
||||
}
|
||||
|
||||
public void setProtocolContinuePushMs(String protocolContinuePushMs) {
|
||||
this.protocolContinuePushMs = protocolContinuePushMs;
|
||||
}
|
||||
|
||||
public String getProtocolEnableHls() {
|
||||
return protocolEnableHls;
|
||||
}
|
||||
|
||||
public void setProtocolEnableHls(String protocolEnableHls) {
|
||||
this.protocolEnableHls = protocolEnableHls;
|
||||
}
|
||||
|
||||
public String getProtocolEnableMp4() {
|
||||
return protocolEnableMp4;
|
||||
}
|
||||
|
||||
public void setProtocolEnableMp4(String protocolEnableMp4) {
|
||||
this.protocolEnableMp4 = protocolEnableMp4;
|
||||
}
|
||||
|
||||
public String getProtocolEnableRtsp() {
|
||||
return protocolEnableRtsp;
|
||||
}
|
||||
|
||||
public void setProtocolEnableRtsp(String protocolEnableRtsp) {
|
||||
this.protocolEnableRtsp = protocolEnableRtsp;
|
||||
}
|
||||
|
||||
public String getProtocolEnableRtmp() {
|
||||
return protocolEnableRtmp;
|
||||
}
|
||||
|
||||
public void setProtocolEnableRtmp(String protocolEnableRtmp) {
|
||||
this.protocolEnableRtmp = protocolEnableRtmp;
|
||||
}
|
||||
|
||||
public String getProtocolEnableTs() {
|
||||
return protocolEnableTs;
|
||||
}
|
||||
|
||||
public void setProtocolEnableTs(String protocolEnableTs) {
|
||||
this.protocolEnableTs = protocolEnableTs;
|
||||
}
|
||||
|
||||
public String getProtocolEnableFmp4() {
|
||||
return protocolEnableFmp4;
|
||||
}
|
||||
|
||||
public void setProtocolEnableFmp4(String protocolEnableFmp4) {
|
||||
this.protocolEnableFmp4 = protocolEnableFmp4;
|
||||
}
|
||||
|
||||
public String getProtocolMp4AsPlayer() {
|
||||
return protocolMp4AsPlayer;
|
||||
}
|
||||
|
||||
public void setProtocolMp4AsPlayer(String protocolMp4AsPlayer) {
|
||||
this.protocolMp4AsPlayer = protocolMp4AsPlayer;
|
||||
}
|
||||
|
||||
public String getProtocolMp4MaxSecond() {
|
||||
return protocolMp4MaxSecond;
|
||||
}
|
||||
|
||||
public void setProtocolMp4MaxSecond(String protocolMp4MaxSecond) {
|
||||
this.protocolMp4MaxSecond = protocolMp4MaxSecond;
|
||||
}
|
||||
|
||||
public String getProtocolMp4SavePath() {
|
||||
return protocolMp4SavePath;
|
||||
}
|
||||
|
||||
public void setProtocolMp4SavePath(String protocolMp4SavePath) {
|
||||
this.protocolMp4SavePath = protocolMp4SavePath;
|
||||
}
|
||||
|
||||
public String getProtocolHlsSavePath() {
|
||||
return protocolHlsSavePath;
|
||||
}
|
||||
|
||||
public void setProtocolHlsSavePath(String protocolHlsSavePath) {
|
||||
this.protocolHlsSavePath = protocolHlsSavePath;
|
||||
}
|
||||
|
||||
public String getProtocolHlsDemand() {
|
||||
return protocolHlsDemand;
|
||||
}
|
||||
|
||||
public void setProtocolHlsDemand(String protocolHlsDemand) {
|
||||
this.protocolHlsDemand = protocolHlsDemand;
|
||||
}
|
||||
|
||||
public String getProtocolRtspDemand() {
|
||||
return protocolRtspDemand;
|
||||
}
|
||||
|
||||
public void setProtocolRtspDemand(String protocolRtspDemand) {
|
||||
this.protocolRtspDemand = protocolRtspDemand;
|
||||
}
|
||||
|
||||
public String getProtocolRtmpDemand() {
|
||||
return protocolRtmpDemand;
|
||||
}
|
||||
|
||||
public void setProtocolRtmpDemand(String protocolRtmpDemand) {
|
||||
this.protocolRtmpDemand = protocolRtmpDemand;
|
||||
}
|
||||
|
||||
public String getProtocolTsDemand() {
|
||||
return protocolTsDemand;
|
||||
}
|
||||
|
||||
public void setProtocolTsDemand(String protocolTsDemand) {
|
||||
this.protocolTsDemand = protocolTsDemand;
|
||||
}
|
||||
|
||||
public String getProtocolFmp4Demand() {
|
||||
return protocolFmp4Demand;
|
||||
}
|
||||
|
||||
public void setProtocolFmp4Demand(String protocolFmp4Demand) {
|
||||
this.protocolFmp4Demand = protocolFmp4Demand;
|
||||
}
|
||||
|
||||
public String getGeneralResetWhenRePlay() {
|
||||
return generalResetWhenRePlay;
|
||||
}
|
||||
|
||||
public void setGeneralResetWhenRePlay(String generalResetWhenRePlay) {
|
||||
this.generalResetWhenRePlay = generalResetWhenRePlay;
|
||||
}
|
||||
|
||||
public String getGeneralMergeWriteMS() {
|
||||
return generalMergeWriteMS;
|
||||
}
|
||||
|
||||
public void setGeneralMergeWriteMS(String generalMergeWriteMS) {
|
||||
this.generalMergeWriteMS = generalMergeWriteMS;
|
||||
}
|
||||
|
||||
public String getGeneralWaitTrackReadyMs() {
|
||||
return generalWaitTrackReadyMs;
|
||||
}
|
||||
|
||||
public void setGeneralWaitTrackReadyMs(String generalWaitTrackReadyMs) {
|
||||
this.generalWaitTrackReadyMs = generalWaitTrackReadyMs;
|
||||
}
|
||||
|
||||
public String getGeneralWaitAddTrackMs() {
|
||||
return generalWaitAddTrackMs;
|
||||
}
|
||||
|
||||
public void setGeneralWaitAddTrackMs(String generalWaitAddTrackMs) {
|
||||
this.generalWaitAddTrackMs = generalWaitAddTrackMs;
|
||||
}
|
||||
|
||||
public String getGeneralUnreadyFrameCache() {
|
||||
return generalUnreadyFrameCache;
|
||||
}
|
||||
|
||||
public void setGeneralUnreadyFrameCache(String generalUnreadyFrameCache) {
|
||||
this.generalUnreadyFrameCache = generalUnreadyFrameCache;
|
||||
}
|
||||
|
||||
public String getHlsSegRetain() {
|
||||
return hlsSegRetain;
|
||||
}
|
||||
|
||||
public void setHlsSegRetain(String hlsSegRetain) {
|
||||
this.hlsSegRetain = hlsSegRetain;
|
||||
}
|
||||
|
||||
public String getHlsBroadcastRecordTs() {
|
||||
return hlsBroadcastRecordTs;
|
||||
}
|
||||
|
||||
public void setHlsBroadcastRecordTs(String hlsBroadcastRecordTs) {
|
||||
this.hlsBroadcastRecordTs = hlsBroadcastRecordTs;
|
||||
}
|
||||
|
||||
public String getHlsDeleteDelaySec() {
|
||||
return hlsDeleteDelaySec;
|
||||
}
|
||||
|
||||
public void setHlsDeleteDelaySec(String hlsDeleteDelaySec) {
|
||||
this.hlsDeleteDelaySec = hlsDeleteDelaySec;
|
||||
}
|
||||
|
||||
public String getHlsSegKeep() {
|
||||
return hlsSegKeep;
|
||||
}
|
||||
|
||||
public void setHlsSegKeep(String hlsSegKeep) {
|
||||
this.hlsSegKeep = hlsSegKeep;
|
||||
}
|
||||
|
||||
public String getHookOnServerStarted() {
|
||||
return hookOnServerStarted;
|
||||
}
|
||||
|
||||
public void setHookOnServerStarted(String hookOnServerStarted) {
|
||||
this.hookOnServerStarted = hookOnServerStarted;
|
||||
}
|
||||
|
||||
public String getHookOnServerKeepalive() {
|
||||
return hookOnServerKeepalive;
|
||||
}
|
||||
|
||||
public void setHookOnServerKeepalive(String hookOnServerKeepalive) {
|
||||
this.hookOnServerKeepalive = hookOnServerKeepalive;
|
||||
}
|
||||
|
||||
public String getHookOnSendRtpStopped() {
|
||||
return hookOnSendRtpStopped;
|
||||
}
|
||||
|
||||
public void setHookOnSendRtpStopped(String hookOnSendRtpStopped) {
|
||||
this.hookOnSendRtpStopped = hookOnSendRtpStopped;
|
||||
}
|
||||
|
||||
public String getHookOnRtpServerTimeout() {
|
||||
return hookOnRtpServerTimeout;
|
||||
}
|
||||
|
||||
public void setHookOnRtpServerTimeout(String hookOnRtpServerTimeout) {
|
||||
this.hookOnRtpServerTimeout = hookOnRtpServerTimeout;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ public class HookResultForOnPublish extends HookResult{
|
||||
private boolean enable_audio;
|
||||
private boolean enable_mp4;
|
||||
private int mp4_max_second;
|
||||
private String mp4_save_path;
|
||||
|
||||
public HookResultForOnPublish() {
|
||||
}
|
||||
@@ -41,4 +42,12 @@ public class HookResultForOnPublish extends HookResult{
|
||||
public void setMp4_max_second(int mp4_max_second) {
|
||||
this.mp4_max_second = mp4_max_second;
|
||||
}
|
||||
|
||||
public String getMp4_save_path() {
|
||||
return mp4_save_path;
|
||||
}
|
||||
|
||||
public void setMp4_save_path(String mp4_save_path) {
|
||||
this.mp4_save_path = mp4_save_path;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user