{"repo":"twtrubiks/django-chat-room","free":true,"listed":false,"github":"https://github.com/twtrubiks/django-chat-room","clone":"git clone https://github.com/twtrubiks/django-chat-room.git","description":"Django Channels 4 即時聊天室，整合 MediaMTX 進化成低延遲（WebRTC < 1 秒）直播間 — 影像、彈幕、房間狀態各司其職","language":"Python","stars":60,"topics":["chat-room","channels","django","docker","websocket","live-streaming","mediamtx","webrtc"],"license":"MIT","category":"deployment-docker-iac","readme_excerpt":"docker-django-chat-room use django-channels 4💬 搭配 MediaMTX 直播 Youtube Tutorial - chat-room use django-channels2 前言 這篇文章是 django-channels2-tutorial 的改良版，主要加上美化以及資料庫， 又整合了 MediaMTX，讓聊天室進化成 直播間 （畫面 + 即時聊天）。 為什麼是這個組合？因為直播的價值在於「即時互動」，而互動需要 低延遲 。 傳統 HLS 延遲 10-30 秒（本專案 MediaMTX 預設走 Low-Latency HLS，約 2-5 秒）， 觀眾的留言仍容易對不上主播當下在講什麼； WebRTC 延遲 < 1 秒，彈幕才有意義。 已經有 Channels 的即時訊息基礎，MediaMTX 提供 < 1 秒的 WebRTC 影像，兩者各司其職、耦合度低： MediaMTX 負責影像（推流、播放） Django + Channels 負責聊天、身分、房間狀態 執行畫面 直接瀏覽 http://localhost:8000/chat/ 未登入無法聊天（ 也無法看到聊天內容，也無法觀看直播 ） 直播畫面 聊天畫面 分享位置（使用 Leaflet 搭配 OpenStreetMap 圖資） 如何執行 確認電腦有安裝 docker 後，直接執行以下指令即可， 會啟動四個服務： 服務 說明 ------ ------ app Django + Daphne（ :8000 ） redis Channels channel layer（ :6379 ） mediamtx 串流伺服器（RTMP :1935 、HLS :8888 、WebRTC / WHIP :8889 、ICE :8189/udp ） reconciler 每 30 秒對帳 Room.is live 與 MediaMTX 實際狀態 如何移除 ( 包含移除 volume )， 詳細說明，在上一篇 django-channels2-tutorial 都說明過了。 直播間 架構 低侵入設計 Room model 是 選用 的，房名與 MediaMTX 的 stream path 一對一對應： 沒有註冊 Room 的房名，維持原本純聊天室的行為 （自由進入、沒有直播區塊）。 因此 Message.group name 完全不用動，可以聚焦在直播功能本身。 name 用 SlugField 而非 TextField ，因為它會直接變成 MediaMTX 的 path 與 URL 的一部分，必須限制字元； 另外用 RegexValidator(r'^\\w+$') 排除 slug 預設允許的 - ，以相容 WebSocket routing 的正則 開設直播間 登入後從首頁點「開設直播間」，或直接開 http://localhost:8000/chat/create/。 建立後你就是房主，每人最多 5 個（ settings.MAX LIVE ROOMS PER USER ）。 首頁會列出所有直播間（直播中優先、每頁 12 筆）。 房主在自己的房間會多看到一塊「推流資訊面板」（非房主看不到），可以： 取得 OBS 伺服器位址與串流金鑰 一鍵用瀏覽器推流（WHIP） 重新產生金鑰 （金鑰外洩時自行輪替，舊金鑰下次推流即失效） 刪除直播間 （聊天記錄會一併刪除，見下方安全性說明） 開始推流 方法一， OBS ： 伺服器： rtmp://localhost:193","default_branch":null,"files":null,"tree":[],"storefront":"/r/twtrubiks","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/twtrubiks/django-chat-room/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}