Skip to content

suoten/streambridge

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

3 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

StreamBridge

ไธ€ไธชๆ–‡ไปถ,่ฎฉๆ‘„ๅƒๅคด่ฟžไธŠๆต่งˆๅ™จ โ€”โ€” ๅ•ไบŒ่ฟ›ๅˆถใ€้›ถๅค–้ƒจไพ่ต–็š„ๅ…จๅ่ฎฎๆตๅช’ไฝ“็ฝ‘ๅ…ณ

็ฎ€ไฝ“ไธญๆ–‡ | English

License: MIT Go Version Edition GitHub Release GitHub Stars GitHub Downloads Build Gitee Release

๐ŸŒŸ ๅฆ‚ๆžœ StreamBridge ๅธฎๅˆฐไบ†ไฝ ,ๆฌข่ฟŽ ็‚นไธช Star ๆ”ฏๆŒไธ€ไธ‹!

๐ŸŽฏ ้€‚็”จๅœบๆ™ฏ

ๅœบๆ™ฏ ๆ่ฟฐ
๐Ÿ“ท ๅฎ‰้˜ฒ็›‘ๆŽง ๆตทๅบท/ๅคงๅŽ/ๅฎ‡่ง†ๆ‘„ๅƒๅคด โ†’ ๆต่งˆๅ™จ้›†ไธญๆŸฅ็œ‹
๐Ÿญ ๅทฅไธšๅฏ่ง†ๅŒ– ไบง็บฟๆ‘„ๅƒๅคด โ†’ ๅคงๅฑๅฑ•็คบ
๐Ÿ”— GB28181 ๅนณๅฐ ไฝœไธบๆต่งˆๅ™จๆ’ญๆ”พ็ฝ‘ๅ…ณ(ๅชๆŽฅ RTP/PS,ไธๅ‚ไธŽ SIP)
๐Ÿ“ฑ ็‰ฉ่”็ฝ‘่ฎพๅค‡ RTSP ่ฎพๅค‡ โ†’ Web/ๅพฎไฟกๅฐ็จ‹ๅบ/Android/iOS ๆ’ญๆ”พ
๐ŸŽฌ ็›ดๆ’ญ่ฝฌ็  RTMP ๆŽจๆต โ†’ HLS/WebRTC ๅˆ†ๅ‘

๐Ÿ“ธ ๆผ”็คบๆ•ˆๆžœ

ๆˆชๅ›พๅพ…่กฅๅ……,้ฆ–ๆฌกๅฏๅŠจๅŽ่ฎฟ้—ฎ http://localhost:8080 ๅณๅฏ็œ‹ๅˆฐๅฎž้™…็•Œ้ข


StreamBridge ๆŠŠๅทฅไธš/ๅฎ‰้˜ฒๆ‘„ๅƒๅคด(RTSP/RTMP/RTP/PS)็š„่ง†้ข‘ๆต,่ฝฌๆขไธบๆต่งˆๅ™จๅฏ็›ดๆŽฅๆ’ญๆ”พ็š„ๆ ผๅผ(WebSocket-FLV / HLS / WebRTC)ใ€‚

ไธๅšๅนณๅฐ:ไธๅŒ…ๅซ GB28181 SIP ไฟกไปคใ€PTZ ๆŽงๅˆถใ€ๅฝ•ๅƒ็ฎก็†ใ€ONVIF ๅ‘็Žฐ โ€”โ€” ่ฟ™ไบ›็”ฑไธŠๆธธๅนณๅฐ่ดŸ่ดฃใ€‚StreamBridge ๅชๅšไธ€ไปถไบ‹:ๆŠŠไธŠๆธธๅทฒ็ปๅๅ•†ๅฅฝ็š„่ง†้ข‘ๆต,่ฝฌ็ /่ฝฌๅฐ่ฃ…ไธบๆต่งˆๅ™จๅฏๆ’ญๆ”พ็š„ๆ ผๅผใ€‚


โœจ ๆ ธๅฟƒ็‰นๆ€ง

  • ๐Ÿš€ ้›ถ้…็ฝฎๅฏๅŠจ:ไธ‹่ฝฝไธ€ไธชไบŒ่ฟ›ๅˆถๆ–‡ไปถ,ๅŒๅ‡ปๅณๅฏ่ฟ่กŒ,5 ๅˆ†้’Ÿๅฏ็”จ
  • ๐Ÿ“ฆ ๅ•ๆ–‡ไปถ้ƒจ็ฝฒ:ๆ—  Docker / FFmpeg / ZLMediaKit ไพ่ต–,1C1G ๆœๅŠกๅ™จๅฏ่ท‘ 20+ ่ทฏ 1080P
  • ๐Ÿ”„ ๅ…จๅ่ฎฎ่พ“ๅ…ฅ:RTSP / RTMP / RTP/PS / MP4 ๆ–‡ไปถ / HTTP-FLV / HLS
  • ๐Ÿ“บ ๆต่งˆๅ™จๅ‹ๅฅฝ:WebSocket-FLV(ไธปๆŽจ) / HLS / WebRTC WHEP ไธ‰็ง่พ“ๅ‡บ
  • ๐ŸŽฅ H265 ๅ…ผๅฎน:ๅ†…็ฝฎ H265โ†’H264 ่ฝฏไปถ่ฝฌ็ ,่งฃๅ†ณๆต่งˆๅ™จ H265 ไธๅ…ผๅฎน
  • ๐Ÿ“ฑ ๅ…จๅนณๅฐ SDK:JavaScript / ๅพฎไฟกๅฐ็จ‹ๅบ / Android / iOS,็คพๅŒบ็‰ˆๅ…จ้ƒจๅ…่ดน
  • ๐ŸŒ ่ทจๅนณๅฐ:Windows / Linux / macOS / Docker / K8s ๅ…จๅนณๅฐๆ”ฏๆŒ
  • ๐Ÿ”“ ๆฐธไน…ๅ…่ดน:MIT ๅ่ฎฎ,ๅฏๅ•†็”จ,ๆ— ๅŠŸ่ƒฝ้™ๅˆถ

๐Ÿ“– ็›ฎๅฝ•


๐Ÿ“ฆ ไธ‹่ฝฝๅฎ‰่ฃ…

ๆ–นๅผ 1:็›ดๆŽฅไธ‹่ฝฝไบŒ่ฟ›ๅˆถ(ๆŽจ่ๅฐ็™ฝ็”จๆˆท)

ๆ‰“ๅผ€ไปปไธ€ไป“ๅบ“็š„ Releases ้กต้ข,ๆ นๆฎๆ“ไฝœ็ณป็ปŸไธ‹่ฝฝๅฏนๅบ”ๆ–‡ไปถ:

็ณป็ปŸ ๆžถๆž„ ๆ–‡ไปถๅ GitHub ไธ‹่ฝฝ Gitee ไธ‹่ฝฝ(ๅ›ฝๅ†…ๆ›ดๅฟซ)
Windows x86_64 streambridge-windows-amd64.exe GitHub Release Gitee Release
Linux x86_64 streambridge-linux-amd64 GitHub Release Gitee Release
Linux ARM64 streambridge-linux-arm64 GitHub Release Gitee Release
macOS Apple Silicon streambridge-darwin-arm64 GitHub Release Gitee Release

๐Ÿ’ก ๅ›ฝๅ†…็”จๆˆทๅปบ่ฎฎ็”จ Gitee:ไธ‹่ฝฝ้€Ÿๅบฆๆฏ” GitHub ๅฟซ 10 ๅ€ไปฅไธŠใ€‚

ไธ‹่ฝฝๅŽๆ— ้œ€ๅฎ‰่ฃ…,็›ดๆŽฅ่ฟ่กŒ:

# Linux / macOS(้œ€่ต‹ไบˆๆ‰ง่กŒๆƒ้™)
chmod +x streambridge-linux-amd64
./streambridge-linux-amd64

# Windows
# ๅŒๅ‡ป streambridge-windows-amd64.exe ๅณๅฏ,ไผšๅผนๅ‡บ้ป‘่‰ฒ็ช—ๅฃ(ไธ่ฆๅ…ณ้—ญ)

ๆ–นๅผ 2:ๅ‘ฝไปค่กŒไธ€้”ฎไธ‹่ฝฝ(้€‚ๅˆ Linux ๆœๅŠกๅ™จ)

# ๅ›ฝๅ†…ๆœๅŠกๅ™จ(่ตฐ Gitee)
LATEST_URL=$(curl -s https://gitee.com/api/v5/repos/suoten/streambridge/releases/latest \
  | grep -oP '"browser_download_url"\s*:\s*"\K[^"]*streambridge-linux-amd64"' \
  | head -1 | tr -d '"')

# GitHub(ๆตทๅค–ๆœๅŠกๅ™จ)
# LATEST_URL=$(curl -s https://api.github.com/repos/suoten/streambridge/releases/latest \
#   | grep "browser_download_url.*streambridge-linux-amd64\"" \
#   | cut -d '"' -f 4)

curl -L -o /usr/local/bin/streambridge "$LATEST_URL"
chmod +x /usr/local/bin/streambridge
streambridge

ๆ–นๅผ 3:Docker(้€‚ๅˆๅฎนๅ™จๅŒ–้ƒจ็ฝฒ)

# ๅฟซ้€Ÿไฝ“้ชŒ
docker run -d --name streambridge -p 8080:8080 --restart unless-stopped \
  --pull always \
  suoten/streambridge:latest

# ๅฎŒๆ•ดๅŠŸ่ƒฝ(ๅซ RTMP / RTP)
docker run -d --name streambridge \
  -p 8080:8080 -p 1935:1935 \
  -p 20000-30000:20000-30000/udp \
  --restart unless-stopped \
  suoten/streambridge:latest

้•œๅƒๅœฐๅ€:

  • Docker Hub:suoten/streambridge:latest
  • ๅ›ฝๅ†…้•œๅƒ(้˜ฟ้‡Œไบ‘):registry.cn-hangzhou.aliyuncs.com/suoten/streambridge:latest

ๆ–นๅผ 4:ไปŽๆบ็ ็ผ–่ฏ‘(้œ€่ฆ Go 1.22+)

git clone https://gitee.com/suoten/streambridge.git
cd streambridge
make build          # ๅฝ“ๅ‰ๅนณๅฐ
make build-all      # ๅ…จๅนณๅฐไบคๅ‰็ผ–่ฏ‘

่ฏฆ่ง ่‡ช่กŒ็ผ–่ฏ‘ ็ซ ่Š‚ใ€‚


๐Ÿš€ 60 ็ง’ๆž้€ŸไธŠๆ‰‹

้ฆ–ๆฌก่ฎฟ้—ฎ

ไธ‹่ฝฝ่ฟ่กŒๅŽ,ๆต่งˆๅ™จๆ‰“ๅผ€ http://localhost:8080(ๆœฌๆœบ)ๆˆ– http://ๆœๅŠกๅ™จIP:8080(่ฟœ็จ‹),ไฝ ไผš็œ‹ๅˆฐ:

  • ๆ’ญๆ”พๅ™จๆต‹่ฏ•้กต:่พ“ๅ…ฅ RTSP ๅœฐๅ€ๅณๅฏๆ’ญๆ”พ
  • ็คบไพ‹ๆตๆŒ‰้’ฎ:็‚นๅ‡ปๅณๅฏ็œ‹ๅˆฐๆผ”็คบ็”ป้ข(ๆ— ้œ€ๆ‘„ๅƒๅคด)
  • ๆตๅˆ—่กจ:ๅฝ“ๅ‰ๆดป่ทƒๆตไธŽ่ง‚็œ‹ไบบๆ•ฐ
  • API ๆ–‡ๆกฃ:http://localhost:8080/api/docs

