srs.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import { ref } from 'vue';
  2. import { fetchRtcV1Publish } from '@/api/srs';
  3. import { SRS_CB_URL_QUERY } from '@/constant';
  4. import { useRTCParams } from '@/hooks/use-rtcParams';
  5. import { useNetworkStore } from '@/store/network';
  6. import { useUserStore } from '@/store/user';
  7. import { LiveRoomTypeEnum } from '@/types/ILiveRoom';
  8. import { WebRTCClass } from '@/utils/network/webRTC';
  9. export const useWebRtcSrs = () => {
  10. const userStore = useUserStore();
  11. const networkStore = useNetworkStore();
  12. const { maxBitrate, maxFramerate, resolutionRatio } = useRTCParams();
  13. const currentMaxBitrate = ref(maxBitrate.value[3].value);
  14. const currentMaxFramerate = ref(maxFramerate.value[2].value);
  15. const currentResolutionRatio = ref(resolutionRatio.value[3].value);
  16. const isPk = ref(false);
  17. const roomId = ref('');
  18. const canvasVideoStream = ref<MediaStream>();
  19. function updateWebRtcSrsConfig(data: { isPk; roomId; canvasVideoStream }) {
  20. isPk.value = data.isPk;
  21. roomId.value = data.roomId;
  22. canvasVideoStream.value = data.canvasVideoStream;
  23. }
  24. const webRtcSrs = {
  25. newWebRtc: (data: {
  26. sender: string;
  27. receiver: string;
  28. videoEl: HTMLVideoElement;
  29. }) => {
  30. console.log({
  31. maxBitrate: currentMaxBitrate.value,
  32. maxFramerate: currentMaxFramerate.value,
  33. resolutionRatio: currentResolutionRatio.value,
  34. });
  35. return new WebRTCClass({
  36. maxBitrate: currentMaxBitrate.value,
  37. maxFramerate: currentMaxFramerate.value,
  38. resolutionRatio: currentResolutionRatio.value,
  39. isSRS: true,
  40. roomId: roomId.value,
  41. videoEl: data.videoEl,
  42. sender: data.sender,
  43. receiver: data.receiver,
  44. });
  45. },
  46. /**
  47. * 主播发offer给观众
  48. */
  49. sendOffer: async ({
  50. sender,
  51. receiver,
  52. }: {
  53. sender: string;
  54. receiver: string;
  55. }) => {
  56. console.log('开始webRtcSrs的sendOffer', {
  57. sender,
  58. receiver,
  59. });
  60. try {
  61. const ws = networkStore.wsMap.get(roomId.value);
  62. if (!ws) return;
  63. const rtc = networkStore.rtcMap.get(receiver);
  64. if (rtc) {
  65. canvasVideoStream.value?.getTracks().forEach((track) => {
  66. if (canvasVideoStream.value) {
  67. console.log(
  68. 'webRtcSrs的canvasVideoStream插入track',
  69. track.kind,
  70. track
  71. );
  72. rtc.peerConnection?.addTrack(track, canvasVideoStream.value);
  73. }
  74. });
  75. const offerSdp = await rtc.createOffer();
  76. if (!offerSdp) {
  77. console.error('webRtcSrs的offerSdp为空');
  78. window.$message.error('webRtcSrs的offerSdp为空');
  79. return;
  80. }
  81. await rtc.setLocalDescription(offerSdp!);
  82. const liveRooms = userStore.userInfo?.live_rooms;
  83. const myLiveRoom = liveRooms?.[0];
  84. if (!myLiveRoom) {
  85. window.$message.error('你没有开通直播间');
  86. return;
  87. }
  88. const answerRes = await fetchRtcV1Publish({
  89. sdp: offerSdp.sdp!,
  90. streamurl: `${myLiveRoom.pull_rtmp_url!}?${
  91. SRS_CB_URL_QUERY.publishKey
  92. }=${myLiveRoom.key!}&${SRS_CB_URL_QUERY.publishType}=${
  93. isPk.value ? LiveRoomTypeEnum.pk : LiveRoomTypeEnum.srs
  94. }&${SRS_CB_URL_QUERY.userId}=${userStore.userInfo?.id!}`,
  95. });
  96. if (answerRes.data.code !== 0) {
  97. console.error('/rtc/v1/publish/拿不到sdp');
  98. window.$message.error('/rtc/v1/publish/拿不到sdp');
  99. return;
  100. }
  101. await rtc.setRemoteDescription(
  102. new RTCSessionDescription({
  103. type: 'answer',
  104. sdp: answerRes.data.sdp,
  105. })
  106. );
  107. } else {
  108. console.error('rtc不存在');
  109. }
  110. } catch (error) {
  111. console.error('webRtcSrs的sendOffer错误');
  112. console.log(error);
  113. }
  114. },
  115. };
  116. return { updateWebRtcSrsConfig, webRtcSrs };
  117. };