LINUX

Hướng dẫn thiết lập Video Streaming Server bằng Nginx-RTMP trên Ubuntu

Giao thức RTMP (Real-Time Messaging Protocol) là nguyên tắc cơ bản của hầu hết các video streaming trên mạng hiện nay. Bạn cũng sẽ tìm hiểu cách lưu trữ các stream HLS và DASH để hỗ trợ các nền tảng. Tìm hiểu cách thiết lập Video Streaming Server bằng Nginx-RTMP trên Ubuntu để thực hiện việc tổ chức các video RTMP stream độc lập có thể liên kết và xem trong các ứng dụng khác nhau qua bài viết dưới đây.

Yêu cầu để thiết lập Video Streaming Server bằng Nginx-RTMP trên Ubuntu

  • Một máy chủ Ubuntu với user non-root có quyền sudo.
  • Nginx đã được cài đặt từ trước.

Bước 1: Cài đặt và cấu hình Nginx-RTMP

Hầu hết các công cụ streaming hiện đại đều hỗ trợ giao thức RTMP, giao thức này xác định các tham số cơ bản của luồng video trên internet. Máy chủ web nginx bao gồm một module cho phép bạn cung cấp luồng RTMP với cấu hình tối thiểu từ một URL chuyên dụng, giống như cung cấp quyền truy cập HTTP vào các trang web theo mặc định. Module Nginx RTMP không được thiết lập tự động trong nginx, nhưng trên Ubuntu và hầu hết các bản Linux khác, bạn có thể cài đặt dưới dạng package bổ sung.

Bắt đầu bằng cách chạy các lệnh sau với tư cách là user non-root để cập nhật danh sách package và cài đặt module Nginx:

sudo apt update
sudo apt install libnginx-mod-rtmp

Việc cài đặt module sẽ không kích hoạt streaming. Bạn sẽ cần thêm một cấu hình vào file config Nginx để xác định vị trí và cách thức luồng stream sẽ hoạt động.

Sử dụng nano hoặc trình soạn thảo văn bản yêu thích để mở file cấu hình chính của Nginx /etc/nginx/nginx.conf và thêm lệnh cấu hình này vào cuối file:

sudo nano /etc/nginx/nginx.conf
. . .
rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                allow publish 127.0.0.1;
                deny publish all;

                application live {
                        live on;
                        record off;
                }
        }
}

Trong đó:

  • listen 1935: Thiết lập RTMP lắng nghe các kết nối trên cổng 1935.
  • chunk_size 4096: Thiết lập RTMP sẽ gửi dữ liệu ở dạng 4KB block.
  • allow publish 127.0.0.1 và deny publish all: Chỉ cho phép xuất bản video từ cùng một máy chủ để tránh bất kỳ người dùng nào khác có thể push stream của riêng họ.
  • application live: Xác định một block ứng dụng sẽ khả dụng tại đường dẫn URL là /live.
  • live on: Bật chế độ trực tiếp để nhiều người dùng có thể kết nối đồng thời với stream của bạn.
  • record off: Tắt chức năng ghi của Nginx-RTMP, do đó tất cả các luồng không được lưu riêng vào đĩa theo mặc định.

Lưu và đóng file. Nếu bạn đang sử dụng nano, hãy nhấn Ctrl + X, sau đó khi được nhắc hãy nhấn Y và Enter.

Theo mặc định thì RTMP sẽ lắng nghe trên port 1935, có nghĩa là bạn cần mở cổng đó trong firewall của mình. Nếu đã cấu hình ufw như một phần của thiết lập máy chủ ban đầu, hãy chạy lệnh sau:

sudo ufw allow 1935/tcp

Bây giờ bạn có thể reload nginx:

sudo ufw allow 1935/tcp
LƯU Ý: 
Nếu bạn muốn sử dụng Nginx-RTMP để xây dựng hệ thống streaming trực tiếp, bạn có thể cài đặt và cấu hình Nginx-RTMP trên một VPS để có một môi trường hoạt động độc lập và đủ tài nguyên để xử lý các yêu cầu phát trực tiếp từ nguồn đầu vào cũng như phục vụ cho người dùng.

Bước 2: Gửi video đến server RTMP

Có nhiều cách để gửi video đến máy chủ RTMP. Đầu tiên là sử dụng ffmpeg, một tiện ích video – âm thanh phổ biến giúp phát file video trực tiếp trên máy chủ. Nếu bạn chưa có sẵn video thì có thể tải xuống một video bằng cách sử dụng youtube-dl để quay video từ các nền tảng phát trực tuyến như YouTube.

Để sử dụng youtube-dl, bạn cũng cần có bản cài đặt Python với phiên bản mới nhất:

sudo apt install python3-pip

Tiếp theo, sử dụng pip để cài đặt youtube-dl:

sudo pip install youtube-dl

Bây giờ bạn có thể dùng youtube-dl để download video từ Youtube.

youtube-dl https://www.youtube.com/watch?v=rSGKVa3qMxc

Bạn sẽ thấy một số output khi youtube-dl kết hợp các luồng video và âm thanh đang tải xuống lại thành một file duy nhất:

Output
[youtube] fOqr3InU6P8&t: Downloading webpage
WARNING: Requested formats are incompatible for merge and will be merged into mkv.
[download] xoa xac minh tai khoan google tren tat ca cac ma samsung-rSGKVa3qMxc.f137.mp4
[download] 100% of 32.82MiB in 08:40
[download] xoa xac minh tai khoan google tren tat ca cac ma samsung-rSGKVa3qMxc.f251.webm
[download] 100% of 1.94MiB in 00:38
[ffmpeg] Merging formats into "xoa xac minh tai khoan google tren tat ca cac ma samsung-rSGKVa3qMxc.mkv"
Deleting original file xoa xac minh tai khoan google tren tat ca cac ma samsung-rSGKVa3qMxc.f137.mp4 (pass -k to keep)
Deleting original file xoa xac minh tai khoan google tren tat ca cac ma samsung-rSGKVa3qMxc.f251.webm (pass -k to keep)

Bây giờ, bạn sẽ có một file video trong thư mục hiện tại với tiêu đề như xoa xac minh tai khoan google tren tat ca cac ma samsung-rSGKVa3qMxc.mkv. Để phát trực tuyến, bạn sẽ cần cài đặt ffmpeg:

sudo apt install ffmpeg

Và sử dụng ffmpeg để gửi đến máy chủ RTMP của bạn:

ffmpeg -repository -i "xoa xac minh tai khoan google tren tat ca cac ma samsung-rSGKVa3qMxc.mkv" -c:v copy -c:a aac -ar 44100 -ac 1 -f flv rtmp://localhost/live/stream

Lệnh ffmpeg này đang chuẩn bị video cho việc streaming. Ngoài ra, bạn có thể tìm hiểu các tùy chọn khác như sau:

  • -re: Output sẽ được đọc ở tốc độ khung hình gốc của nó.
  • -i: “xoa xac minh tai khoan google tren tat ca cac ma samsung-rSGKVa3qMxc.mkv“: Chỉ định đường dẫn đến file input.
  • -c:v được đặt thành copy: Bạn đang sao chép nguyên bản định dạng video đã nhận được từ YouTube.
  • -c:a có các tham số khác, cụ thể là aac -ar 44100 -ac 1. Bạn cần lấy định dạng lại âm thanh cho phù hợp với RTMPaac là một codec âm thanh được hỗ trợ rộng rãi, 44100 hz là tần số phổ biến và -ac 1 chỉ định phiên bản đầu tiên của thông số AAC.
  • -f flv gói video trong conitainer định dạng flv để tương thích tối đa với RTMP.

Video được gửi tới rtmp://localhost/live/stream vì bạn đã xác định cấu hình live ở Bước 1 và stream là URL được chọn cho video này.

Trong khi ffmpeg đang truyền phát video, công cụ này sẽ cho output với các thông số:

Output
frame=  127 fps= 25 q=-1.0 size=     405kB time=00:00:05.00 bitrate= 662.2kbits/s speed=frame=  140 fps= 25 q=-1.0 size=     628kB time=00:00:05.52 bitrate= 931.0kbits/s speed=frame=  153 fps= 25 q=-1.0 size=     866kB time=00:00:06.04 bitrate=1173.1kbits/s speed=

Đây là output ffmpeg ở dạng tiêu chuẩn.. Sử dụng video mẫu này, bạn sẽ nhận được fps= 25.

Trong khi ffmpeg đang chạy, bạn có thể kết nối với luồng RTMP từ trình phát video. Nếu đã cài đặt VLCmpv hoặc một trình phát đa phương tiện khác, bạn sẽ có thể xem stream bằng cách mở URL rtmp://your_domain/live/stream trong trình phát đa phương tiện. Stream sẽ chấm dứt sau khi ffmpeg phát xong video. Nếu muốn tiếp tục lặp lại, bạn có thể thêm -stream_loop -1 vào đầu lệnh ffmpeg.

LƯU Ý:
Bạn cũng có thể phát trực tiếp Facebook Live bằng ffmpeg mà không cần sử dụng Nginx-RTMP bằng cách thay thế rtmp://localhost/live/stream trong lệnh ffmpeg bằng rtmps://live-api-s.facebook.com:443/rtmp/your-facebook-stream-key

Trên đây là cách truyền phát các nguồn video static từ dòng lệnh, bạn sẽ tìm hiểu cách truyền phát video từ các dynamic bằng OBS trên máy tính để bàn.

Bước 3: Truyền phát video đến server qua OBS (Tùy chọn)

Phát trực tuyến qua ffmpeg thuận tiện khi bạn có một video đã chuẩn bị sẵn mà bạn muốn phát lại, nhưng phát trực tiếp có thể linh hoạt hơn nhiều. Phần mềm phổ biến nhất để phát trực tiếp là OBS (Open Broadcaster Software) – một phần mềm miễn phí với mã nguồn mở và tính năng mạnh mẽ. OBS là ứng dụng dành cho máy tính để bàn và sẽ kết nối với máy chủ thông qua máy tính của bạn.

Sau khi cài đặt OBS, bạn sẽ cấu hình tùy chỉnh cửa sổ màn hình và nguồn âm thanh muốn thêm vào stream, sau đó thêm thông tin xác thực cho dịch vụ phát trực tuyến. Theo mặc định, bạn có thể streaming bằng cách phát trực tuyến toàn bộ màn hình của mình. Để đặt thông tin đăng nhập dịch vụ streaming, hãy mở menu cài đặt của OBS, điều hướng đến tùy chọn Stream và nhập:

Streaming Service: Custom
Server: rtmp://your_domain/live
Play Path/Stream Key: obs_stream

obs_stream là đường dẫn tùy chọn – trong trường hợp này, video của bạn sẽ có tại rtmp://your_domain/live/obs_stream. Bạn không cần bật xác thực nhưng cần thêm một mục bổ sung vào danh sách whitelist IP đã cấu hình ở Bước 1.

Quay lại với server, mở file /etc/nginx/nginx.conf và thêm một mục bổ sung là allow publish để nhập địa chỉ IP local của bạn:

sudo nano /etc/nginx/nginx.conf
. . .
                allow publish 127.0.0.1;
                allow publish your_local_ip_address;
                deny publish all;
. . .

Lưu và đóng file, sau đó reload Nginx:

sudo systemctl reload nginx.service

Bây giờ bạn có thể đóng menu cài đặt của OBS và nhấp vào Start Streaming từ giao diện chính. Hãy thử xem stream trong trình phát đa phương tiện như trước đây. Tiếp theo, bạn có thể thêm một vài tính năng khác để giúp server có thể tạo ra nhiều video stream hơn.

Bước 4: Thêm khả năng giám sát (Bước tùy chọn)

Việc cấu hình Nginx để truyền phát video bằng module Nginx-RTMP đã xong, bước tiếp theo thông thường là bật trang thống kê RTMP. Thay vì thêm ngày càng nhiều chi tiết cấu hình vào file nginx.conf, Nginx cho phép bạn thêm cấu hình trên mỗi trang vào các file riêng lẻ trong thư mục con có tên là sites-available/. Trong trường hợp này, bạn sẽ tạo rtmp:

sudo nano /etc/nginx/sites-available/rtmp

Thêm nội dung dưới đây:

server {
    listen 8080;
    server_name  localhost;

    # rtmp stat
    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }
    location /stat.xsl {
        root /var/www/html/rtmp;
    }

    # rtmp control
    location /control {
        rtmp_control all;
    }
}

Lưu và đóng file. File stat.xsl từ cấu hình này được sử dụng để tạo kiểu và hiển thị trang thống kê RTMP trong trình duyệt của bạn. File này được cung cấp bởi thư viện libnginx-mod-rtmp mà bạn đã cài đặt từ trước nhưng được nén theo mặc định. Vì vậy bạn sẽ cần giải nén và đặt vào thư mục /var/www/html/rtmp để phù hợp với cấu hình trên.

Tạo thư mục /var/www/html/rtmp, sau đó giải nén file stat.xsl.gz bằng các lệnh sau:

sudo mkdir /var/www/html/rtmp
sudo gunzip -c /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl.gz > /var/www/html/rtmp/stat.xsl

Cuối cùng, để truy cập trang thống kê đã thêm, bạn cần mở một port khác trong tường lửa của mình. Cụ thể, lệnh listen đã được cấu hình với cổng 8080, vì vậy bạn sẽ cần thêm rule để có thể truy cập Nginx trên cổng đó. Tuy nhiên, tốt nhất là chỉ cho phép địa chỉ IP của riêng bạn để tránh người khác có thể truy cập vào. Chạy lệnh sau:

sudo ufw allow from your_ip_address to any port http-alt

Tiếp theo, bạn sẽ cần kích hoạt cấu hình mới này. Quy ước của Nginx là tạo các symbolic link từ các file trong thư mục sites-available/ đến một thư mục khác có tên là sites-enable/ khi bật hoặc tắt chúng. Cần phải sử dụng các đường dẫn một cách đầy đủ để tạo liên kết:

sudo ln -s /etc/nginx/sites-available/rtmp /etc/nginx/sites-enabled/rtmp

Bây giờ bạn có thể tải lại Nginx:

sudo systemctl reload nginx.service

Truy cập http://your_domain:8080/stat trong trình duyệt để xem trang thống kê RTMP. Sau đó làm mới trang trong khi streaming video để có thể xem số liệu thống kê về các thông số. Trong phần cuối cùng, bạn sẽ tìm hiểu cách thực hiện stream trong trình duyệt mà không cần sử dụng nền tảng phát trực tuyến của bên thứ ba hoặc ứng dụng trình phát đa phương tiện.

Bước 5: Tạo stream với công nghệ hiện đại cho trình duyệt (Bước tùy chọn)

Ở bước cuối cùng, bạn có thể thêm một số thành phần hỗ trợ để người dùng có thể phát trực tiếp video từ server bằng trình duyệt web. Có hai giao thức có thể được sử dụng để tạo luồng video dựa trên HTTP là HLS của Apple và MPEG DASH.

Module Nginx-RTMP hỗ trợ cả hai tiêu chuẩn. Để thêm HLS và DASH cho server, bạn cần sửa đổi rtmp trong file nginx.conf của mình.

Mở /etc/nginx/nginx.conf bằng nano hoặc trình chỉnh sửa ưa thích , sau đó thêm các lệnh để file cấu hình có dạng như dưới đây:

sudo nano /etc/nginx/nginx.conf
. . .
rtmp {
        server {
. . .
                application live {
                    	live on;
                    	record off;
                        hls on;
                        hls_path /var/www/html/stream/hls;
                        hls_fragment 3;
                        hls_playlist_length 60;

                        dash on;
                        dash_path /var/www/html/stream/dash;
                }
        }
}
. . .

Lưu và đóng file. Tiếp theo, thêm phần này vào cuối file sites-available/rtmp của bạn:

sudo nano /etc/nginx/sites-available/rtmp
. . .
server {
    listen 8088;

    location / {
        add_header Access-Control-Allow-Origin *;
        root /var/www/html/stream;
    }
}

types {
    application/dash+xml mpd;
}
LƯU Ý:
Tiêu đề Access-Control-Allow-Origin * có nhiệm vụ bật tính năng CORS (Cross-Origin Resource Sharing) vốn bị tắt theo mặc định. Tính năng này giúp trao đổi thông tin với các trình duyệt web truy cập dữ liệu từ server để thông báo rằng nó có thể tải tài nguyên từ các port hoặc domain khác. CORS là cần thiết để tương thích tối đa với các ứng dụng khách HLS và DASH, đồng thời chuyển đổi cấu hình chung khi triển khai web khác.

Lưu và đóng file. Lưu ý rằng bạn đang sử dụng port 8088 để tránh xung đột với bất kỳ dịch vụ nào đang chạy trên cổng 80 hoặc 443. Mở cổng này trong firewall:

sudo ufw allow 8088/tcp

Cuối cùng, hãy tạo một thư mục stream trong thư mục gốc của web để khớp với block cấu hình, đây là nơi Nginx có thể tạo các file cần thiết cho HLS và DASH:

sudo mkdir /var/www/html/stream

Reload Nginx một lần nữa:

sudo systemctl reload nginx

Bây giờ, bạn sẽ có một stream HLS tại http://your_domain:8088/hls/stream.m3u8 và một stream DASH có sẵn tại http://your_domain:8088/dash/stream.mpd. Các endpoint này sẽ có các siêu dữ liệu cần thiết trên nguồn cấp dữ liệu video RTMP của bạn để hỗ trợ các API.

Chia sẻ: Hưng Nguyễn

Có thể bạn chưa biết

Nhận thông báo qua email
Nhận thông báo cho
guest

0 Bình luận
Phản hồi nội tuyến
Xem tất cả bình luận