็ฌฌไธ€ๆฌกๆ’ญๆ”พๆ‘„ๅƒๅคด(้›ถไปฃ็ )

  1. ๆต่งˆๅ™จๆ‰“ๅผ€ http://localhost:8080
  2. ่พ“ๅ…ฅๆก†็ฒ˜่ดด RTSP ๅœฐๅ€(ไพ‹:ๆตทๅบท rtsp://admin:abc12345@192.168.1.64:554/Streaming/Channels/101)
  3. ็‚นๅ‡ปใ€Œๆ’ญๆ”พใ€ๆŒ‰้’ฎ โœ…

ไธปๆตๆ‘„ๅƒๅคด RTSP ๅœฐๅ€้€ŸๆŸฅ

ๅ“็‰Œ ้ป˜่ฎคๅœฐๅ€
ๆตทๅบทๅจ่ง† rtsp://admin:<ๅฏ†็ >@<IP>:554/Streaming/Channels/101
ๅคงๅŽ rtsp://admin:<ๅฏ†็ >@<IP>:554/cam/realmonitor?channel=1&subtype=0
ๅฎ‡่ง† rtsp://admin:<ๅฏ†็ >@<IP>:554/media/video1
้€š็”จ ONVIF ้€š่ฟ‡ NVR ่Žทๅ–

ไธ€้”ฎ่ฏŠๆ–ญ

streambridge doctor
# ่‡ชๅŠจๆฃ€ๆŸฅ็ซฏๅฃใ€้…็ฝฎใ€ๆต่งˆๅ™จๅ…ผๅฎนๆ€งใ€็ฝ‘็ปœ่ฟž้€šๆ€ง

ๆˆ–ๆต่งˆๅ™จๆ‰“ๅผ€ http://localhost:8080/doctorใ€‚

ๅฅๅบทๆฃ€ๆŸฅ

curl http://localhost:8080/api/health
# {"status":"ok","version":"v1.0.0","uptime":123,"streams":0,"viewers":0}

๐Ÿ“ฑ ๅฎขๆˆท็ซฏ SDK

็คพๅŒบ็‰ˆๆฐธไน…ๅ…่ดนๆไพ›ๆ‰€ๆœ‰ๅนณๅฐ SDK,่ฏฆ่ง sdk/README.mdใ€‚

ๅนณๅฐ ๆ–‡ไปถ ๆ’ญๆ”พๆ–นๅผ
ๆต่งˆๅ™จ sdk/javascript/streambridge.js WebSocket-FLV (MSE) / HLS / WebRTC
ๅพฎไฟกๅฐ็จ‹ๅบ sdk/wechat-miniprogram/streambridge.js HLS
Android sdk/android/StreamBridgeView.java HLS (ExoPlayer)
iOS sdk/ios/StreamBridgePlayerView.swift HLS (AVPlayer)

ๆต่งˆๅ™จไธ€่กŒๆ’ญๆ”พ

<div id="player"></div>
<script src="http://localhost:8080/streambridge.js"></script>
<script>
  StreamBridge.play({
    container: '#player',
    source: 'rtsp://admin:abc12345@192.168.1.64:554/Streaming/Channels/101',
  });
</script>

โš™๏ธ ้…็ฝฎ่ฏดๆ˜Ž

StreamBridge ๆ”ฏๆŒ้›ถ้…็ฝฎๅฏๅŠจ,ไนŸๅฏ้€š่ฟ‡ -c config.yaml ๆŒ‡ๅฎš้…็ฝฎๆ–‡ไปถใ€‚ๅฎŒๆ•ด็คบไพ‹่ง configs/streambridge.yamlใ€‚

server:
  http_port: 8080          # HTTP ็ซฏๅฃ
  rtmp_port: 1935          # RTMP ๆŽจๆต็ซฏๅฃ
  whep_port: 1985          # WebRTC ไฟกไปค็ซฏๅฃ
  bind_addr: "0.0.0.0"     # ็›‘ๅฌๅœฐๅ€

log:
  level: info              # debug | info | warn | error

performance:
  max_streams: 500                  # ๆœ€ๅคงๅนถๅ‘ๆตๆ•ฐ
  max_viewers_per_stream: 50        # ๅ•่ทฏๆตๆœ€ๅคง่ง‚็œ‹ไบบๆ•ฐ
  enable_h265_transcode: false      # ๆ˜ฏๅฆๅฏ็”จ H265->H264 ่ฝฌ็ 

input:
  rtp:
    listen: "0.0.0.0"
    port_range: [20000, 30000]      # RTP ๅช’ไฝ“็ซฏๅฃ่Œƒๅ›ด
    mode: passive                   # ่ขซๅŠจๆŽฅๆ”ถ(GB28181 ๅนณๅฐ่ฝฌๅ‘)

security:
  enable_auth: false                # ๆ˜ฏๅฆๅฏ็”จ Token ้‰ดๆƒ
  secret_key: "่ฏทไฟฎๆ”นไธบ้šๆœบๅญ—็ฌฆไธฒ"
  allow_origins: ["*"]              # CORS ่ทจๅŸŸ็™ฝๅๅ•

ๅ‘ฝไปค่กŒๅ‚ๆ•ฐ

streambridge                                    # ้›ถ้…็ฝฎๅฏๅŠจ
streambridge -c /etc/streambridge/config.yaml   # ๆŒ‡ๅฎš้…็ฝฎๆ–‡ไปถ
streambridge --http-port 9090 --log-level debug
streambridge doctor                             # ไธ€้”ฎ่ฏŠๆ–ญ
streambridge version                            # ๆŸฅ็œ‹็‰ˆๆœฌ

๐Ÿ“ก REST API ๆ–‡ๆกฃ

ๅฏๅŠจๆต(่ฟ”ๅ›ž WebSocket/HLS ๅœฐๅ€)

GET /api/play?url=<rtsp-url>&format=flv

ๅ“ๅบ”:

{
  "wsUrl": "ws://localhost:8080/ws/abc123",
  "streamId": "abc123",
  "format": "flv",
  "source": "rtsp://..."
}

ๅฏๅŠจ HLS ๆต

GET /hls/play?url=<rtsp-url>

ๅ“ๅบ”:

{
  "streamId": "abc123",
  "hlsUrl": "http://localhost:8080/hls/abc123.m3u8"
}

ๅœๆญขๆต

POST /api/stop?id=<streamId>

ๆŸฅ่ฏขๆดป่ทƒๆต

GET /api/streams

ๅฅๅบทๆฃ€ๆŸฅ

GET /api/health

ๆ–‡ไปถๅ›žๆ”พ

POST /api/file/play
Content-Type: application/json

{"path": "/data/video.mp4", "loop": true}

RTP ็›‘ๅฌ(ๅฏนๆŽฅ GB28181 ๅนณๅฐ)

POST /api/rtp/listen
Content-Type: application/json

{"port": 20000, "mode": "ps"}

Prometheus ๆŒ‡ๆ ‡

GET /metrics

ๅฎŒๆ•ด็ซฏ็‚นๅˆ—่กจ

็ซฏ็‚น ๆ–นๆณ• ่ฏดๆ˜Ž
/api/health GET ๅฅๅบทๆฃ€ๆŸฅ
/api/ready GET ๅฐฑ็ปชๆฃ€ๆŸฅ
/api/version GET ็‰ˆๆœฌไฟกๆฏ
/api/play GET ๅฏๅŠจๆต(่ฟ”ๅ›ž ws/flv ๅœฐๅ€)
/api/stop POST ๅœๆญขๆต
/api/streams GET ๆดป่ทƒๆตๅˆ—่กจ
/api/stats?id=<id> GET ๅ•่ทฏๆต็ปŸ่ฎก
/api/file/play POST ๆ–‡ไปถๅ›žๆ”พ
/api/rtp/listen POST RTP ็›‘ๅฌ
/api/demo GET ๆผ”็คบๆตๅœฐๅ€
/api/logs GET ๆ—ฅๅฟ—ไบ‹ไปถๆต(SSE)
/metrics GET Prometheus ๆŒ‡ๆ ‡
/ws/<streamId> WS WebSocket-FLV ๆŽจๆต
/live/<streamId> GET HTTP-FLV ็›ดๅ‡บ
/hls/<streamId>.m3u8 GET HLS ๆ’ญๆ”พๅˆ—่กจ
/hls/<streamId>/<seg>.ts GET HLS ๅˆ‡็‰‡
/whep/<streamId> POST WebRTC WHEP ไฟกไปค

๐Ÿ”— ไธŽ GB28181 ๅนณๅฐๅไฝœ

StreamBridge ไธๅ‚ไธŽ SIP ไฟกไปค/PTZ/ๅฝ•ๅƒ,ๅชๆŽฅๆ”ถไธŠๆธธๅนณๅฐ่ฝฌๅ‘็š„ RTP/PS ๅช’ไฝ“ๆต:

[ๆ‘„ๅƒๅคด] โ”€โ”€SIPโ”€โ”€โ†’ [GB28181 ๅนณๅฐ] โ”€โ”€RTP/PSโ”€โ”€โ†’ [StreamBridge] โ”€โ”€WebSocket-FLVโ”€โ”€โ†’ [ๆต่งˆๅ™จ]
                       โ”‚
                       โ””โ”€โ”€ PTZ/ๅฏน่ฎฒ/ๅฝ•ๅƒ ็”ฑๅนณๅฐ่ดŸ่ดฃ

้…็ฝฎๆญฅ้ชค

  1. ๅœจ StreamBridge ้…็ฝฎไธญๅผ€ๅฏ RTP ๆŽฅๆ”ถ:
input:
  rtp:
    listen: "0.0.0.0"
    port_range: [20000, 30000]
    mode: passive
    ps_depacketize: true
  1. ๅœจ GB28181 ๅนณๅฐไพง้…็ฝฎ:

    • ๅช’ไฝ“ๆœๅŠกๅ™จ IP = StreamBridge IP
    • ๅช’ไฝ“็ซฏๅฃ่Œƒๅ›ด = 20000-30000
  2. ๅนณๅฐ INVITE ๆ—ถไผš่‡ชๅŠจๆŠŠๅช’ไฝ“ๆต่ฝฌๅ‘ๅˆฐ StreamBridge,StreamBridge ่‡ชๅŠจ่งฃๅฐ่ฃ… PS โ†’ H264/AAC โ†’ ่ฝฌ FLV ่พ“ๅ‡บใ€‚


๐Ÿญ ็”Ÿไบง้ƒจ็ฝฒ

StreamBridge ๅ•ไบŒ่ฟ›ๅˆถๅณๅฏ็”Ÿไบงๅฏ็”จ,ไปฅไธ‹่ฆ†็›–ๅ„็ฑป้ƒจ็ฝฒๅœบๆ™ฏ,ๆŒ‰้œ€้€‰ๆ‹ฉไธ€็งๅณๅฏใ€‚

ๅœบๆ™ฏ 1:Linux systemd ๆœๅŠก(ๆŽจ่)

้€‚ๅˆ Linux ๆœๅŠกๅ™จใ€ไบ‘ไธปๆœบใ€VPS,ๅผ€ๆœบ่‡ชๅฏ + ๅดฉๆบƒ่‡ชๅŠจ้‡ๅฏใ€‚

# 1. ๅˆ›ๅปบไธ“็”จ็”จๆˆท
sudo useradd -r -s /bin/false streambridge

# 2. ๅ‡†ๅค‡็›ฎๅฝ•ไธŽๆ–‡ไปถ
sudo mkdir -p /etc/streambridge /var/log/streambridge
sudo cp configs/streambridge.yaml /etc/streambridge/config.yaml
sudo cp bin/streambridge-linux-amd64 /usr/local/bin/streambridge
sudo chown -R streambridge:streambridge /etc/streambridge /var/log/streambridge

# 3. ๅ†™ๅ…ฅ systemd ๆœๅŠก
sudo tee /etc/systemd/system/streambridge.service > /dev/null <<'EOF'
[Unit]
Description=StreamBridge Gateway
After=network.target

[Service]
Type=simple
User=streambridge
ExecStart=/usr/local/bin/streambridge -c /etc/streambridge/config.yaml
Restart=always
RestartSec=5
LimitNOFILE=65535
StandardOutput=append:/var/log/streambridge/streambridge.log
StandardError=append:/var/log/streambridge/streambridge.log

[Install]
WantedBy=multi-user.target
EOF

# 4. ๅฏๅŠจๅนถ่ฎพ็ฝฎๅผ€ๆœบ่‡ชๅฏ
sudo systemctl daemon-reload
sudo systemctl enable --now streambridge
sudo systemctl status streambridge

# ๅธธ็”จๅ‘ฝไปค
sudo systemctl restart streambridge   # ้‡ๅฏ
sudo systemctl stop streambridge      # ๅœๆญข
sudo journalctl -u streambridge -f    # ๆŸฅ็œ‹ๅฎžๆ—ถๆ—ฅๅฟ—

ๅœบๆ™ฏ 2:Windows NSSM ๆœๅŠก(ๆŽจ่ Windows ็”จๆˆท)

้€‚ๅˆ Windows Serverใ€Windows 10/11 ๆกŒ้ข,ๅ…ณๆœบ้‡ๅฏๅŽ่‡ชๅŠจ่ฟ่กŒ,้ป‘็ช—ๅฃไธไผšๆ„ๅค–ๅ…ณ้—ญใ€‚

# 1. ไธ‹่ฝฝ NSSM:https://nssm.cc/download
# 2. ่งฃๅŽ‹ๅŽๆŠŠ nssm.exe ๆ”พๅˆฐ C:\Windows\System32\ ๆˆ–ๅฝ“ๅ‰็›ฎๅฝ•

# 3. ๅฎ‰่ฃ…ๆœๅŠก
nssm install StreamBridge "C:\Program Files\StreamBridge\streambridge.exe"
nssm set StreamBridge AppDirectory "C:\Program Files\StreamBridge"
nssm set StreamBridge AppParameters "-c C:\Program Files\StreamBridge\config.yaml"
nssm set StreamBridge AppStdout "C:\Program Files\StreamBridge\logs\stdout.log"
nssm set StreamBridge AppStderr "C:\Program Files\StreamBridge\logs\stderr.log"
nssm set StreamBridge AppRotateFiles 1
nssm set StreamBridge AppRotateBytes 104857600

# 4. ๅฏๅŠจ
nssm start StreamBridge

# ๅธธ็”จๅ‘ฝไปค
nssm restart StreamBridge   # ้‡ๅฏ
nssm stop StreamBridge      # ๅœๆญข
nssm remove StreamBridge    # ๅธ่ฝฝๆœๅŠก

ๅœบๆ™ฏ 3:ๅฎๅก”้ขๆฟ(BT Panel)

้€‚ๅˆๅ›ฝๅ†…ไบ‘ๆœๅŠกๅ™จ็”จๆˆท,ไฝฟ็”จๅฎๅก”็š„ใ€Œ่ฟ›็จ‹ๅฎˆๆŠค็ฎก็†ๅ™จใ€ๆ’ไปถ + ๅๅ‘ไปฃ็†,ๅฏ่ง†ๅŒ–ๆ“ไฝœใ€‚

ๆญฅ้ชคไธ€:ๅฎ‰่ฃ… StreamBridge

# SSH ็™ปๅฝ•ๆœๅŠกๅ™จๅŽๆ‰ง่กŒ
mkdir -p /www/wwwroot/streambridge
cd /www/wwwroot/streambridge

# ไธ‹่ฝฝไบŒ่ฟ›ๅˆถ(่ตฐ Gitee)
curl -L -o streambridge https://gitee.com/suoten/streambridge/releases/latest/download/streambridge-linux-amd64
chmod +x streambridge

# ๅคๅˆถ้ป˜่ฎค้…็ฝฎ
curl -L -o config.yaml https://gitee.com/suoten/streambridge/raw/main/configs/streambridge.yaml

# ๆต‹่ฏ•ไธ€ไธ‹่ƒฝๅฆๅฏๅŠจ
./streambridge -c config.yaml
# ็œ‹ๅˆฐ "listening on :8080" ๅŽๆŒ‰ Ctrl+C ้€€ๅ‡บ

ๆญฅ้ชคไบŒ:ๅœจๅฎๅก”้ขๆฟๅฎ‰่ฃ…่ฟ›็จ‹ๅฎˆๆŠค็ฎก็†ๅ™จ

  1. ็™ปๅฝ•ๅฎๅก”้ขๆฟ โ†’ ่ฝฏไปถๅ•†ๅบ— โ†’ ๆœ็ดขใ€Œ่ฟ›็จ‹ๅฎˆๆŠค็ฎก็†ๅ™จใ€ โ†’ ๅฎ‰่ฃ…
  2. ๆ‰“ๅผ€่ฟ›็จ‹ๅฎˆๆŠค็ฎก็†ๅ™จ โ†’ ๆทปๅŠ ๅฎˆๆŠค่ฟ›็จ‹
    • ๅ็งฐ:StreamBridge
    • ๅฏๅŠจ็”จๆˆท:root
    • ่ฟ่กŒ็›ฎๅฝ•:/www/wwwroot/streambridge
    • ๅฏๅŠจๅ‘ฝไปค:/www/wwwroot/streambridge/streambridge -c /www/wwwroot/streambridge/config.yaml
    • ่ฟ›็จ‹ๆ•ฐ้‡:1
  3. ็‚นๅ‡ปใ€Œไฟๅญ˜ใ€ๅนถๅฏๅŠจ

ๆญฅ้ชคไธ‰:้…็ฝฎๅๅ‘ไปฃ็† + HTTPS(ๅฏ้€‰,ๅ…ฌ็ฝ‘่ฎฟ้—ฎ็”จ)

  1. ๅฎๅก”้ขๆฟ โ†’ ็ฝ‘็ซ™ โ†’ ๆทปๅŠ ็ซ™็‚น
    • ๅŸŸๅ:stream.example.com(้œ€ๆๅ‰่งฃๆžๅˆฐๆœๅŠกๅ™จ)
    • ๆ น็›ฎๅฝ•:ไปปๆ„(ๅฏๅปบไธ€ไธช็ฉบ็›ฎๅฝ•)
    • PHP ็‰ˆๆœฌ:็บฏ้™ๆ€
  2. ็ซ™็‚น่ฎพ็ฝฎ โ†’ ๅๅ‘ไปฃ็† โ†’ ๆทปๅŠ ๅๅ‘ไปฃ็†
    • ไปฃ็†ๅ็งฐ:StreamBridge
    • ็›ฎๆ ‡ URL:http://127.0.0.1:8080
    • ๅ‘้€ๅŸŸๅ:$host
  3. ็ซ™็‚น่ฎพ็ฝฎ โ†’ SSL โ†’ Let's Encrypt โ†’ ็”ณ่ฏทๅ…่ดน่ฏไนฆ โ†’ ๅผบๅˆถ HTTPS
  4. ็ซ™็‚น่ฎพ็ฝฎ โ†’ ้…็ฝฎๆ–‡ไปถ,ๅœจ location / ๅŽๅขžๅŠ  WebSocket ๆ”ฏๆŒ(ๅฆๅˆ™ ws-flv ไธ้€š):
location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # WebSocket ๆ”ฏๆŒ(ๅฟ…้œ€,ๅฆๅˆ™ ws-flv ๆ— ๆณ•ๆ’ญๆ”พ)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 86400;
}

