Có nhiều trường hợp sử dụng để streaming video (phát trực tuyến video). Các nhà cung cấp dịch vụ như Twitch rất phổ biến để xử lý các khía cạnh khám phá web và quản lý cộng đồng của streaming (phát trực tuyến), và phần mềm miễn phí như OBS Studio được sử dụng rộng rãi để kết hợp các lớp phủ video từ nhiều nguồn phát trực tuyến khác nhau trong thời gian thực. Mặc dù các nền tảng này rất mạnh mẽ, nhưng trong một số trường hợp, bạn có thể lưu trữ một stream không phụ thuộc vào các nhà cung cấp dịch vụ khác.
Trong hướng dẫn này, bạn sẽ học cách thiết lập cấu hình máy chủ web Nginx để lưu trữ RTMP video stream độc lập, có thể được liên kết và xem trong các ứng dụng khác nhau. RTMP, Real-Time Messaging Protocol (Giao thức nhắn tin thời gian thực), xác định các nguyên tắc cơ bản của hầu hết các video trực tuyến trên internet. Bạn cũng sẽ học cách lưu trữ các HLS và DASH stream hỗ trợ các nền tảng hiện đại hơn bằng cách sử dụng cùng một công nghệ.
Để hoàn thành hướng dẫn này, bạn sẽ cần:
Hướng dẫn này sẽ sử dụng tên miền trình giữ chỗ your_domain cho URL và tên máy chủ. Thay thế tên miền này bằng tên miền hoặc địa chỉ IP của riêng bạn khi bạn thực hiện qua hướng dẫn.
Hầu hết các công cụ phát trực tuyến hiện đại đều hỗ trợ giao thức RTMP, giao thức này xác định các thông số cơ bản của video stream trên internet. Máy chủ web Nginx bao gồm một mô-đun cho phép bạn cung cấp RTMP stream với cấu hình tối thiểu từ một URL chuyên dụng, giống như nó cung cấp quyền truy cập HTTP vào các trang web theo mặc định. Mô-đun Nginx RTMP không tự động được bao gồm trong Nginx, nhưng trên Ubuntu 20.04 và hầu hết các bản phân phối Linux khác, bạn có thể cài đặt nó như một gói bổ sung.
Bắt đầu bằng cách chạy các lệnh sau với tư cách là non-root user để cập nhật danh sách gói của bạn và cài đặt mô-đun Nginx:
- sudo apt update
- sudo apt install libnginx-mod-rtmp
Việc cài đặt mô-đun sẽ không tự động bắt đầu cung cấp stream. Bạn sẽ cần thêm khối cấu hình vào tệp cấu hình Nginx của mình để xác định vị trí và cách thức stream sẽ khả dụng.
Sử dụng nano
hoặc trình soạn thảo văn bản yêu thích của bạn, mở tệp cấu hình chính của Nginx, /etc/nginx/nginx.conf
và thêm khối cấu hình này vào cuối tệp:
- 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;
}
}
}
listen 1935
có nghĩa là RTMP sẽ lắng nghe các kết nối trên cổng 1935, đây là cổng tiêu chuẩn.chunk_size 4096
có nghĩa là RTMP sẽ gửi dữ liệu trong các khối 4KB, đây cũng là tiêu chuẩn.llow publish 127.0.0.1
và deny publish all
đều có nghĩa là máy chủ sẽ 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 đẩy stream của riêng họ.application live
xác định một khối ứng dụng sẽ có sẵn tại đường dẫn URL /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, một giả định cơ bản về video streaming.record off
sẽ tắt chức năng ghi của Nginx-RTMP để tất cả các stream không được lưu riêng vào đĩa theo mặc định.Lưu và đóng tập tin. 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
.
Điều này cung cấp sự khởi đầu của cấu hình RTMP của bạn. Theo mặc định, nó sẽ lắng nghe trên cổng 1935
, có nghĩa là bạn sẽ cần mở cổng đó trong tường lửa của mình. Nếu bạn đã thiết lập 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ể tải lại Nginx với các thay đổi của mình:
- sudo systemctl reload nginx.service
Bây giờ bạn sẽ có một máy chủ RTMP đang hoạt động. Trong phần tiếp theo, chúng tôi sẽ đề cập đến việc phát trực tuyến video tới máy chủ RTMP của bạn từ cả nguồn cục bộ và nguồn từ xa.
Có nhiều cách để gửi video đến máy chủ RTMP của bạn. Một tùy chọn là sử dụng ffmpeg
, một tiện ích audio-video dòng lệnh phổ biến, để phát tệp video trực tiếp trên máy chủ của bạn. Nếu bạn chưa có tệp video trên máy chủ, bạn có thể tải tệp xuống bằng youtube-dl
, một công cụ dòng lệnh để 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ài đặt Python cập nhật trên máy chủ của mình.
Đầu tiên, hãy cài đặt Python và trình quản lý gói của nó, pip
:
- sudo apt install python3-pip
Tiếp theo, sử dụng pip
để cài đặt youtube-dl
:
- pip install youtube-dl
Giờ đây, bạn có thể sử dụng youtube-dl
để tải xuống video từ YouTube. Nếu bạn chưa có ý định, hãy thử video này, giới thiệu Nền tảng ứng dụng của DigitalOcean:
- youtube-dl https://www.youtube.com/watch?v=iom_nhYQIYk
Bạn sẽ thấy một số đầu ra khi youtube-dl
kết hợp các video và audio stream mà nó đang tải xuống lại thành một tệp duy nhất - điều này là bình thường.
Output[youtube] iom_nhYQIYk: Downloading webpage
WARNING: Requested formats are incompatible for merge and will be merged into mkv.
[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4
[download] 100% of 32.82MiB in 08:40
[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm
[download] 100% of 1.94MiB in 00:38
[ffmpeg] Merging formats into "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv"
Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4 (pass -k to keep)
Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm (pass -k to keep)
Bây giờ bạn sẽ có một tệp video trong thư mục hiện tại của mình với tiêu đề như Introducing App Platform by DigitalOcean-iom_nhYQIYk.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ó đến máy chủ RTMP của bạn:
- ffmpeg -re -i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv" -c:v copy -c:a aac -ar 44100 -ac 1 -f flv rtmp://localhost/live/stream
Lệnh ffmpeg
này đang thực hiện một số việc để chuẩn bị video có định dạng thân thiện với phát trực tuyến. Đây không phải là một hướng dẫn ffmpeg
, vì vậy bạn không cần phải kiểm tra nó quá kỹ, nhưng bạn có thể hiểu các tùy chọn khác nhau như sau:
-re
chỉ định rằng đầu vào sẽ được đọc ở tốc độ khung hình gốc của nó.-i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv"
chỉ định đường dẫn đến tệp đầu vào của chúng ta.-c: v
được đặt thành copy
, nghĩa là bạn đang sao chép định dạng video mà bạn nhận được từ YouTube.-c: a
có các tham số khác, cụ thể là aac -ar 44100 -ac 1
, vì bạn cần lấy mẫu lại âm thanh sang định dạng thân thiện với RTMP. aac
là audio codec đượ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 cho các mục đích tương thích.-f flv
bao bọc video trong vùng chứa định dạng flv
để có khả năng tương thích tối đa với RTMP.Video được gửi đến rtmp://localhost/live/stream
vì bạn đã xác định khối cấu hình live
ở Bước 1 và stream
là một URL được chọn tùy ý cho video này.
Lưu ý: Bạn có thể tìm hiểu thêm về các tùy chọn ffmpeg
từ ffmprovisr, danh mục các ví dụ lệnh ffmpeg
do cộng đồng duy trì hoặc tham khảo tài liệu chính thức.
Trong khi ffmpeg
đang phát trực tuyến video, nó sẽ in timecodes (mã thời gian):
Outputframe= 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à đầu ra ffmpeg
tiêu chuẩn. Nếu bạn đang chuyển đổi video sang một định dạng khác, những điều này có thể hữu ích để hiểu được video đang được lấy mẫu lại hiệu quả như thế nào, nhưng trong trường hợp này, bạn chỉ cần thấy rằng video đang được phát lại một cách nhất quán. Sử dụng video mẫu này, bạn sẽ nhận được gia số fps = 25
chính xác.
Trong khi ffmpeg đang chạy, bạn có thể kết nối với RTMP stream của mình từ trình phát video. Nếu bạn đã cài đặt VLC
, mpv
hoặc một trình phát đa phương tiện cục bộ khác, bạn sẽ có thể xem stream của mình bằng cách mở URL rtmp://your_domain/live/stream
trong trình phát đa phương tiện của bạn. Stream của bạn sẽ kết thúc sau khi ffmpeg
phát xong video. Nếu bạn muốn nó tiếp tục lặp lại vô thời hạn, bạn có thể thêm -stream_loop -1
vào đầu lệnh ffmpeg
của mình.
Lưu ý: Bạn cũng có thể phát trực tiếp tới, chẳng hạn như 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
của bạn bằng rtmps://live-api-s.facebook.com:443/rtmp/your-facebook-stream-key
. YouTube sử dụng các URL như rtmp://a.rtmp.youtube.com/live2
. Các nhà cung cấp phát trực tuyến khác có thể sử dụng RTMP stream sẽ hoạt động tương tự.
Bây giờ bạn đã học cách truyền các nguồn video tĩnh từ dòng lệnh, bạn sẽ tìm hiểu cách phát trực tuyến video từ các nguồn động bằng OBS trên máy tính để bàn.
Phát trực tuyến qua ffmpeg
rất tiện lợi khi bạn có một video đã chuẩn bị muốn phát lại, nhưng phát trực tiếp có thể linh động hơn nhiều. Phần mềm phổ biến nhất để phát trực tiếp là OBS hoặc Open Broadcaster Software - phần mềm này miễn phí, mã nguồn mở và rất mạnh mẽ.
OBS là một ứng dụng dành cho máy tính để bàn và sẽ kết nối với máy chủ của bạn từ máy tính cục bộ của bạn.
Sau khi cài đặt OBS, việc thiết lập cấu hình nó có nghĩa là tùy chỉnh cửa sổ máy tính để bàn và nguồn âm thanh nào bạn muốn thêm vào stream của mình, sau đó thêm thông tin đăng nhập cho dịch vụ phát trực tuyến. Hướng dẫn này sẽ không đề cập đến cấu hình phát trực tuyến của bạn, vì nó tùy thuộc vào tùy chọn và theo mặc định, bạn có thể có bản demo hoạt động bằng cách chỉ phát trực tuyến toàn bộ màn hình của mình. Để đặt thông tin xác thực dịch vụ phát trực tuyến của bạn, hãy mở menu cài đặt của OBS, điều hướng đến tùy chọn Stream và nhập các tùy chọn sau:
Streaming Service: Custom
Server: rtmp://your_domain/live
Play Path/Stream Key: obs_stream
obs_stream
là một đường dẫn được chọn tùy ý - trong trường hợp này, video của bạn sẽ có sẵn tại rtmp://your_domain/live/obs_stream
. Bạn không cần bật xác thực, nhưng bạn cần thêm một mục bổ sung vào danh sách trắng IP mà bạn đã thiết lập cấu hình ở Bước 1.
Quay lại máy chủ, mở tệp cấu hình chính của Nginx, /etc/nginx/nginx.conf
và thêm một mục nhập allow publish
bổ sung cho địa chỉ IP cục bộ của bạn. Nếu bạn không biết địa chỉ IP cục bộ của mình, tốt nhất bạn chỉ nên truy cập vào một trang web như What’s my IP, nơi có thể cho bạn biết bạn đã truy cập nó từ đâu:
- 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 tệp, sau đó tải lại 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 của bạn trong một trình phát đa phương tiện như trước đây. Bây giờ bạn đã thấy các nguyên tắc cơ bản của việc phát trực tuyến video trong thực tế, bạn có thể thêm một vài tính năng khác vào máy chủ của mình để làm cho nó sẵn sàng sản xuất hơn.
Bây giờ bạn đã thiết lập cấu hình Nginx để phát trực tuyến video bằng mô-đun Nginx-RTMP, bước tiếp theo phổ biến là bật trang thống kê RTMP. Thay vì thêm càng nhiều chi tiết cấu hình vào tệp nginx.conf
chính của bạn, Nginx cho phép bạn thêm các cấu hình cho từng trang vào các tệp riêng lẻ trong một thư mục con được gọi là sites-available/
. Trong trường hợp này, bạn sẽ tạo một cái tên là rtmp
:
- sudo nano /etc/nginx/sites-available/rtmp
Thêm các nội dung sau:
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 tập tin. Tệp stat.xsl
từ khối 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. Nó được cung cấp bởi thư viện libnginx-mod-rtmp
mà bạn đã cài đặt trước đó, nhưng nó được nén theo mặc định, vì vậy bạn sẽ cần giải nén nó và đặt nó vào thư mục /var/www/html/rtmp
để phù hợp với cấu hình trên . Lưu ý rằng bạn có thể tìm thêm thông tin về bất kỳ tùy chọn nào trong tài liệu Nginx-RTMP.
Tạo thư mục /var/www/html/rtmp
, sau đó giải nén tệp 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ê mà bạn đã thêm, bạn sẽ cần mở một cổng khác trong tường lửa của mình. Cụ thể, chỉ thị listen
được thiết lập cấu hình với cổng 8080
, vì vậy bạn sẽ cần thêm quy tắc để truy cập Nginx trên cổng đó. Tuy nhiên, có thể bạn không muốn người khác có thể truy cập trang thống kê của mình, vì vậy tốt nhất bạn chỉ nên cho phép trang đó đối với địa chỉ IP của riêng bạn. 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 liên kết tượng trưng (như phím tắt) từ các tệp trong sites-available/
đến một thư mục khác được gọi là sites-enabled/
khi bạn quyết định bật hoặc tắt chúng. Sử dụng các đường dẫn đầy đủ để rõ ràng, hã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 một lần nữa để xử lý các thay đổi của mình:
- sudo systemctl reload nginx.service
Bây giờ bạn có thể truy cập http://your_domain:8080/stat
trong trình duyệt để xem trang thống kê RTMP. Truy cập và làm mới trang trong khi phát trực tuyến video và xem khi thống kê stream thay đổi.
Bây giờ, bạn đã thấy cách theo dõi video stream của mình và chuyển nó đến các nhà cung cấp bên thứ ba. Trong phần cuối cùng, bạn sẽ tìm hiểu cách cung cấp trực tiếp trong trình duyệt mà không cần sử dụng các nền tảng phát trực tuyến của bên thứ ba hoặc các ứng dụng trình phát đa phương tiện độc lập.
Bước cuối cùng, bạn có thể muốn thêm hỗ trợ cho các streaming protocol (giao thức phát trực tuyến) mới hơn để người dùng có thể truyền trực tiếp video từ máy chủ của bạn bằng trình duyệt web. Có hai giao thức mà bạn có thể sử dụng để tạo luồng video dựa trên HTTP: Apple’s HLS và MPEG DASH. Cả hai đều có ưu điểm và nhược điểm, vì vậy bạn có thể sẽ muốn hỗ trợ cả hai.
Mô-đun Nginx-RTMP hỗ trợ cả hai tiêu chuẩn. Để thêm hỗ trợ HLS và DASH vào máy chủ của bạn, bạn sẽ cần sửa đổi khối rtmp
trong tệp 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 của bạn, sau đó thêm các lệnh được đánh dấu sau:
- 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 tập tin. Tiếp theo, thêm phần dưới đây vào cuối 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 *
cho phép CORS hoặc Cross-Origin Resource Sharing bị tắt theo mặc định. Điều này thông báo với bất kỳ trình duyệt web nào đang truy cập dữ liệu từ máy chủ của bạn rằng máy chủ có thể tải tài nguyên từ các cổng hoặc miền khác. CORS là cần thiết để có khả năng tương thích tối đa với các máy khách HLS và DASH, đồng thời chuyển đổi cấu hình phổ biến trong nhiều triển khai web khác.
Lưu và đóng tập tin. Lưu ý rằng bạn đang sử dụng cổng 8088
tại đây, đây là một lựa chọn tùy ý khác cho hướng dẫn này để tránh xung đột với bất kỳ dịch vụ nào bạn có thể đang chạy trên cổng 80 hoặc 443. Bạn cũng sẽ muốn mở cổng đó trong tường lửa của mình ngay bây giờ:
- sudo ufw allow 8088/tcp
Cuối cùng, tạo một thư mục stream
trong thư mục gốc web của bạn để khớp với khối cấu hình, để Nginx có thể tạo các tệp cần thiết cho HLS và DASH:
- sudo mkdir /var/www/html/stream
Tải lại Nginx:
- sudo systemctl reload nginx
Bây giờ bạn sẽ có một HLS stream tại http://your_domain:8088/hls/stream.m3u8
và một DASH stream có sẵn tại http://your_domain:8088/dash/stream.mpd
. Các điểm cuối này sẽ tạo bất kỳ siêu dữ liệu cần thiết nào trên đầu nguồn cấp dữ liệu video RTMP của bạn để hỗ trợ các API hiện đại.
Các tùy chọn cấu hình mà bạn đã sử dụng trong hướng dẫn này đều được ghi lại trong trang Nginx RTMP Wiki. Các mô-đun Nginx thường chia sẻ cú pháp chung và hiển thị một tập hợp rất lớn các tùy chọn cấu hình và bạn có thể xem lại tài liệu của chúng để thay đổi bất kỳ cài đặt nào của mình từ đây.
Gần như tất cả video streaming trên internet đều được triển khai trên RTMP, HLS và DASH, và bằng cách sử dụng phương pháp mà bạn đã khám phá trong hướng dẫn này, bạn có thể cung cấp stream của mình qua các dịch vụ phát sóng khác hoặc hiển thị theo bất kỳ cách nào khác mà bạn chọn.