useStreamControl.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. import { ref, type Ref } from 'vue'
  2. import { ElMessage, ElMessageBox } from 'element-plus'
  3. import { useI18n } from 'vue-i18n'
  4. import { startStreamTask, stopStreamTask, getStreamPlayback } from '@/api/stream-push'
  5. import type { LiveStreamDTO } from '@/types'
  6. import type { PlaybackInfo } from '../types'
  7. export function useStreamControl(
  8. currentMediaStream: Ref<LiveStreamDTO | null>,
  9. playbackInfo: Ref<PlaybackInfo>,
  10. getList: () => Promise<void> | void
  11. ) {
  12. const { t } = useI18n({ useScope: 'global' })
  13. const streamStarting = ref(false)
  14. const streamStopping = ref(false)
  15. async function handleToggleStream(row: LiveStreamDTO, val: boolean) {
  16. if (val) {
  17. await handleStartStream(row)
  18. } else {
  19. await handleStopStream(row)
  20. }
  21. }
  22. async function handleStartStream(row: LiveStreamDTO) {
  23. if (!row.cameraId) {
  24. ElMessage.warning(t('请先配置摄像头'))
  25. return
  26. }
  27. row._starting = true
  28. try {
  29. const res = await startStreamTask({
  30. name: row.name,
  31. lssId: row.lssId,
  32. cameraId: row.cameraId,
  33. commandTemplate: row.commandTemplate
  34. })
  35. if (res.success) {
  36. ElMessage.success(t('推流任务已启动'))
  37. getList()
  38. } else {
  39. ElMessage.error(res.errMessage || t('启动失败'))
  40. }
  41. } catch (error) {
  42. console.error('启动推流失败', error)
  43. ElMessage.error(t('启动推流失败'))
  44. } finally {
  45. row._starting = false
  46. }
  47. }
  48. async function handleStartStreamFromPlayer() {
  49. if (!currentMediaStream.value) return
  50. if (!currentMediaStream.value.cameraId) {
  51. ElMessage.warning(t('请先配置摄像头'))
  52. return
  53. }
  54. streamStarting.value = true
  55. try {
  56. const res = await startStreamTask({
  57. name: currentMediaStream.value.name,
  58. lssId: currentMediaStream.value.lssId,
  59. cameraId: currentMediaStream.value.cameraId,
  60. commandTemplate: currentMediaStream.value.commandTemplate
  61. })
  62. if (res.success) {
  63. ElMessage.success(t('推流任务已启动'))
  64. currentMediaStream.value.status = '1'
  65. if (currentMediaStream.value.streamSn) {
  66. try {
  67. const playbackRes = await getStreamPlayback(currentMediaStream.value.streamSn)
  68. if (playbackRes.success && playbackRes.data) {
  69. playbackInfo.value = {
  70. ...playbackInfo.value,
  71. hlsUrl: playbackRes.data.hlsUrl,
  72. whepUrl: playbackRes.data.whepUrl,
  73. isLive: playbackRes.data.isLive
  74. }
  75. }
  76. } catch (e) {
  77. console.error('刷新播放信息失败', e)
  78. }
  79. }
  80. getList()
  81. } else {
  82. ElMessage.error(res.errMessage || t('启动失败'))
  83. }
  84. } catch (error) {
  85. console.error('启动推流失败', error)
  86. ElMessage.error(t('启动推流失败'))
  87. } finally {
  88. streamStarting.value = false
  89. }
  90. }
  91. async function handleStopStreamFromPlayer() {
  92. if (!currentMediaStream.value) return
  93. try {
  94. await ElMessageBox.confirm(t('确定要停止该推流任务吗?'), t('提示'), {
  95. type: 'warning',
  96. confirmButtonText: t('确定'),
  97. cancelButtonText: t('取消')
  98. })
  99. streamStopping.value = true
  100. const res = await stopStreamTask({
  101. taskId: currentMediaStream.value.taskStreamSn,
  102. lssId: currentMediaStream.value.lssId
  103. })
  104. if (res.success) {
  105. ElMessage.success(t('推流任务已停止'))
  106. currentMediaStream.value.status = '0'
  107. playbackInfo.value.isLive = false
  108. getList()
  109. } else {
  110. ElMessage.error(res.errMessage || t('停止失败'))
  111. }
  112. } catch (error) {
  113. if (error !== 'cancel') {
  114. console.error('停止推流失败', error)
  115. ElMessage.error(t('停止推流失败'))
  116. }
  117. } finally {
  118. streamStopping.value = false
  119. }
  120. }
  121. async function handleStopStream(row: LiveStreamDTO) {
  122. try {
  123. await ElMessageBox.confirm(t('确定要停止该推流任务吗?'), t('提示'), {
  124. type: 'warning',
  125. confirmButtonText: t('确定'),
  126. cancelButtonText: t('取消')
  127. })
  128. row._stopping = true
  129. const res = await stopStreamTask({ taskId: row.taskStreamSn, lssId: row.lssId })
  130. if (res.success) {
  131. ElMessage.success(t('推流任务已停止'))
  132. getList()
  133. } else {
  134. ElMessage.error(res.errMessage || t('停止失败'))
  135. }
  136. } catch (error) {
  137. if (error !== 'cancel') {
  138. console.error('停止推流失败', error)
  139. ElMessage.error(t('停止推流失败'))
  140. }
  141. } finally {
  142. row._stopping = false
  143. }
  144. }
  145. return {
  146. streamStarting,
  147. streamStopping,
  148. handleToggleStream,
  149. handleStartStream,
  150. handleStopStream,
  151. handleStartStreamFromPlayer,
  152. handleStopStreamFromPlayer
  153. }
  154. }