# HLS ๅˆ‡็‰‡็ผ“ๅญ˜ไผ˜ๅŒ–
location /hls/ {
    proxy_pass http://127.0.0.1:8080;
    expires 10s;
    add_header Cache-Control "public";
}
  1. ไฟๅญ˜ โ†’ ้‡ๅฏ Nginx

ๆญฅ้ชคๅ››:ๅฎๅก”้˜ฒ็ซๅข™ๆ”พ่กŒ็ซฏๅฃ

ๅฎๅก”้ขๆฟ โ†’ ๅฎ‰ๅ…จ โ†’ ๆ”พ่กŒ็ซฏๅฃ:

  • 8080 TCP(็›ด่ฟž่ฎฟ้—ฎ,้…็ฝฎๅไปฃๅŽๅฏๅ…ณ้—ญ)
  • 1935 TCP(็”จ RTMP ๆŽจๆตๆ—ถๅผ€)
  • 20000-30000 UDP(ๅฏนๆŽฅ GB28181 ๆ—ถๅผ€)

ๅœบๆ™ฏ 4:1Panel ้ขๆฟ

1Panel ๆ˜ฏ็ŽฐไปฃๅŒ–็š„ๅผ€ๆบ Linux ๆœๅŠกๅ™จ่ฟ็ปด้ขๆฟ,้€‚ๅˆ่ฟฝๆฑ‚็ŽฐไปฃๅŒ– UI ็š„็”จๆˆทใ€‚

