StreamProxyEdit.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. <template>
  2. <div id="addStreamProxy" v-loading="isLoging">
  3. <el-dialog
  4. title="添加代理"
  5. width="40%"
  6. top="2rem"
  7. :close-on-click-modal="false"
  8. :visible.sync="showDialog"
  9. :destroy-on-close="true"
  10. @close="close()"
  11. >
  12. <div id="shared" style="margin-top: 1rem;margin-right: 100px;">
  13. <el-form ref="streamProxy" :rules="rules" :model="proxyParam" label-width="140px" >
  14. <el-form-item label="类型" prop="type">
  15. <el-select
  16. v-model="proxyParam.type"
  17. style="width: 100%"
  18. placeholder="请选择代理类型"
  19. >
  20. <el-option label="默认" value="default"></el-option>
  21. <el-option label="FFmpeg" value="ffmpeg"></el-option>
  22. </el-select>
  23. </el-form-item>
  24. <el-form-item label="名称" prop="name">
  25. <el-input v-model="proxyParam.name" clearable></el-input>
  26. </el-form-item>
  27. <el-form-item label="流应用名" prop="app">
  28. <el-input v-model="proxyParam.app" clearable></el-input>
  29. </el-form-item>
  30. <el-form-item label="流ID" prop="stream">
  31. <el-input v-model="proxyParam.stream" clearable></el-input>
  32. </el-form-item>
  33. <el-form-item label="拉流地址" prop="url" v-if="proxyParam.type=='default'">
  34. <el-input v-model="proxyParam.url" clearable></el-input>
  35. </el-form-item>
  36. <el-form-item label="拉流地址" prop="src_url" v-if="proxyParam.type=='ffmpeg'">
  37. <el-input v-model="proxyParam.src_url" clearable></el-input>
  38. </el-form-item>
  39. <el-form-item label="超时时间:毫秒" prop="timeout_ms" v-if="proxyParam.type=='ffmpeg'">
  40. <el-input v-model="proxyParam.timeout_ms" clearable></el-input>
  41. </el-form-item>
  42. <el-form-item label="节点选择" prop="rtp_type">
  43. <el-select
  44. v-model="proxyParam.mediaServerId"
  45. @change="mediaServerIdChange"
  46. style="width: 100%"
  47. placeholder="请选择拉流节点"
  48. >
  49. <el-option
  50. v-for="item in mediaServerList"
  51. :key="item.id"
  52. :label="item.id"
  53. :value="item.id">
  54. </el-option>
  55. </el-select>
  56. </el-form-item>
  57. <el-form-item label="FFmpeg命令模板" prop="ffmpeg_cmd_key" v-if="proxyParam.type=='ffmpeg'">
  58. <!-- <el-input v-model="proxyParam.ffmpeg_cmd_key" clearable></el-input>-->
  59. <el-select
  60. v-model="proxyParam.ffmpeg_cmd_key"
  61. style="width: 100%"
  62. placeholder="请选择FFmpeg命令模板"
  63. >
  64. <el-option
  65. v-for="item in Object.keys(ffmpegCmdList)"
  66. :key="item"
  67. :label="ffmpegCmdList[item]"
  68. :value="item">
  69. </el-option>
  70. </el-select>
  71. </el-form-item>
  72. <el-form-item label="国标编码" prop="gbId">
  73. <el-input v-model="proxyParam.gbId" placeholder="设置国标编码可推送到国标" clearable></el-input>
  74. </el-form-item>
  75. <el-form-item label="拉流方式" prop="rtp_type" v-if="proxyParam.type=='default'">
  76. <el-select
  77. v-model="proxyParam.rtp_type"
  78. style="width: 100%"
  79. placeholder="请选择拉流方式"
  80. >
  81. <el-option label="TCP" value="0"></el-option>
  82. <el-option label="UDP" value="1"></el-option>
  83. <el-option label="组播" value="2"></el-option>
  84. </el-select>
  85. </el-form-item>
  86. <el-form-item label="无人观看" prop="rtp_type" >
  87. <el-select
  88. @change="noneReaderHandler"
  89. v-model="proxyParam.none_reader"
  90. style="width: 100%"
  91. placeholder="请选择无人观看的处理方式"
  92. >
  93. <el-option label="不做处理" value="0"></el-option>
  94. <el-option label="停用" value="1"></el-option>
  95. <el-option label="移除" value="2"></el-option>
  96. </el-select>
  97. </el-form-item>
  98. <el-form-item label="其他选项">
  99. <div style="float: left;">
  100. <el-checkbox label="启用" v-model="proxyParam.enable" ></el-checkbox>
  101. <el-checkbox label="开启音频" v-model="proxyParam.enable_audio" ></el-checkbox>
  102. <el-checkbox label="录制" v-model="proxyParam.enable_mp4" ></el-checkbox>
  103. </div>
  104. </el-form-item>
  105. <el-form-item>
  106. <div style="float: right;">
  107. <el-button type="primary" @click="onSubmit" :loading="dialogLoading" >{{onSubmit_text}}</el-button>
  108. <el-button @click="close">取消</el-button>
  109. </div>
  110. </el-form-item>
  111. </el-form>
  112. </div>
  113. </el-dialog>
  114. </div>
  115. </template>
  116. <script>
  117. import MediaServer from './../service/MediaServer'
  118. export default {
  119. name: "streamProxyEdit",
  120. props: {},
  121. computed: {},
  122. created() {},
  123. data() {
  124. // var deviceGBIdRules = async (rule, value, callback) => {
  125. // console.log(value);
  126. // if (value === "") {
  127. // callback(new Error("请输入设备国标编号"));
  128. // } else {
  129. // var exit = await this.deviceGBIdExit(value);
  130. // console.log(exit);
  131. // console.log(exit == "true");
  132. // console.log(exit === "true");
  133. // if (exit) {
  134. // callback(new Error("设备国标编号已存在"));
  135. // } else {
  136. // callback();
  137. // }
  138. // }
  139. // };
  140. return {
  141. listChangeCallback: null,
  142. showDialog: false,
  143. isLoging: false,
  144. dialogLoading: false,
  145. onSubmit_text: "立即创建",
  146. platformList: [],
  147. mediaServer: new MediaServer(),
  148. proxyParam: {
  149. name: null,
  150. type: "default",
  151. app: null,
  152. stream: null,
  153. url: "",
  154. src_url: null,
  155. timeout_ms: null,
  156. ffmpeg_cmd_key: null,
  157. gbId: null,
  158. rtp_type: null,
  159. enable: true,
  160. enable_audio: true,
  161. enable_mp4: false,
  162. none_reader: null,
  163. enable_remove_none_reader: false,
  164. enable_disable_none_reader: false,
  165. platformGbId: null,
  166. mediaServerId: null,
  167. },
  168. mediaServerList:{},
  169. ffmpegCmdList:{},
  170. rules: {
  171. name: [{ required: true, message: "请输入名称", trigger: "blur" }],
  172. app: [{ required: true, message: "请输入应用名", trigger: "blur" }],
  173. stream: [{ required: true, message: "请输入流ID", trigger: "blur" }],
  174. url: [{ required: true, message: "请输入要代理的流", trigger: "blur" }],
  175. src_url: [{ required: true, message: "请输入要代理的流", trigger: "blur" }],
  176. timeout_ms: [{ required: true, message: "请输入FFmpeg推流成功超时时间", trigger: "blur" }],
  177. ffmpeg_cmd_key: [{ required: false, message: "请输入FFmpeg命令参数模板(可选)", trigger: "blur" }],
  178. },
  179. };
  180. },
  181. methods: {
  182. openDialog: function (proxyParam, callback) {
  183. this.showDialog = true;
  184. this.listChangeCallback = callback;
  185. if (proxyParam != null) {
  186. this.proxyParam = proxyParam;
  187. this.proxyParam.none_reader = null;
  188. }
  189. let that = this;
  190. this.$axios({
  191. method: 'get',
  192. url:`/api/platform/query/10000/1`
  193. }).then(function (res) {
  194. that.platformList = res.data.data.list;
  195. }).catch(function (error) {
  196. console.log(error);
  197. });
  198. this.mediaServer.getOnlineMediaServerList((data)=>{
  199. this.mediaServerList = data.data;
  200. this.proxyParam.mediaServerId = this.mediaServerList[0].id
  201. this.mediaServerIdChange()
  202. })
  203. },
  204. mediaServerIdChange:function (){
  205. let that = this;
  206. if (that.proxyParam.mediaServerId !== "auto"){
  207. that.$axios({
  208. method: 'get',
  209. url:`/api/proxy/ffmpeg_cmd/list`,
  210. params: {
  211. mediaServerId: that.proxyParam.mediaServerId
  212. }
  213. }).then(function (res) {
  214. that.ffmpegCmdList = res.data.data;
  215. that.proxyParam.ffmpeg_cmd_key = Object.keys(res.data.data)[0];
  216. }).catch(function (error) {
  217. console.log(error);
  218. });
  219. }
  220. },
  221. onSubmit: function () {
  222. this.dialogLoading = true;
  223. this.noneReaderHandler();
  224. this.$axios({
  225. method: 'post',
  226. url:`/api/proxy/save`,
  227. data: this.proxyParam
  228. }).then((res)=> {
  229. this.dialogLoading = false;
  230. if (typeof (res.data.code) != "undefined" && res.data.code === 0) {
  231. this.$message({
  232. showClose: true,
  233. message: res.data.msg,
  234. type: "success",
  235. });
  236. this.showDialog = false;
  237. if (this.listChangeCallback != null) {
  238. this.listChangeCallback();
  239. this.dialogLoading = false;
  240. }
  241. }
  242. }).catch((error) =>{
  243. console.log(error);
  244. this.dialogLoading = false;
  245. });
  246. },
  247. close: function () {
  248. this.showDialog = false;
  249. this.dialogLoading = false;
  250. this.$refs.streamProxy.resetFields();
  251. },
  252. deviceGBIdExit: async function (deviceGbId) {
  253. var result = false;
  254. var that = this;
  255. await that.$axios({
  256. method: 'get',
  257. url:`/api/platform/exit/${deviceGbId}`
  258. }).then(function (res) {
  259. result = res.data;
  260. }).catch(function (error) {
  261. console.log(error);
  262. });
  263. return result;
  264. },
  265. checkExpires: function() {
  266. if (this.platform.enable && this.platform.expires == "0") {
  267. this.platform.expires = "300";
  268. }
  269. },
  270. noneReaderHandler: function() {
  271. if (this.proxyParam.none_reader === null || this.proxyParam.none_reader === "0") {
  272. this.proxyParam.enable_disable_none_reader = false;
  273. this.proxyParam.enable_remove_none_reader = false;
  274. }else if (this.proxyParam.none_reader === "1"){
  275. this.proxyParam.enable_disable_none_reader = true;
  276. this.proxyParam.enable_remove_none_reader = false;
  277. }else if (this.proxyParam.none_reader ==="2"){
  278. this.proxyParam.enable_disable_none_reader = false;
  279. this.proxyParam.enable_remove_none_reader = true;
  280. }
  281. },
  282. },
  283. };
  284. </script>