hls.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <template>
  2. <video
  3. class="hlsVideo"
  4. ref="hlsVideo"
  5. autoplay
  6. muted
  7. :style="'width:' + width + ';height:' + height"
  8. v-if="code"
  9. ></video>
  10. </template>
  11. <script>
  12. export default {
  13. // 名称
  14. name: "Hls",
  15. // 使用组件
  16. components: {},
  17. // 传入参数
  18. props: {
  19. width: {
  20. type: String,
  21. default: "100%",
  22. },
  23. height: {
  24. type: String,
  25. default: "100%",
  26. },
  27. code: {
  28. type: String,
  29. default: "",
  30. },
  31. },
  32. emits: {},
  33. // 数据
  34. data() {
  35. return {
  36. socket: null,
  37. isReady: false,
  38. devs: [],
  39. hls: null,
  40. currDevCode: null,
  41. };
  42. },
  43. // 函数
  44. methods: {
  45. _play: function () {
  46. if (Hls.isSupported()) {
  47. var self = this;
  48. self.$nextTick(function () {
  49. var video = self.$refs.hlsVideo;
  50. self.hls && self.hls.destroy();
  51. video.volume = 1.0;
  52. self.hls = new Hls();
  53. self.hls.on(Hls.Events.MANIFEST_PARSED, () => {
  54. self.$refs.video.play();
  55. });
  56. self.hls.loadSource(
  57. // `http://192.168.10.25:1935/hls/${self.currDevCode}/index.m3u8`
  58. `http://192.168.1.18:1935/hls/${self.code}/index.m3u8`
  59. );
  60. self.hls.attachMedia(video);
  61. });
  62. }
  63. },
  64. onReady() {
  65. this.send({ action: "loadDevs" });
  66. },
  67. onDevChoosed(index) {
  68. this.currDevCode = this.devs[index].code;
  69. this._play();
  70. },
  71. onMessage(data) {
  72. var result = eval(data);
  73. if (result.code === "fail") {
  74. if (result.message) {
  75. this.$message.error(result.message);
  76. } else {
  77. this.$message.error("操作失败");
  78. }
  79. } else if (result.action == "loadDevs") {
  80. this.devs = result.object;
  81. }
  82. console.log("result", result);
  83. },
  84. send(message) {
  85. if (!this.isReady) {
  86. alert("this socket is not ready!");
  87. return;
  88. }
  89. this.socket.send(JSON.stringify(message));
  90. },
  91. },
  92. // 生命周期钩子
  93. beforeCreate() {
  94. // 创建前
  95. },
  96. created() {
  97. // 创建后
  98. var self = this;
  99. if (window.WebSocket) {
  100. self.socket = new WebSocket("ws://" + window.location.host + "/api.ws");
  101. //建立websocket连接
  102. self.socket.onopen = function () {
  103. self.isReady = self.socket.readyState == 1;
  104. self.onReady();
  105. };
  106. self.socket.onmessage = function (event) {
  107. var data = JSON.parse(event.data);
  108. self.onMessage(data);
  109. };
  110. self.socket.onclose = function (event) {
  111. self.isReady = false;
  112. };
  113. self._play();
  114. }
  115. },
  116. beforeMount() {
  117. // 渲染前
  118. },
  119. mounted() {
  120. // 渲染后
  121. },
  122. beforeUpdate() {},
  123. updated() {},
  124. watch: {
  125. code() {
  126. this._play();
  127. },
  128. },
  129. };
  130. </script>
  131. <style lang="less" scoped>
  132. .hlsVideo {
  133. object-fit: fill;
  134. }
  135. </style>