# 1. ๅฎ‰่ฃ… 1Panel(ๅ‚่€ƒ 1panel.cn ๅฎ˜ๆ–นๆ–‡ๆกฃ)
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh

ๆ–นๅผ A:Docker ๅบ”็”จๅ•†ๅบ—้ƒจ็ฝฒ

1Panel โ†’ ๅบ”็”จๅ•†ๅบ— โ†’ ๆœ็ดข StreamBridge โ†’ ๅฎ‰่ฃ…(่‹ฅๅทฒไธŠๆžถ) ๆˆ–ไฝฟ็”จใ€Œๅฎนๅ™จใ€โ†’ใ€Œ็ผ–ๆŽ’ใ€โ†’ ็ฒ˜่ดดไปฅไธ‹ Compose ๆ–‡ไปถ:

version: '3.8'
services:
  streambridge:
    image: suoten/streambridge:latest
    container_name: streambridge
    restart: unless-stopped
    ports:
      - "8080:8080"
      - "1935:1935"
      - "20000-30000:20000-30000/udp"
    volumes:
      - ./config.yaml:/etc/streambridge/config.yaml:ro
      - ./logs:/var/log/streambridge

ๆ–นๅผ B:ไบŒ่ฟ›ๅˆถ + systemd

ๅ‚่€ƒ ๅœบๆ™ฏ 1:Linux systemd ๆœๅŠก,1Panel ไธŽ systemd ๅ…ฑๅญ˜,1Panel ไธป่ฆ่ดŸ่ดฃๅฏ่ง†ๅŒ–ๆŸฅ็œ‹ๆ—ฅๅฟ—ใ€ๆ–‡ไปถๅ’Œ Nginx ๅไปฃใ€‚

1Panel ๅๅ‘ไปฃ็†้…็ฝฎ

1Panel โ†’ ็ฝ‘็ซ™ โ†’ ๅˆ›ๅปบ็ฝ‘็ซ™ โ†’ ๅๅ‘ไปฃ็†

  • ไธปๅŸŸๅ:stream.example.com
  • ไปฃ็†ๅœฐๅ€:http://127.0.0.1:8080
  • ๅผ€ๅฏ HTTPS:่‡ชๅŠจ็”ณ่ฏท Let's Encrypt ่ฏไนฆ
  • ้ซ˜็บง่ฎพ็ฝฎ โ†’ ่‡ชๅฎšไน‰ Nginx ้…็ฝฎ:ๅŠ ๅ…ฅไธŠ้ข็š„ WebSocket ๅ‡็บง้…็ฝฎ(ๅฎๅก”ๅœบๆ™ฏไธ‰็ฌฌ 4 ๆญฅ็š„ Nginx ้…็ฝฎ)

ๅœบๆ™ฏ 5:Docker Compose(้€‚ๅˆๅคšๅฎนๅ™จ็ผ–ๆŽ’)

# docker-compose.yml
version: '3.8'
services:
  streambridge:
    image: suoten/streambridge:latest
    # ๅ›ฝๅ†…ๆœๅŠกๅ™จๅฏๆ”น็”จ้˜ฟ้‡Œไบ‘้•œๅƒ:
    # image: registry.cn-hangzhou.aliyuncs.com/suoten/streambridge:latest
    container_name: streambridge
    restart: unless-stopped
    ports:
      - "8080:8080"
      - "1935:1935"
      - "20000-30000:20000-30000/udp"
    volumes:
      - ./config.yaml:/etc/streambridge/config.yaml:ro
      - ./logs:/var/log/streambridge
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://localhost:8080/api/health"]
      interval: 30s
      timeout: 5s
      retries: 3
docker compose up -d          # ๅฏๅŠจ
docker compose logs -f        # ๆŸฅ็œ‹ๆ—ฅๅฟ—
docker compose restart        # ้‡ๅฏ
docker compose down           # ๅœๆญขๅนถๅˆ ้™ค

ๅœบๆ™ฏ 6:Kubernetes(้€‚ๅˆ้›†็พค้ƒจ็ฝฒ)

# k8s-deploy.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: streambridge
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: streambridge
  namespace: streambridge
spec:
  replicas: 1
  selector:
    matchLabels:
      app: streambridge
  template:
    metadata:
      labels:
        app: streambridge
    spec:
      containers:
        - name: streambridge
          image: suoten/streambridge:latest
          ports:
            - containerPort: 8080
              name: http
            - containerPort: 1935
              name: rtmp
            - containerPort: 1985
              name: whep
          resources:
            requests:
              cpu: "500m"
              memory: "512Mi"
            limits:
              cpu: "4000m"
              memory: "4Gi"
          readinessProbe:
            httpGet:
              path: /api/ready
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 10
          livenessProbe:
            httpGet:
              path: /api/health
              port: 8080
            initialDelaySeconds: 15
            periodSeconds: 20
---
apiVersion: v1
kind: Service
metadata:
  name: streambridge
  namespace: streambridge
spec:
  type: ClusterIP
  selector:
    app: streambridge
  ports:
    - name: http
      port: 8080
      targetPort: 8080
    - name: rtmp
      port: 1935
      targetPort: 1935
    - name: whep
      port: 1985
      targetPort: 1985
kubectl apply -f k8s-deploy.yaml
kubectl get pods -n streambridge
kubectl logs -f deploy/streambridge -n streambridge

ๅฏนๆŽฅ Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: streambridge
  namespace: streambridge
  annotations:
    nginx.ingress.kubernetes.io/proxy-read-timeout: "86400"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "86400"
    nginx.ingress.kubernetes.io/websocket-services: streambridge
spec:
  rules:
    - host: stream.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: streambridge
                port:
                  number: 8080

ๅœบๆ™ฏ 7:PM2 ่ฟ›็จ‹็ฎก็†(Node.js ็”จๆˆท้ฆ–้€‰)

PM2 ๆ˜ฏ่ทจๅนณๅฐ่ฟ›็จ‹็ฎก็†ๅทฅๅ…ท,Windows / Linux / macOS ้€š็”จ,ๆ— ้œ€ๅ†™ service ๆ–‡ไปถใ€‚

# 1. ๅฎ‰่ฃ… PM2(้œ€ Node.js ็Žฏๅขƒ)
npm install -g pm2

# 2. ๅฏๅŠจ StreamBridge
pm2 start ./streambridge --name streambridge -- -c config.yaml

