WEBRTC+SRS 边录边传 网页直播推流

vue项目实现网页在线直播,并实现录制直播,也可以理解为边录边传
以下为效果,左侧自己写的推流端,右侧为拉流端
请添加图片描述

资源准备

序号资源名称
1云服务器
2域名一个

一、安装srs流媒体服务器

在这里插入图片描述
在这里插入图片描述
宝塔网站管理这里点击设置添加上域名并设置SSL开启https

在这里插入图片描述

在这里插入图片描述

完成后进入管理面板获取推流地址

在这里插入图片描述

二、代码联调

<template>
  <div>
    <input
      type="text"
      v-model="webrtcUrl"
      placeholder="输入WebRTC URL"
      style="width: 100%"
    />
    <button @click="startPublisherBtn">开始推流</button>
    <button @click="stopPublisherBtn">关闭推流</button>
    <video
      ref="pusher"
      autoplay
      :srcObject="stream"
      style="width: 100%; height: auto"
    />
  </div>
</template>

<script>
import Srs from "@/assets/js/srs.sdk";
import { onMounted, ref, onUnmounted, nextTick } from "vue";

export default {
  name: "webrtcPusher",
  setup() {
    const pusher = ref(null); // 使用 null 而不是 undefined
    const webrtcUrl = ref(
      "webrtc://live.abc.com/live/bkdbjf?secret=c447ab4e83884139907d7cbdaeaf9a6e"
    );

    let rtcPublisher = null; // 用于存储RtcPublisher实例
    let rtcPlayer = null; // 用于存储RtcPlayer实例

    const startPublisher = async () => {
      try {
        rtcPublisher = new Srs.SrsRtcPublisherAsync(); // 创建RtcPublisher实例
        const session = await rtcPublisher.publish(webrtcUrl.value); // 开始推流
        console.log("推流成功", session);
        await nextTick(); // 等待DOM更新,确保pusher是可用的
        // 如果需要,这里可以添加播放器的初始化代码(如果RtcPublisher也提供了流)
      } catch (error) {
        console.error("推流失败", error);
        // 如果RtcPublisher有close方法,调用它以关闭推流
        if (rtcPublisher && rtcPublisher.close) {
          rtcPublisher.close();
        }
      }
    };

    const startPlayer = async () => {
      try {
        rtcPlayer = new Srs.SrsRtcPlayerAsync(); // 创建RtcPlayer实例
        await rtcPlayer.play(webrtcUrl.value); // 开始播放
        await nextTick(); // 等待DOM更新,确保pusher是可用的
        // 设置视频源的srcObject
        if (rtcPlayer.stream && pusher.value) {
          pusher.value.srcObject = rtcPlayer.stream;
        }
      } catch (error) {
        console.error("播放失败", error);
        // 如果RtcPlayer有close或stop方法,调用它以停止播放
        if (rtcPlayer && (rtcPlayer.close || rtcPlayer.stop)) {
          // 假设有一个close或stop方法可用
          rtcPlayer.close?.() || rtcPlayer.stop?.();
        }
      }
    };
    const startPublisherBtn = async () => {
      await startPublisher();
      await startPlayer();
    };
    const stopPublisherBtn = async () => {
      if (rtcPublisher && rtcPublisher.close) {
        rtcPublisher.close();
      }
      if (rtcPlayer && (rtcPlayer.close || rtcPlayer.stop)) {
        rtcPlayer.close?.() || rtcPlayer.stop?.();
      }
    };
    
    onUnmounted(() => {
      // 组件卸载时关闭推流和播放
      if (rtcPublisher && rtcPublisher.close) {
        rtcPublisher.close();
      }
      if (rtcPlayer && (rtcPlayer.close || rtcPlayer.stop)) {
        rtcPlayer.close?.() || rtcPlayer.stop?.();
      }
    });
    return { pusher, webrtcUrl, startPublisherBtn, stopPublisherBtn };
  },
};
</script>
<style scoped>
.mirrored-video {
  transform: scaleX(-1);
  width: 100%;
  height: auto;
}
</style>

srs.sdk.js地址点击获取

三、录制直播

开启录制即可

在这里插入图片描述

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sea_lichee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值