MonaServer là một media server rất nhẹ, hỗ trợ nhiều giao thức streaming và media container chỉ trong một ứng dụng và có thể tùy chỉnh bằng LUA script.
Tôi thường dùng MonaServer để phân phối luồng video từ nguồn như OBS Studio, FFmpeg hoặc stream từ Camera điện thoại ( bằng Larix Broadcaster ) đến nhiều thiết bị khác trong mạng thông qua giao thức RTMP.
MonaServer hỗ trợ các giao thức:
- HTTP(TLS) cần kết hợp với một rendez-vous extension (tham số
RDV
) như SDP exchange for WebRTC để liên kết các đối tác (peer) với nhau. - WebSocket(TLS)
- STUN
- RTMP(E)
- RTMFP
- SRT (cần cài đặt thư viện SRT protocol)
- RTP, RTSP
MonaServer hỗ trợ các tính năng nâng cao cho các media container sau:
- MP4
- FLV, F4V
- TS
- HLS
- ADTS, AAC, MP3
- SubRip, VTT
- Mona
MonaServer sau khi build có 2 phiên bản là MonaServer
và MonaTiny
, trong đó MonaTiny không hỗ trợ tùy chỉnh bằng LUA vì vậy cũng nhẹ nhàng hơn. Tôi hầu như chỉ dùng MonaTiny vì cũng không có nhu cầu tùy biến đặc biệt.
Chuẩn bị build MonaServer2
Sau đây tôi hướng dẫn các bạn cài đặt MonaServer2. Do phần mềm khá ‘portable’, tôi sẽ thử cài đặt vào một thư mục bất kỳ (ví dụ ~/.local
chẳng hạn).
Trước hết tôi lưu thông tin về thư mục cài đặt vào một biến môi trường, ví dụ tên là MONA_PREFIX
.
export MONA_PREFIX=~./local
Cài đặt các dependencies để build MonaServer như sau:
sudo apt install build-essentials cmake libssl-dev
Trước khi build MonaServer, ta sẽ build các extension chưa có sẵn trong HĐH là LuaJIT và SRT protocol.
Shellscript tổng hợp quá trình build MonaServer2
Dưới đây là shell script tổng hợp để build toàn bộ MonaServer2
#!/bin/bash MONA_PREFIX=~/.local SRC_DIR=${MONA_PREFIX}/src/ BIN_DIR=${MONA_PREFIX}/bin/ mkdir -p ${SRC_DIR} ${BIN_DIR} # Checkout the source code from GitHub getsrc() { local src=$(basename ${1} .git) cd ${SRC_DIR} if [ -d ${src}/.git ]; then cd ${src} # Clean the repository git reset; git clean -fdx git fetch; git checkout . else git clone ${1} cd ${src} fi } # Build optimization export CONCURRENCY_LEVEL=$(/bin/grep -c processor /proc/cpuinfo) export MAKEFLAGS="-j${CONCURRENCY_LEVEL}" # Build and install LuaJIT getsrc https://github.com/LuaJIT/LuaJIT.git make PREFIX=${MONA_PREFIX} make install PREFIX=${MONA_PREFIX} # Build and install SRT protocol support getsrc https://github.com/Haivision/srt mkdir build && cd build cmake -DCMAKE_INSTALL_PREFIX:PATH=${MONA_PREFIX} .. cmake --build . make install # Build and install MonaServer2 (MonaServer & MonaTiny) getsrc https://github.com/MonaSolutions/MonaServer2.git make ENABLE_SRT=1 INCLUDES=-I${MONA_PREFIX}/include/ LIBDIRS=-L${MONA_PREFIX}/lib/ cp MonaServer/{cert.pem,key.pem,MonaServer,MonaServer.ini} MonaTiny/MonaTiny ${BIN_DIR} cp ${BIN_DIR}MonaServer.ini ${BIN_DIR}MonaTiny.ini
Sử dụng MonaServer
Trước hết ta nên thay đổi các cổng trong MonaServer.ini
, tránh trường hợp xung đột cổng với các dịch vụ khác như Web Server chẳng hạn, cũng như nếu muốn chạy bằng non-root user, bạn cần để cổng lớn hơn 1024.
Như tôi đã chỉnh sửa các cổng sau:
HTTP - 8080
HTTPS - 8443
WS - 8080
WSS - 8443
RTMPS - 1936
Khởi chạy MonaServer
từ dòng lệnh như sau:
$ MonaServer Application.cpp[134] MonaServer v2.750 Application.cpp[136] Load configuration file MonaServer.ini Protocols.h[82] RTMFP server started on 0.0.0.0:1935 Protocols.h[82] RTMP server started on 0.0.0.0:1935 Protocols.h[82] RTMPS server started on 0.0.0.0:1936 Protocols.h[82] HTTP server started on 0.0.0.0:8080 Protocols.h[82] WS server started on 0.0.0.0:8080 Protocols.h[82] HTTPS server started on 0.0.0.0:8443 Protocols.h[82] WSS server started on 0.0.0.0:8443 Protocols.h[82] SRT server started on 0.0.0.0:9710