# 3. ่ฎพ็ฝฎๅผ€ๆœบ่‡ชๅฏ
pm2 save
pm2 startup        # Linux/macOS ่‡ชๅŠจ็”Ÿๆˆ systemd / launchd ๆœๅŠก
# Windows ้œ€่ฆ้ขๅค–ๅฎ‰่ฃ…: npm install -g pm2-windows-startup && pm2-startup install

# ๅธธ็”จๅ‘ฝไปค
pm2 status                     # ๆŸฅ็œ‹็Šถๆ€
pm2 logs streambridge          # ๆŸฅ็œ‹ๆ—ฅๅฟ—
pm2 restart streambridge       # ้‡ๅฏ
pm2 stop streambridge          # ๅœๆญข
pm2 delete streambridge        # ็งป้™ค

ๅœบๆ™ฏ 8:Supervisor ่ฟ›็จ‹็ฎก็†(Python ็”จๆˆท้ฆ–้€‰)

# 1. ๅฎ‰่ฃ… Supervisor
sudo apt install -y supervisor        # Debian/Ubuntu
# sudo yum install -y supervisor       # CentOS/RHEL

# 2. ๅ†™ๅ…ฅ้…็ฝฎ
sudo tee /etc/supervisor/conf.d/streambridge.conf > /dev/null <<'EOF'
[program:streambridge]
command=/usr/local/bin/streambridge -c /etc/streambridge/config.yaml
directory=/etc/streambridge
user=streambridge
autostart=true
autorestart=true
startsecs=5
stopwaitsecs=10
stdout_logfile=/var/log/streambridge/supervisor.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=7
redirect_stderr=true
EOF

# 3. ๅฏๅŠจ
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl status streambridge

ๅœบๆ™ฏ 9:Nginx ๅๅ‘ไปฃ็† + HTTPS(ๆ‰‹ๅŠจ้…็ฝฎ)

้žๅฎๅก”/1Panel ็”จๆˆท,็›ดๆŽฅ็”จ Nginx:

server {
    listen 443 ssl http2;
    server_name stream.example.com;

    ssl_certificate     /etc/letsencrypt/live/stream.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/stream.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # WebSocket-FLV(ๅฟ…้œ€,ๅฆๅˆ™ ws-flv ๆ— ๆณ•ๆ’ญๆ”พ)
    location /ws/ {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;
    }

    # HLS ๅˆ‡็‰‡็ผ“ๅญ˜ไผ˜ๅŒ–
    location /hls/ {
        proxy_pass http://127.0.0.1:8080;
        expires 10s;
        add_header Cache-Control "public";
    }
}

# HTTP ๅผบๅˆถ่ทณ่ฝฌ HTTPS
server {
    listen 80;
    server_name stream.example.com;
    return 301 https://$host$request_uri;
}

