an21345
Senior Member
Chào các fen, hôm nay mình rảnh, nên muốn chia sẻ với các fen cách dựng 1 server livestream bằng rtmp, hls, http-flv, webrtc protocol và android app. Opensource có sẵn trên github.
Do năm 2020 mình có làm product ở vitmap về cái livestream này nhưng vẫn còn nhiều vấn đề chưa giải quyết được. Như việc scaleup, optimize, loadbalancing.
Hi vọng sau bài viết này các fen có thể tự dựng 1 cái server livestreaming nho nhỏ hoặc to đủ sức để cạnh tranh với VNG, FPT, navitel, vitmap, ...
Các fen chờ mình lên github chọn hàng nhé, 2 năm rồi mình không có nhớ link nằm đâu hết.
Đã đủ hàng, link ở dưới rồi nhé các fen.
Mục tiêu và các thành phần:
Mình sẽ cài docker lên con máy windows 10.
Sẵn tiện mình dùng thử cái docker+wsl2 cho các bạn biết luôn. (vì giờ mà cài ảo hóa vmware rồi cài ubuntu, docker thì tốn thời gian quá, hiệu suất nó lại chậm lag lòi nữa. Tuần trước bên f33 có người bảo là wsl2 + docker ngon hơn hyper-v nên giờ thử luôn coi M$ có phải là lựa chọn tốt không nhé)
Sau khi thử docker + wsl2 thấy tụi này chạy cũng ok, cài đặt dễ, không có gì rắc rối hơn so với hyper-v. Tóm lại là xài ngon nhé các fen, môi trường wsl2 linux thì tiết kiệm ram và cpu hơn là cái chắc rồi.
Ai chê hàng tầu thì nên cân nhắc lại vì cái srs này nó hơn 21.7k star trên github lận. Đúng nhận sai cãi nhé, không phải cứ hàng tầu là auto cùi đâu, nước tỉ dân nó nhiều hàng xịn mà không public lắm. Có sẵn thì cứ tận hưởng thôi, không cần phải tốn công tự viết rồi mất công bảo trì.
Cứ trên lưng người khổng lồ và tiết kiệm thời gian của bản thân là tốt nhất.
p/s:
@FullStackFlutterGolang
Do năm 2020 mình có làm product ở vitmap về cái livestream này nhưng vẫn còn nhiều vấn đề chưa giải quyết được. Như việc scaleup, optimize, loadbalancing.
Hi vọng sau bài viết này các fen có thể tự dựng 1 cái server livestreaming nho nhỏ hoặc to đủ sức để cạnh tranh với VNG, FPT, navitel, vitmap, ...
Các fen chờ mình lên github chọn hàng nhé, 2 năm rồi mình không có nhớ link nằm đâu hết.
Đã đủ hàng, link ở dưới rồi nhé các fen.
Mục tiêu và các thành phần:
- Server opensource tương tự wowza, hỗ trợ website preview livestream, các bạn có thể nhúng cái view này ở mọi chỗ. Vì server hỗ trợ rtmp, hls, http-flv, webrtc, ... nên js có khá nhiều thư viện hỗ trợ. (rtmp thì flv.js nó ngừng hỗ trợ rồi nên hơi khó để nhúng vô private website nhưng yên tâm muốn làm là có cách hết) - ossrs/srs
ossrs official website - App android opensource code sẵn việc thao tác với camera, và upload rtmp lên server rtmp ở trên. Mình chỉ cần cấu hình đúng link là được. - begeekmyfriend/yasea
- Docker (căn bản luôn)
- K8S (điểm cộng thôi nhé nhưng docker 1 điểm thì k8s 11 điểm lận, cái này nâng cao nhé, scaleup, balancing, routing, ...)
- ffmpeg (cái tool transform các loại video formats, rất là mạnh nhé cái này rất quan trọng)
- rtmp protocol (chắc chắn là phải hiểu rồi nhưng không cần quan tâm lắm đâu vì biết cách xài ffmpeg là tha hồ chơi rtmp)
- Android (biết cài tool build code android là ok, có sửa url để upload rtmp cho đúng thôi không khó lắm)
- 1 chút kiến thức về BE và FE để hiểu flow và biết rõ chỗ bị issue để giải quyết vấn đề 1 cách nhanh chóng.
- Triển khai được 1 hệ thống livestream low lantency.
- Xem được trên website với thiết bị Android đang livestream.
- Có thể nâng cấp hay update 1 app Android một cách dễ dàng.
- Có thể tự viết 1 website mới để phát rtmp, webrtc video đang livestream.
- Có kiến thức về các protocol livestream hiện đại.
- Biết cách loadbalancing, scaleup, optimize lantency.
- Tự tin research những công nghệ mới bằng các kiến thức trên.
- HLS: Apple xài chuẩn này, Android cũng đùng được luôn nhé. Cốt lõi của giao thức này là cắt video ra làm nhiều đoạn nhỏ (1 video được cắt ra làm nhiều chunk) và website (hay gọi là client) sẽ phát chunk 1 rồi tới chunk 2, ... (ta có thể giới hạn maximum chunk ở server, kể cả việc clear hết các chunk sau 1 khoảng thời gian Android dừng upload video qua rtmp, nói chung là server cấu hình file config nhiều tham số lắm, bạn tha hồ mà vọc vạch)
- Ưu điểm:
- Triển khai đơn giản, nhúng vô mọi chỗ được.
- Có thể tua các đoạn chunk như xem video vậy đó.
- Nhược điểm:
- Vì các chunk có độ dài bằng nhau (mặc định là 10s) nên độ trễ của quá trình livestream rơi vào khoảng (-10,10) giây.
- Tối ưu:
- Apple có tối ưu giao thức hls này bằng hls2 (low lantency), bằng cách giảm độ dài 1 chunk, ở mức chấp nhận được. Low lantency rơi vào khoảng 1-2s, có thể xem là chấp nhận được.
- Ưu điểm:
- HTTP-FLV: Giao thức khá là cũ, đa số video upload lên được convert sang dạng flv. Chính vì video format theo flv nên 1 số website nhúng vào sẽ khó, nhất là các thiết bị Apple.
- Ưu điểm:
- Delay lantency thấp. (300-1000ms-2s nói chung là khá nhỏ và phụ thuộc nhiều vào brandwith network nhà bạn)
- Nhúng vô Android, website thì có flv.js lo hết.
- Giao thức cơ bản dễ tìm được thư viện hỗ trợ.
- Nhược điểm:
- Vì video format theo dạng flv nên khó nhúng vô hàng Apple, flv.js thì không chơi với Apple rồi.
- Ưu điểm:
- WebRTC: Tương tự như RTMP, nhưng video không format theo kiểu rtmp, cũng chưa rõ video format kiểu gì nữa.(Có gì update sau nhé các fen)
- Ưu điểm:
- Ưu điểm giống RTMP.
- Delay lantency thấp.
- Nhúng vào website, Android cũng dễ, Apple thì mình chưa thử. (Có vẻ là không có thư viện hỗ trợ để phát trên hàng Apple)
- Nhược điểm:
- Được đánh giá là không an toàn về bảo mật, đo phải public 1 phần ip, port hoặc domain.
- Ưu điểm:
- Cách run docker image ossrs/srs:4
Port 1935 là port upload video bằng rtmp từ device, admin page là 1985 - lên trang này để xem ip nào đang push video, 8080 là port website để mình lên xem livestream và test các protocol rtmp, hls, webrtc,...
(Trong này còn có file srs.conf, có vài tham số để các bạn cấu hình, tham khảo thêm ở link này nhé - config file)-
Code:
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \ ossrs/srs:4 ./objs/srs -c conf/docker.conf
-
Code:
docker run --rm -it ossrs/srs:encoder ffmpeg -stream_loop -1 -re -i doc/source.flv \ -c copy -f flv rtmp://host.docker.internal/live/livestream
-
Code:
http://localhost:8080/players/srs_player.html?autostart=true&stream=livestream.m3u8&port=8080&schema=http
-
Code:
http://localhost:8080/console/en_index.html#/connect?port=1985&schema=http&host=localhost
Trong này có thể xem được danh sách các device đang push video và preview livestream. Nhớ bấm connect để kích hoạt nhé.
- Sau khi click connect thì vô link này để xem danh sách các device đang push video lên srs server. Bấm vô preview để mở tab mới xem livestream nhé.
Code:http://localhost:8080/console/en_index.html#/streams?port=1985&schema=http&host=localhost
- Ấn vô preview thì qua tab xem livestream, auto đúng link luôn nhé.
- Cấu hình OBS để stream lên srs server.
- Đây là cách SRS storage video m3u8 và ts. Chui vô trong container đúng folder nha.
- Vậy là việc test srs server đã xong, khá là dễ để test.
-
- Android app rtmp: trong này có thư viện rtmp java+cpp+jni đủ cả, nhưng mình cũng chẳng cần phải đọc kĩ làm gì hết, người ta viết ok lah rồi, ai thích vọc vạch thì vô đọc thử xem người ta viết hưu viết vượn gì nhé.
(mình chuẩn bị cài android studio vô win10, rồi còn phải check lại gradle, lib cho phù hợp với version sdk android 21, nên sẽ tốn cỡ 30p gì đó, cái cấu hình lib này mình làm rất nhiều lần vào năm 2017-2020 rồi nên không lo lắm)
Mình sẽ cài docker lên con máy windows 10.
Sẵn tiện mình dùng thử cái docker+wsl2 cho các bạn biết luôn. (vì giờ mà cài ảo hóa vmware rồi cài ubuntu, docker thì tốn thời gian quá, hiệu suất nó lại chậm lag lòi nữa. Tuần trước bên f33 có người bảo là wsl2 + docker ngon hơn hyper-v nên giờ thử luôn coi M$ có phải là lựa chọn tốt không nhé)
Sau khi thử docker + wsl2 thấy tụi này chạy cũng ok, cài đặt dễ, không có gì rắc rối hơn so với hyper-v. Tóm lại là xài ngon nhé các fen, môi trường wsl2 linux thì tiết kiệm ram và cpu hơn là cái chắc rồi.
Ai chê hàng tầu thì nên cân nhắc lại vì cái srs này nó hơn 21.7k star trên github lận. Đúng nhận sai cãi nhé, không phải cứ hàng tầu là auto cùi đâu, nước tỉ dân nó nhiều hàng xịn mà không public lắm. Có sẵn thì cứ tận hưởng thôi, không cần phải tốn công tự viết rồi mất công bảo trì.
Cứ trên lưng người khổng lồ và tiết kiệm thời gian của bản thân là tốt nhất.
p/s:
- Vmware là đồ cổ của 2015 rồi nhé các fen. Còn ai muốn tìm hiểu thêm tại sao vmware lại bị lạc hậu thì link đây nhé. - docker vs vmware
Sơ qua tí thì các máy host: 100% CPU + 4GB RAM, triển khai 2 cái ảo hóa win10 chiếm tổng là 2GB RAM + 50% CPU, máy host chỉ còn lại 2GB RAM và 50% cpu cho các tác vụ khác.
Việc 2 win10 có chung hệ điều hành bị duplicate lên => lãng phí.
Để tránh lãng phí này, người ta để ra 1 cái chung gọi là môi trường docker cài sẵn windows lên đó, các container là các application sẽ dùng tài nguyên như libs, cpu, ram từ docker enviroment và máy host sẽ không còn bị chiếm 50% CPU và 2GB RAM nữa. Thay vào đó docker sẽ sử dụng cỡ chừng 1GB RAM và 25% CPU. Chúng ta có thể sử dụng 3 GB RAM + 75% CPU cho việc khác.
Quả là tiết kiệm tài nguyên khi sử dụng docker phải không?
- Giờ người ta chơi lightweight container - containerd + k8s, private docker hub - versioning, grafana - monitoring - alert, prometheus - logging, jenkins - auto build + deploy script, ...
- Mấy cái trên là căng bản để CI/CD đó.
@FullStackFlutterGolang
Last edited: