精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

十分鐘搞定!用 Spring Boot 搭建屬于你的輕量直播平臺(tái)

開發(fā) 架構(gòu)
通過(guò)本文的實(shí)戰(zhàn)內(nèi)容,我們使用 Spring Boot 框架,集成 SRS 流媒體服務(wù)器和 WebSocket 技術(shù),實(shí)現(xiàn)了一個(gè)從直播間創(chuàng)建、推流、拉流到聊天互動(dòng)的輕量級(jí)直播平臺(tái)。

直播技術(shù)正以前所未有的速度席卷各行各業(yè)。從社交媒體平臺(tái)到在線教育、電子商務(wù)甚至游戲社區(qū),直播系統(tǒng)已成為增強(qiáng)用戶互動(dòng)、傳遞實(shí)時(shí)信息的關(guān)鍵工具。本文將基于 Spring Boot 框架,構(gòu)建一個(gè)具備推流、拉流、互動(dòng)功能的輕量直播平臺(tái)。

一、直播技術(shù)基礎(chǔ)

1.1 推流與拉流的基本概念

  • 推流(Push):主播通過(guò)攝像頭采集音視頻內(nèi)容,編碼后推送至流媒體服務(wù)器。
  • 拉流(Pull):觀眾端從流媒體服務(wù)器獲取直播流并進(jìn)行解碼播放。

1.2 常見直播協(xié)議對(duì)比

協(xié)議

優(yōu)勢(shì)

劣勢(shì)

典型場(chǎng)景

RTMP

延遲低(1-3s)、技術(shù)成熟

基于 Flash、需開放 1935 端口

推流、低延遲直播

HLS

使用 HTTP,兼容性好

延遲高(10s+)

大規(guī)模分發(fā)、移動(dòng)端播放

WebRTC

超低延遲(<1s)、P2P 通信

網(wǎng)絡(luò)穿透難、部署復(fù)雜

實(shí)時(shí)互動(dòng)、在線會(huì)議

HTTP-FLV

延遲低、支持瀏覽器播放

不支持可變碼率

視頻門戶、低延遲場(chǎng)景

SRT

高可靠性、低延遲

部署稍復(fù)雜,生態(tài)相對(duì)年輕

專業(yè)直播、跨國(guó)推流

1.3 直播系統(tǒng)架構(gòu)組成

一個(gè)典型直播系統(tǒng)包括:

  • 采集端:攝像頭/OBS等,用于采集視頻音頻流。
  • 流媒體服務(wù)器:用于接收推流并分發(fā)(如 SRS)。
  • CDN 分發(fā)層:大規(guī)模分發(fā)直播內(nèi)容。
  • 播放器:觀眾端使用 flv.js、hls.js 等播放流。
  • 信令服務(wù):管理用戶、直播間狀態(tài)、聊天等。

二、系統(tǒng)技術(shù)架構(gòu)與選型

2.1 核心系統(tǒng)結(jié)構(gòu)

采用模塊化分層方式設(shè)計(jì):

  • API 服務(wù)層:基于 Spring Boot 構(gòu)建 REST 接口,處理房間創(chuàng)建、用戶信息等。
  • 媒體服務(wù)層:通過(guò) Docker 部署 SRS,接入 RTMP 推流、HTTP-FLV 拉流。
  • 實(shí)時(shí)互動(dòng)層:使用 WebSocket 進(jìn)行直播間聊天室通信。
  • 存儲(chǔ)層:使用 MinIO 對(duì)象存儲(chǔ)錄制回放內(nèi)容。
  • 前端播放器:使用 flv.js 播放直播流。

2.2 技術(shù)棧選型

模塊

技術(shù)

Web 框架

Spring Boot 3

數(shù)據(jù)庫(kù)

MySQL + Redis

流媒體服務(wù)

SRS (Simple RTMP Server)

消息通信

Spring WebSocket

對(duì)象存儲(chǔ)

MinIO

前端播放器

flv.js、Bootstrap、Thymeleaf

三、基于 Spring Boot 實(shí)現(xiàn)直播服務(wù)

3.1 直播間管理模塊(REST API)

實(shí)體類:LiveRoom

@Entity
@Table(name = "live_room")
public class LiveRoom {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String roomId;
    private String title;
    private String streamer;
    private String pushUrl;
    private String pullUrl;
}

Repository 接口

public interface LiveRoomRepository extends JpaRepository<LiveRoom, Long> {
    Optional<LiveRoom> findByRoomId(String roomId);
}

控制器接口

@RestController
@RequestMapping("/api/room")
public class LiveRoomController {


    @Autowired
    private LiveRoomRepository roomRepo;


    @PostMapping("/create")
    public ResponseEntity<?> createRoom(@RequestBody Map<String, String> payload) {
        String roomId = UUID.randomUUID().toString();
        String title = payload.get("title");
        String streamer = payload.get("streamer");


        LiveRoom room = new LiveRoom();
        room.setRoomId(roomId);
        room.setTitle(title);
        room.setStreamer(streamer);
        room.setPushUrl("rtmp://localhost:1935/live/" + roomId);
        room.setPullUrl("http://localhost:8080/live/" + roomId + ".flv");


        return ResponseEntity.ok(roomRepo.save(room));
    }


    @GetMapping("/{roomId}")
    public ResponseEntity<?> getRoom(@PathVariable String roomId) {
        return roomRepo.findByRoomId(roomId)
                .map(ResponseEntity::ok)
                .orElse(ResponseEntity.notFound().build());
    }
}

3.2 推流與拉流服務(wù)(SRS接入)

通過(guò) Docker 部署 SRS:

docker run -d --name srs \
  -p 1935:1935 -p 1985:1985 -p 8080:8080 \
  ossrs/srs:5

推流地址:rtmp://localhost:1935/live/{roomId} 拉流地址:http://localhost:8080/live/{roomId}.flv

使用 OBS 配置推流即可。

3.3 WebSocket 聊天服務(wù)

聊天處理器

@ServerEndpoint("/ws/chat/{roomId}")
@Component
public class ChatWebSocket {
    private static Map<String, Set<Session>> roomSessions = new ConcurrentHashMap<>();


    @OnOpen
    public void onOpen(Session session, @PathParam("roomId") String roomId) {
        roomSessions.computeIfAbsent(roomId, k -> ConcurrentHashMap.newKeySet()).add(session);
    }


    @OnMessage
    public void onMessage(String message, @PathParam("roomId") String roomId) {
        for (Session s : roomSessions.getOrDefault(roomId, Collections.emptySet())) {
            s.getAsyncRemote().sendText(message);
        }
    }


    @OnClose
    public void onClose(Session session, @PathParam("roomId") String roomId) {
        roomSessions.getOrDefault(roomId, Collections.emptySet()).remove(session);
    }
}

WebSocket 配置

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

3.4 前端直播播放頁(yè)面(Thymeleaf + flv.js)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>直播間</title>
  <script src="https://cdn.jsdelivr.net/npm/flv.js@1.6.2/dist/flv.min.js"></script>
  <link rel="stylesheet"  />
</head>
<body class="p-4">
<div class="container">
  <h2>歡迎來(lái)到直播間:<span id="title"></span></h2>
  <video id="liveVideo" class="w-100" controls></video>


  <div class="mt-3">
    <input type="text" id="chatInput" class="form-control" placeholder="輸入消息..." />
    <button class="btn btn-primary mt-2" onclick="sendMessage()">發(fā)送</button>
  </div>


  <div class="mt-3">
    <h5>聊天記錄</h5>
    <div id="chatBox" class="border p-2" style="height: 200px; overflow-y: scroll;"></div>
  </div>
</div>


<script>
  const roomId = new URLSearchParams(window.location.search).get("roomId");
  const videoUrl = "http://localhost:8080/live/" + roomId + ".flv";
  const ws = new WebSocket("ws://localhost:8080/ws/chat/" + roomId);


  if (flvjs.isSupported()) {
    const player = flvjs.createPlayer({type: 'flv', url: videoUrl});
    player.attachMediaElement(document.getElementById('liveVideo'));
    player.load();
    player.play();
  }


  ws.onmessage = function (event) {
    const chatBox = document.getElementById("chatBox");
    chatBox.innerHTML += `<div>${event.data}</div>`;
    chatBox.scrollTop = chatBox.scrollHeight;
  };


  function sendMessage() {
    const input = document.getElementById("chatInput");
    if (input.value) {
      ws.send(input.value);
      input.value = "";
    }
  }


  fetch("/api/room/" + roomId).then(res => res.json()).then(data => {
    document.getElementById("title").innerText = data.title;
  });
</script>
</body>
</html>

結(jié)語(yǔ)

通過(guò)本文的實(shí)戰(zhàn)內(nèi)容,我們使用 Spring Boot 框架,集成 SRS 流媒體服務(wù)器和 WebSocket 技術(shù),實(shí)現(xiàn)了一個(gè)從直播間創(chuàng)建、推流、拉流到聊天互動(dòng)的輕量級(jí)直播平臺(tái)。該系統(tǒng)適合用于中小型直播場(chǎng)景或企業(yè)自建內(nèi)部直播系統(tǒng),未來(lái)可進(jìn)一步擴(kuò)展如直播錄制、轉(zhuǎn)碼、多路直播、分布式架構(gòu)等功能。

責(zé)任編輯:武曉燕 來(lái)源: 路條編程
相關(guān)推薦

2023-11-30 10:21:48

虛擬列表虛擬列表工具庫(kù)

2023-04-12 11:18:51

甘特圖前端

2023-12-08 13:19:00

前端Reactour流行庫(kù)

2015-09-06 09:22:24

框架搭建快速高效app

2023-12-21 11:39:47

2023-12-28 08:01:17

SpringAPI數(shù)據(jù)

2023-07-15 18:26:51

LinuxABI

2020-12-17 06:48:21

SQLkafkaMySQL

2019-04-01 14:59:56

負(fù)載均衡服務(wù)器網(wǎng)絡(luò)

2023-12-11 13:05:21

2023-10-27 09:40:52

VitePressGatsby

2022-03-21 08:05:38

HTTP/1.1QUIC協(xié)議

2024-12-13 15:29:57

SpringSpringBeanJava

2024-06-19 09:58:29

2022-06-16 07:31:41

Web組件封裝HTML 標(biāo)簽

2021-09-07 09:40:20

Spark大數(shù)據(jù)引擎

2023-12-13 13:26:41

2024-05-13 09:28:43

Flink SQL大數(shù)據(jù)

2012-07-10 01:22:32

PythonPython教程

2020-08-14 07:58:03

代碼庫(kù)代碼開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

精品久久久久av影院| 蜜臀av一区二区在线免费观看| 99re66热这里只有精品8| 日韩一区欧美小说| 91精品国产综合久久香蕉922| 成人国产精品久久久网站| 亚洲精品一区| 国产亚洲短视频| 国产精品一二三视频| 91视频免费在观看| 电影中文字幕一区二区| 一区二区免费在线| 国产精品电影观看| 日韩激情小视频| 超碰在线亚洲| 色综合久久88色综合天天 | 水蜜桃在线视频| 久久久久久久久久久久久夜| 国产精品一香蕉国产线看观看| 色噜噜日韩精品欧美一区二区| 一呦二呦三呦精品国产| 欧美激情综合五月色丁香| 国产日韩在线视频| 欧美爱爱小视频| 亚洲人成亚洲精品| 91精品黄色片免费大全| 无码人妻精品一区二区蜜桃百度| 亚洲乱码在线观看| 国产精品一二| 精品国产一区二区三区四区在线观看 | 国产亚洲一区字幕| 国产精品一区二区三区久久久| 五月婷婷婷婷婷| 99re8这里有精品热视频8在线| 欧美午夜精品久久久久久人妖| 国产欧美日韩视频一区二区三区| 中文字幕+乱码+中文字幕明步| 欧美日韩亚洲一区二区三区在线| 亚洲第一区第二区| 日本 片 成人 在线| 色yeye免费人成网站在线观看| 国产成人精品网址| 国产精品免费久久久久久| 国产在线观看免费av| 九九亚洲视频| 精品国产乱码久久久久久图片 | 国产一级爱c视频| 国产1区2区3区在线| 成人国产在线观看| 国产精品入口夜色视频大尺度 | 久久av影院| 亚洲成人激情综合网| 裸体丰满少妇做受久久99精品| 国产xxxx在线观看| 久久综合综合久久综合| 欧美孕妇与黑人孕交| 免费一级片在线观看| 日韩一区二区在线免费| 亚洲区中文字幕| 大桥未久恸哭の女教师| 曰本一区二区| 一本在线高清不卡dvd| 日本高清不卡一区二区三区视频| 99re这里都是精品| 9a蜜桃久久久久久免费| 在线观看中文字幕码| 久久婷婷丁香| 欧美亚洲免费电影| 日本熟妇乱子伦xxxx| 欧美电影一区| 国产亚洲人成网站在线观看| 又大又长粗又爽又黄少妇视频| 日韩av黄色| 欧美日韩亚洲精品内裤| 久久久久久久午夜| 日本大片在线播放| 一区二区三区高清在线| 一区不卡字幕| 欧美精品videos另类| 日本一区二区三区免费乱视频| 欧美成人蜜桃| 日韩三级电影网| 久久丝袜美腿综合| 久久久久资源| 成人福利在线| 国产精品国产三级国产普通话99 | 成人乱人伦精品视频在线观看| 91porny九色| 日韩电影在线观看一区| 日本午夜人人精品| 在线视频1卡二卡三卡| 久久国产精品99久久久久久老狼 | 欧美成人官网二区| 佐山爱在线视频| 91九色鹿精品国产综合久久香蕉| 欧美成人vps| 国产高潮失禁喷水爽到抽搐| 欧美电影在线观看免费| 亚洲免费视频网站| 亚洲欧美va天堂人熟伦| 国产精品7m凸凹视频分类| 久久色精品视频| 久久精品亚洲无码| 欧美资源在线| 国产精品直播网红| 中文字幕在线播放不卡| 国产米奇在线777精品观看| 亚洲综合av影视| 污视频网站免费观看| 久久婷婷国产综合精品青草| 欧美午夜精品久久久久久蜜| 亚洲搞黄视频| 怡红院av一区二区三区| 精品视频免费在线播放| 成人国产精选| 欧美成人免费网站| www.黄色在线| 欧美三区不卡| 国产99视频精品免视看7| 精品乱子伦一区二区| 欧美激情一二三区| 18禁免费观看网站| 亚洲视频一起| 一区二区在线免费视频| 91看片在线播放| 国产精品1区二区.| 亚洲国产精品123| 亚洲妇女成熟| 亚洲第一中文字幕在线观看| 日韩av手机在线免费观看| 性娇小13――14欧美| 高清日韩一区| 国产激情在线观看| 欧美网站大全在线观看| 成年人网站免费看| 1024精品一区二区三区| 91在线观看免费网站| 草碰在线视频| 色欧美88888久久久久久影院| 蜜臀av粉嫩av懂色av| 综合久久99| 成人网页在线免费观看| 91在线观看| 在线一区二区三区做爰视频网站| 国产 中文 字幕 日韩 在线| 国内精品福利| 成人高清在线观看| 调教一区二区| 日韩一区二区三区视频在线观看| av在线播放中文字幕| 日韩精品每日更新| 日本不卡一区| 电影亚洲一区| 中文字幕无线精品亚洲乱码一区 | 激情综合网址| 国产经品一区二区| 图片区小说区亚洲| 精品国产一二三| 日韩精品一区三区| 成人一级视频在线观看| a级免费在线观看| 91大神精品| 69精品小视频| 你懂的视频在线免费| 色狠狠色狠狠综合| 日本午夜精品视频| 国产精品一区二区无线| 日韩激情视频一区二区| 国产成人精品亚洲线观看| 国语自产精品视频在线看一大j8| 日本高清视频网站| 欧美性猛交xxxx乱大交蜜桃| www在线观看免费视频| 日韩精品一级中文字幕精品视频免费观看 | 国产精品一区二区av影院萌芽| 亚洲男人天堂2024| 久久精品99北条麻妃| 国产精品乱码人人做人人爱| 99999精品| 亚洲毛片播放| 日本精品一区| 99视频有精品高清视频| 久久理论片午夜琪琪电影网| 神马久久精品| 欧美日韩三级一区| 久久激情免费视频| 26uuu国产在线精品一区二区| 青青在线视频观看| 久久久久久久久久久妇女| 俄罗斯精品一区二区三区| 成人免费短视频| xxx欧美精品| 午夜视频www| 欧美三日本三级三级在线播放| 五月婷婷一区二区| 久久久青草青青国产亚洲免观| 亚洲怡红院在线| 国产日韩一区二区三区在线| 亚洲视频在线二区| 国产精品一线| 国产日本欧美在线观看| 草美女在线观看| 中文字幕一精品亚洲无线一区| 精品久久久免费视频| 91极品美女在线| 午夜写真片福利电影网| 久久久国产午夜精品| 国产又粗又猛又爽又黄| 手机精品视频在线观看| 亚洲永久激情精品| 亚州av一区| 亚洲精品欧美日韩| 台湾佬中文娱乐久久久| 欧美激情一区二区三区高清视频| 国产三级电影在线| 亚洲黄一区二区| 国产激情视频在线播放| 欧美性一区二区| 日韩欧美国产亚洲| 亚洲精品中文字幕在线观看| 免费网站在线高清观看| aaa国产一区| 下面一进一出好爽视频| 免费一级片91| 日韩欧美精品在线观看视频| 亚洲视频免费| 久久久久亚洲av无码专区喷水| 伊甸园亚洲一区| 国产三区精品| 97视频一区| 91精品网站| gogo大尺度成人免费视频| 国产精品嫩草影院久久久| 亚洲第一av| 欧美中文字幕在线| 色戒汤唯在线| 97超级碰碰人国产在线观看| 波多野结依一区| 久久久久久久国产| 男男gaygays亚洲| 欧美成人精品在线观看| av免费看在线| 色综合导航网站| 最新av在线播放| 欧美尺度大的性做爰视频| 成人短视频在线| 久久婷婷国产麻豆91天堂| 精品麻豆一区二区三区| 久久精品成人一区二区三区| 日本激情在线观看| 久久久精品国产网站| 色呦呦在线资源| 国内精品伊人久久| 最新日韩精品| 国产国产精品人在线视| 电影亚洲一区| 91精品免费视频| baoyu135国产精品免费| 国产在线观看一区| 一区三区在线欧| 亚洲人成网站在线观看播放 | 国产·精品毛片| 亚洲av人人澡人人爽人人夜夜| av成人老司机| 最新av在线免费观看| 日韩欧美中文| 日韩欧美亚洲v片| 色777狠狠狠综合伊人| 日韩国产欧美精品| 日韩欧美一区免费| 国产系列第一页| 久久神马影院| 日本天堂免费a| 欧美日韩1区| 男女激烈动态图| 欧美日韩一区自拍 | 午夜在线视频| 美女福利视频一区| 手机在线免费av| 久久久久久久久亚洲| 欧美电影网站| 精品色蜜蜜精品视频在线观看| 国产91美女视频| 欧美a级理论片| 亚洲最大成人在线观看| 蜜桃精品视频在线| 国产精品99久久久精品无码| 成人av电影免费在线播放| 欧亚乱熟女一区二区在线| 国产女人水真多18毛片18精品视频 | 奇米影视首页 狠狠色丁香婷婷久久综合| 日本午夜一区| 色哟哟免费网站| 在线观看日韩av电影| 午夜两性免费视频| 国产麻豆成人传媒免费观看| 亚洲熟女一区二区三区| 欧美精彩视频一区二区三区| 久久国产美女视频| 亚洲3atv精品一区二区三区| 最近中文字幕在线免费观看| 日韩一本二本av| 深夜福利视频一区| 久久久成人精品视频| 波多野结衣中文在线| 91av视频在线观看| 亚洲精品自拍| 精品一区在线播放| 中文字幕人成人乱码| www.com毛片| 韩日av一区二区| 国产又粗又猛又爽视频| 一区二区三区欧美激情| 久久久久久久久久久影院| 精品人在线二区三区| 国产乱视频在线观看| 欧美二区在线播放| av一级久久| 免费久久久一本精品久久区| 亚洲电影在线一区二区三区| 国产无套粉嫩白浆内谢的出处| 国产乱人伦偷精品视频免下载 | 中文字幕中文字幕在线中一区高清| 国内精品久久久久久久影视蜜臀 | 欧美裸体bbwbbwbbw| 香蕉久久国产av一区二区| 久久精品最新地址| 成人免费黄色| 久久99久久99精品蜜柚传媒| 久久视频国产| www.com黄色片| 91热门视频在线观看| 久久露脸国语精品国产91| 91精品一区二区三区久久久久久 | 亚洲欧美在线视频免费| 欧美精选一区二区| 酒色婷婷桃色成人免费av网| 97精品在线观看| 日本免费一区二区三区视频| 欧美日韩喷水| 水野朝阳av一区二区三区| 日韩综合第一页| 亚洲午夜羞羞片| 国产99视频在线| 俺去了亚洲欧美日韩| 亚洲人成网站在线在线观看| 日本一区二区三不卡| 欧美在线免费| 中文字幕无人区二| 亚洲婷婷综合久久一本伊一区 | 亚洲激情专区| wwwww在线观看| 亚洲日本乱码在线观看| 国产免费不卡视频| 久久伊人色综合| 欧美不卡高清一区二区三区| 日韩欧美手机在线| 日本麻豆一区二区三区视频| 五月激情四射婷婷| 在线视频你懂得一区| 日韩亚洲视频在线观看| 国产成人涩涩涩视频在线观看 | 成人在线免费视频| 国产精品日本精品| 日韩免费av| 亚洲第一色av| 国产精品伦理一区二区| 这里只有精品国产| 久久综合亚洲社区| 91麻豆精品| 国产aaa免费视频| 成人禁用看黄a在线| 中文字幕日韩一区二区三区 | av在线免费网站| 999视频在线观看| 欧美精品午夜| 欧美精品 - 色网| 亚洲成人av电影| 欧美少妇bbw| 日韩av手机在线看| 俺要去色综合狠狠| 国产高清精品在线观看| 中文字幕乱码亚洲精品一区| 一区二区三区日| 久久久这里只有精品视频| 伦理一区二区| 欧美 日韩 国产一区| 1024成人网| 亚洲高清视频网站| 国产经典一区二区| 欧美成免费一区二区视频| 国产精品亚洲a| 亚洲人成7777| 香蕉人妻av久久久久天天| 国产专区欧美专区| 在线精品观看| 伊人久久久久久久久久久久久久| 日韩一区二区麻豆国产| 色资源二区在线视频| 大桥未久一区二区|