็”ณ่ฏทๅ…่ดน่ฏไนฆ(Let's Encrypt):

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d stream.example.com

ๅœบๆ™ฏ 10:Caddy ๅๅ‘ไปฃ็†(่‡ชๅŠจ HTTPS)

Caddy ไผš่‡ชๅŠจ็”ณ่ฏทๅนถ็ปญๆœŸ HTTPS ่ฏไนฆ,้…็ฝฎๆœ€็ฎ€:

# /etc/caddy/Caddyfile
stream.example.com {
    reverse_proxy 127.0.0.1:8080

    # WebSocket ่‡ชๅŠจๆ”ฏๆŒ,ๆ— ้œ€้ขๅค–้…็ฝฎ
    # HLS ็ผ“ๅญ˜(ๅฏ้€‰)
    @hls path /hls/*
    handle @hls {
        reverse_proxy 127.0.0.1:8080
        header Cache-Control "public"
        expire 10s
    }
}
sudo systemctl reload caddy

้˜ฒ็ซๅข™็ซฏๅฃ้€ŸๆŸฅ

็ซฏๅฃ ๅ่ฎฎ ็”จ้€” ๆ˜ฏๅฆๅฟ…้œ€
8080 TCP HTTP / WebSocket โœ… ๅฟ…้œ€
443 TCP HTTPS(้…ๅไปฃๅŽ) ๅ…ฌ็ฝ‘้ƒจ็ฝฒๆŽจ่
1935 TCP RTMP ๆŽจๆต ็”จ RTMP ๆ—ถๅผ€
1985 TCP WebRTC WHEP ็”จ WebRTC ๆ—ถๅผ€
20000-30000 UDP RTP/PS ๆŽฅๆ”ถ ๅฏนๆŽฅ GB28181 ๆ—ถๅผ€

้ƒจ็ฝฒๅœบๆ™ฏ้€‰ๅž‹ๅปบ่ฎฎ

ๅœบๆ™ฏ ๆŽจ่ไบบ็พค ไธŠๆ‰‹้šพๅบฆ
Windows NSSM Windows ๆกŒ้ข / Windows Server ็”จๆˆท โญ
Linux systemd Linux ๆœๅŠกๅ™จ่ฟ็ปด โญโญ
ๅฎๅก”้ขๆฟ ๅ›ฝๅ†…ไบ‘ๆœๅŠกๅ™จใ€ๅฏ่ง†ๅŒ–ๆŽงๅฐ็ˆฑๅฅฝ่€… โญโญ
1Panel ็ŽฐไปฃๅŒ– UI ๆŽงๅฐ็ˆฑๅฅฝ่€… โญโญ
Docker / Compose ๅฎนๅ™จๅŒ–้ƒจ็ฝฒใ€CI/CD ๆตๆฐด็บฟ โญโญ
Kubernetes ๅคง่ง„ๆจก้›†็พคใ€DevOps ๅ›ข้˜Ÿ โญโญโญโญ
PM2 Node.js ๅ…จๆ ˆ็”จๆˆท โญ
Supervisor Python ๅ…จๆ ˆ็”จๆˆท โญโญ
Nginx / Caddy ๅไปฃ ไปปไฝ•ๅœบๆ™ฏไธ‹็š„ HTTPS ๆŽฅๅ…ฅๅฑ‚ โญโญ

๐Ÿ”ง ่‡ช่กŒ็ผ–่ฏ‘

ไพ่ต–

็ผ–่ฏ‘

# ๅฝ“ๅ‰ๅนณๅฐ
make build

# ไบคๅ‰็ผ–่ฏ‘ๅ…จๅนณๅฐ
make build-all

# Docker ้•œๅƒ
make docker

# ่พ“ๅ‡บๅœจ bin/ ็›ฎๅฝ•

่ฟ่กŒๆต‹่ฏ•

make test
make lint

้กน็›ฎ็ป“ๆž„

StreamBridge/
โ”œโ”€โ”€ cmd/streambridge/        # ไธปๅ…ฅๅฃ(main.go,ๅ‘ฝไปค่กŒ)
โ”œโ”€โ”€ internal/
โ”‚   โ”œโ”€โ”€ config/              # ้…็ฝฎ่งฃๆžไธŽๅ‘ฝไปค่กŒๅ‚ๆ•ฐ
โ”‚   โ”œโ”€โ”€ input/               # ่พ“ๅ…ฅๅ่ฎฎ้€‚้…ๅฑ‚
โ”‚   โ”‚   โ”œโ”€โ”€ rtsp/            # RTSP ๅฎขๆˆท็ซฏ(gortsplib v4)
โ”‚   โ”‚   โ”œโ”€โ”€ rtmp/            # RTMP ๅฎขๆˆท็ซฏ
โ”‚   โ”‚   โ”œโ”€โ”€ rtp/             # RTP/PS ๆŽฅๆ”ถไธŽ่งฃๅฐ่ฃ…
โ”‚   โ”‚   โ”œโ”€โ”€ file/            # ๆ–‡ไปถๅ›žๆ”พ
โ”‚   โ”‚   โ””โ”€โ”€ http/            # HTTP-FLV / HLS ่พ“ๅ…ฅ้€ไผ 
โ”‚   โ”œโ”€โ”€ media/               # ๅช’ไฝ“ๅค„็†ๅฑ‚
โ”‚   โ”‚   โ”œโ”€โ”€ flv/             # FLV ๅฐ่ฃ…ๅ™จ
โ”‚   โ”‚   โ”œโ”€โ”€ hls/             # HLS ๅˆ‡็‰‡ๅ™จ
โ”‚   โ”‚   โ”œโ”€โ”€ h264.go          # H264 NALU ่งฃๆž
โ”‚   โ”‚   โ”œโ”€โ”€ h265.go          # H265 NALU ่งฃๆž
โ”‚   โ”‚   โ””โ”€โ”€ aac.go           # AAC ๅค„็†
โ”‚   โ”œโ”€โ”€ server/              # HTTP/WS ๆœๅŠก
โ”‚   โ”‚   โ”œโ”€โ”€ web/             # ๅ†…ๅตŒ้™ๆ€่ต„ๆบ(ๆ’ญๆ”พๅ™จ้กต้ข)
โ”‚   โ”‚   โ”œโ”€โ”€ http.go          # ่ทฏ็”ฑไธŽ REST API
โ”‚   โ”‚   โ””โ”€โ”€ flv_writer.go    # FLV ๅ†™ๅ…ฅๅ™จ
โ”‚   โ”œโ”€โ”€ session/             # ไผš่ฏ็ฎก็†(ๅค็”จ/้‰ดๆƒ/็ปŸ่ฎก)
โ”‚   โ””โ”€โ”€ webrtc/              # WebRTC WHEP ๅฎž็Žฐ
โ”œโ”€โ”€ sdk/                     # ๅฎขๆˆท็ซฏ SDK(ๅ…จๅนณๅฐ)
โ”‚   โ”œโ”€โ”€ javascript/
โ”‚   โ”œโ”€โ”€ wechat-miniprogram/
โ”‚   โ”œโ”€โ”€ android/
โ”‚   โ””โ”€โ”€ ios/
โ”œโ”€โ”€ configs/                 # ้…็ฝฎ็คบไพ‹
โ”œโ”€โ”€ Dockerfile               # ๅฎนๅ™จๅŒ–
โ”œโ”€โ”€ Makefile                 # ๆž„ๅปบ่„šๆœฌ
โ””โ”€โ”€ go.mod

โ“ ๅธธ่ง้—ฎ้ข˜ FAQ

Q1: ๅฏๅŠจๅŽๆต่งˆๅ™จๆ‰“ไธๅผ€?

  • ๆฃ€ๆŸฅ 8080 ็ซฏๅฃๆ˜ฏๅฆ่ขซๅ ็”จ:streambridge doctor
  • Windows ็”จๆˆทๆฃ€ๆŸฅ้˜ฒ็ซๅข™ๆ˜ฏๅฆๆ‹ฆๆˆช
  • Linux/macOS ็›‘ๅฌ 80 ไปฅไธ‹็ซฏๅฃ้œ€ sudo
  • ไบ‘ๆœๅŠกๅ™จ้œ€ๅœจๅฎ‰ๅ…จ็ป„ๆ”พ่กŒ 8080 ็ซฏๅฃ

Q2: ๆ’ญๆ”พ RTSP ้ป‘ๅฑ/ๅก้กฟ?

  • ็กฎ่ฎคๆ‘„ๅƒๅคด RTSP ๅœฐๅ€ๆญฃ็กฎ(ๅฏ็”จ VLC ๆต‹่ฏ•)
  • ๆ‘„ๅƒๅคดไธŽ StreamBridge ๆœๅŠกๅ™จ็ฝ‘็ปœๅฏ่พพ
  • H265 ๆต่ฏทๅผ€ๅฏ enable_h265_transcode: true(ๆถˆ่€— CPU)
  • ๆฃ€ๆŸฅๆ—ฅๅฟ—:streambridge --log-level debug

Q3: ๅคšๅฐ‘่ทฏๅนถๅ‘่ƒฝ่ท‘?

  • 1C1G ๆœๅŠกๅ™จ:20+ ่ทฏ 1080P(็บฏ่ฝฌๅฐ่ฃ…)
  • 4C8G ๆœๅŠกๅ™จ:200+ ่ทฏ 1080P(็บฏ่ฝฌๅฐ่ฃ…)
  • ๅฏ็”จ H265 ่ฝฌ็ :ๆฏ่ทฏ็บฆๆถˆ่€— 1 ไธช CPU ๆ ธ(่ฝฏ็ผ–)
  • ๅคง่ง„ๆจก(โ‰ฅ100 ่ทฏ H265 ่ฝฌ็ )่ฏท่€ƒ่™‘ไผไธš็‰ˆ GPU ็กฌไปถ่ฝฌ็ 

Q4: ่ƒฝๅฆๅœจๅ…ฌ็ฝ‘่ฎฟ้—ฎ?

ๅฏไปฅ,ๅปบ่ฎฎ้…็ฝฎ Nginx + HTTPS,่ฏฆ่ง ็”Ÿไบง้ƒจ็ฝฒใ€‚

Q5: ๆ˜ฏๅฆๆ”ฏๆŒ H265?

  • ๆต่งˆๅ™จ้€š่ฟ‡ MSE ๆ’ญๆ”พ H265 ๅ…ผๅฎนๆ€งๅทฎ
  • StreamBridge ็คพๅŒบ็‰ˆๅ†…็ฝฎ H265โ†’H264 ่ฝฏไปถ่ฝฌ็ (้ป˜่ฎคๅ…ณ้—ญ,้œ€ๅผ€ๅฏ)
  • ๅผ€ๅฏๆ–นๅผ:enable_h265_transcode: true

Q6: ไธŽ ZLMediaKit ๆœ‰ไฝ•ๅŒบๅˆซ?

  • ZLMediaKit ๆ˜ฏ็ปผๅˆๆตๅช’ไฝ“ๅนณๅฐ,ๅŠŸ่ƒฝๅคšไฝ†้ƒจ็ฝฒๅคๆ‚
  • StreamBridge ไธ“ๆณจ"ๅ่ฎฎ่ฝฌๆข + ๆต่งˆๅ™จๆ’ญๆ”พ",ๅ•ไบŒ่ฟ›ๅˆถ้›ถไพ่ต–
  • StreamBridge ไธๅš SIP/PTZ/ๅฝ•ๅƒ/ONVIF,่ฟ™ไบ›็”ฑไธŠๆธธๅนณๅฐ่ดŸ่ดฃ

Q7: ๅฏไปฅ็”จๆฅๅš็›ดๆ’ญ/SaaS ๅ—?

ๅฏไปฅ,ไฝ†็›ดๆ’ญๅœบๆ™ฏๅปบ่ฎฎ:

  • ้…็ฝฎ HLS ่พ“ๅ‡บ(ๅปถ่ฟŸ 3-10s,ไฝ†ๅ…ผๅฎนๆ€งๆœ€ๅฅฝ)
  • ๅ…ฌ็ฝ‘้ƒจ็ฝฒ้…็ฝฎ Nginx + HTTPS
  • ๅคง่ง„ๆจก่ฏท่€ƒ่™‘ไผไธš็‰ˆ้›†็พค HA

Q8: ๅ•†ไธšไฝฟ็”จๆ˜ฏๅฆๆ”ถ่ดน?

็คพๅŒบ็‰ˆ ๆฐธไน…ๅ…่ดน,MIT ๅ่ฎฎ,ๅฏๅ•†็”จใ€‚ไผไธš็‰ˆไป…ๆไพ›ๆ‰ฉ่ง„ๆจก/ๅˆ่ง„/ๆ”ฏๆŒ็ฑปๅŠŸ่ƒฝ,ๆ— ๅŠŸ่ƒฝ้˜‰ๅ‰ฒใ€‚

Q9: ็”จไบ†ๅฎๅก”/1Panel ๅไปฃๅŽ,WebSocket-FLV ๆ’ญๆ”พๅคฑ่ดฅ?

ๅไปฃ้…็ฝฎๅฟ…้กปๅŒ…ๅซ WebSocket ๅ‡็บง้…็ฝฎ(Upgrade / Connection ๅคด),่ฏฆ่ง ๅœบๆ™ฏ 3:ๅฎๅก”้ขๆฟ ็ฌฌ 3 ๆญฅ็š„ Nginx ้…็ฝฎใ€‚

Q10: ๅฆ‚ไฝ•ๅ‡็บง็‰ˆๆœฌ?

  • ไบŒ่ฟ›ๅˆถ้ƒจ็ฝฒ:้‡ๆ–ฐไธ‹่ฝฝๆ–ฐ็‰ˆไบŒ่ฟ›ๅˆถ,ๆ›ฟๆขๆ—งๆ–‡ไปถ,้‡ๅฏๆœๅŠก
  • Docker:docker compose pull && docker compose up -d
  • systemd:sudo systemctl restart streambridge
  • ้…็ฝฎๆ–‡ไปถๅ‘ๅŽๅ…ผๅฎน,ๅ‡็บงๆ— ้œ€ไฟฎๆ”น

Q11: ๅฆ‚ไฝ•ๅธ่ฝฝ?

  • ไบŒ่ฟ›ๅˆถ:ๅœๆญขๆœๅŠก โ†’ ๅˆ ้™คไบŒ่ฟ›ๅˆถไธŽ้…็ฝฎ็›ฎๅฝ•
  • Docker:docker compose down -v
  • systemd:sudo systemctl disable --now streambridge && sudo rm /etc/systemd/system/streambridge.service && sudo systemctl daemon-reload

๐Ÿ—๏ธ ๆžถๆž„่ฎพ่ฎก

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   StreamBridge Gateway                   โ”‚
โ”‚                ๅ•ไบŒ่ฟ›ๅˆถ ยท ้›ถๅค–้ƒจไพ่ต–                       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                          โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  GB28181 ๅนณๅฐ / NVR / ๆ‘„ๅƒๅคด / ็›ดๆ’ญๆŽจๆต          โ”‚   โ”‚
โ”‚  โ”‚  (ไธŠๆธธ่ดŸ่ดฃ SIP/PTZ/ๅฝ•ๅƒ,StreamBridge ไธๅ‚ไธŽ)      โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                       โ”‚ ๅช’ไฝ“ๆต                           โ”‚
โ”‚                       โ–ผ                                 โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚              ่พ“ๅ…ฅๅ่ฎฎ้€‚้…ๅฑ‚                        โ”‚   โ”‚
โ”‚  โ”‚  RTSP Client โ”‚ RTMP Server โ”‚ RTP/PS โ”‚ File โ”‚ HLS โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                       โ–ผ                                 โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚              ็ปŸไธ€ๅช’ไฝ“ๅค„็†ๅฑ‚                        โ”‚   โ”‚
โ”‚  โ”‚  H264/H265 NALU ่งฃๆž โ”‚ AAC ๆๅ– โ”‚ H265โ†’H264 ่ฝฌ็   โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                       โ–ผ                                 โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚              ่พ“ๅ‡บๅฐ่ฃ…ๅฑ‚                            โ”‚   โ”‚
โ”‚  โ”‚   WebSocket-FLV  โ”‚  HLS ๅˆ‡็‰‡  โ”‚  WebRTC WHEP      โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                       โ–ผ                                 โ”‚
โ”‚            ๆต่งˆๅ™จ / ๅฐ็จ‹ๅบ / Android / iOS               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๅ…ณ้”ฎ่ฎพ่ฎก

  1. ็ปŸไธ€ๅช’ไฝ“ๆจกๅž‹:ๆ‰€ๆœ‰่พ“ๅ…ฅๅ่ฎฎ่งฃๅฐ่ฃ…ไธบ็ปŸไธ€็š„ media.Frame,่พ“ๅ‡บๅฑ‚ๆ— ้œ€ๅ…ณๅฟƒ่พ“ๅ…ฅๆฅๆบ
  2. ๆตๅค็”จ:ๅคšๆต่งˆๅ™จ่ง‚็œ‹ๅŒไธ€่ทฏๆบ,ๅชๆ‹‰ 1 ่ทฏ่พ“ๅ…ฅ,่Š‚็œๅธฆๅฎฝ
  3. ้›ถๆ‹ท่ด่ฝฌๅ‘:H264 ๆตไธ้‡ๆ–ฐ็ผ–็ ,็›ดๆŽฅ่ฝฌๅฐ่ฃ…ไธบ FLV,CPU ๅ ็”จๆžไฝŽ
  4. ้™ๆ€่ต„ๆบๅตŒๅ…ฅ:Web ๆ’ญๆ”พๅ™จ้กต้ข้€š่ฟ‡ embed.FS ๅตŒๅ…ฅไบŒ่ฟ›ๅˆถ,็œŸๆญฃๅ•ๆ–‡ไปถ้ƒจ็ฝฒ

๐Ÿ’Ž ็คพๅŒบ็‰ˆ vs ไผไธš็‰ˆ

็ฑปๅˆซ ็คพๅŒบ็‰ˆ(ๅ…่ดน) ไผไธš็‰ˆ(ไป˜่ดน)
ๅ่ฎฎ่ฝฌๆข โœ… ๅ…จ้ƒจ โœ… ๅ…จ้ƒจ
H264/H265 ๅค„็† โœ… ่ฝฏไปถ่ฝฌ็  โœ… + GPU ็กฌไปถ่ฝฌ็ (NVENC/QSV)
ๅฎขๆˆท็ซฏ SDK โœ… ๅ…จๅนณๅฐ โœ… ๅ…จๅนณๅฐ
REST API โœ… ๅฎŒๆ•ด โœ… ๅฎŒๆ•ด
ๅ•่Š‚็‚นๅนถๅ‘ โœ… 200+ ่ทฏ โœ… ้›†็พค HA(ๆ•ฐๅƒ่ทฏ)
ไผ ่พ“ๅŠ ๅฏ† TLS/HTTPS + ๅ›ฝๅฏ† SM4 / HLS DRM
็›‘ๆŽงๅ‘Š่ญฆ Prometheus ๆŒ‡ๆ ‡ + Grafana ็œ‹ๆฟ + ๅ‘Š่ญฆ
ๆ“ไฝœๅฎก่ฎก ๅŸบ็ก€ๆ—ฅๅฟ— + ๅฎŒๆ•ดๅฎก่ฎกๆŠฅ่กจ
ๅ•†ไธšๆ”ฏๆŒ ็คพๅŒบ issue 7x24 SLA + ไธ“ๅฑžๅทฅ็จ‹ๅธˆ

็คพๅŒบ็‰ˆๅŠŸ่ƒฝๅฎŒๆ•ดๅฏ็”จ,ๆ— ไปปไฝ•ๅŠŸ่ƒฝ้˜‰ๅ‰ฒ,ๅฏ็‹ฌ็ซ‹ๅ•†็”จใ€‚ไผไธš็‰ˆไป…ๆไพ›"ๆ‰ฉ่ง„ๆจกใ€ๅˆ่ง„ใ€ๆ”ฏๆŒ"็ฑป่ƒฝๅŠ›ใ€‚


๐Ÿค ่ดก็ŒฎไธŽๅ้ฆˆ


๐Ÿ“„ License

MIT License - ็คพๅŒบ็‰ˆๆฐธไน…ๅ…่ดน,ๅฏๅ•†็”จใ€‚

Copyright (c) 2026 StreamBridge Contributors

About

๐Ÿ”Œ Single-binary streaming gateway: RTSP/RTMP/GB28181 โ†’ WebSocket-FLV/HLS/WebRTC. ่ฎฉๆ‘„ๅƒๅคดไธ€้”ฎ่ฟžไธŠๆต่งˆๅ™จใ€‚

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages