HTTP Live Streaming (HLS) là một giao thức truyền phát video rất mạnh mẽ được thực hiện bởi Apple Inc. HLS sử dụng các giao dịch HTTP để vượt qua tường lửa, proxy và có thể được phân phối dễ dàng thông qua CDN. Do đó, công nghệ này có thể tiếp cận đối tượng xem lớn hơn nhiều so với RTP hoặc các giao thức dựa trên UDP khác. Phần lớn video phát trực tuyến trực tuyến ngày nay được lưu trữ bởi các hệ thống đắt tiền sử dụng HLS, nhưng chúng thường đắt tiền và đòi hỏi nhiều tài nguyên máy chủ. Hướng dẫn này sẽ chỉ cho bạn cách thiết lập VPS Ubuntu 14.04 VULTR rất phải chăng để thực hiện các sự kiện phát trực tiếp HLS chỉ bằng phần mềm nguồn mở.
Bước đầu tiên là đọc và thiết lập máy chủ của bạn theo " Cài đặt Nginx-RTMP trên Ubuntu 14.04 " của Vultr Doc . Các hướng dẫn trong tài liệu đó là toàn diện nhất cho giai đoạn thiết lập, tại thời điểm viết. Tôi sẽ đề cập rằng bạn có thể muốn thay thế "nginx-1.7.5" bằng "nginx-1.9.4" hoặc bất cứ phiên bản mới nhất nào của Nginx có sẵn. Một gợi ý khác là biên dịch Nginx với mô đun trạng thái sơ khai HTTP để cung cấp cho bạn khả năng giám sát số lượng người xem HLS trực tiếp mà bạn có sau này.
Thay vì biên dịch với:
./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
Sử dụng chuỗi này trong quy trình được nêu trong tài liệu tiên quyết:
./configure --with-http_ssl_module --with-http_stub_status_module --add-module=../nginx-rtmp-module-master
Ví dụ trong hướng dẫn này sẽ tạo cả luồng "trực tiếp" và "di động" (được tối ưu hóa) và sẽ sử dụng ffmpeg (được cài đặt trong hướng dẫn trước) để tạo luồng HLS được tối ưu hóa cho thiết bị di động được điều chỉnh tốc độ bit. Ví dụ này cũng sẽ cho thấy cách khiến máy chủ tự động ghi lại các luồng trực tiếp của bạn và cho phép bạn phát lại các bản ghi dưới dạng dịch vụ phát lại video theo yêu cầu (VOD).
Đầu tiên, tạo các cấu trúc thư mục cần thiết để giữ các bản kê khai và đoạn video HLS trực tiếp và di động:
sudo mkdir /HLS
sudo mkdir /HLS/live
sudo mkdir /HLS/mobile
sudo mkdir /video_recordings
sudo chmod -R 777 /video_recordings
Có lẽ nên bật tường lửa của bạn nếu bạn chưa thực hiện. Nếu vậy, bạn phải cho phép lưu lượng truy cập vào các cổng được sử dụng bởi Nginx và HLS. Nếu bây giờ bạn muốn chạy mà không có tường lửa, hãy bỏ qua phần ufw bên dưới.
sudo ufw limit ssh
sudo ufw allow 80
sudo ufw allow 1935
sudo ufw enable
Truyền phát HLS yêu cầu cấu hình Nginx khác biệt đáng kể so với cấu hình RTMP trong bài viết đầu tiên. Chỉnh sửa nginx.conf
tệp của bạn để sử dụng thông tin sau, thay thế "my-ip" và "my-stream-key" bằng thông tin của bạn. Bạn có thể sử dụng bất cứ điều gì bạn muốn cho "my-stream-key", đó chỉ là một từ duy nhất và hữu ích cho bạn. Bạn có thể muốn sao lưu tệp cấu hình ban đầu của mình trước, sau đó dán thông tin cấu hình được cung cấp của tôi vào trình chỉnh sửa, thay thế mọi thứ có ở đó:
sudo cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.original
sudo nano /usr/local/nginx/conf/nginx.conf
Nginx.conf mới:
worker_processes 1;
error_log logs/error.log debug;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
allow play all;
#creates our "live" full-resolution HLS videostream from our incoming encoder stream and tells where to put the HLS video manifest and video fragments
application live {
allow play all;
live on;
record all;
record_path /video_recordings;
record_unique on;
hls on;
hls_nested on;
hls_path /HLS/live;
hls_fragment 10s;
#creates the downsampled or "trans-rated" mobile video stream as a 400kbps, 480x360 sized video
exec ffmpeg -i rtmp://192.168.254.178:1935/$app/$name -acodec copy -c:v libx264 -preset veryfast -profile:v baseline -vsync cfr -s 480x360 -b:v 400k maxrate 400k -bufsize 400k -threads 0 -r 30 -f flv rtmp://192.168.254.178:1935/mobile/$;
}
#creates our "mobile" lower-resolution HLS videostream from the ffmpeg-created stream and tells where to put the HLS video manifest and video fragments
application mobile {
allow play all;
live on;
hls on;
hls_nested on;
hls_path /HLS/mobile;
hls_fragment 10s;
}
#allows you to play your recordings of your live streams using a URL like "rtmp://my-ip:1935/vod/filename.flv"
application vod {
play /video_recordings;
}
}
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name 192.168.254.178;
#creates the http-location for our full-resolution (desktop) HLS stream - "http://my-ip/live/my-stream-key/index.m3u8"
location /live {
types {
application/vnd.apple.mpegurl m3u8;
}
alias /HLS/live;
add_header Cache-Control no-cache;
}
#creates the http-location for our mobile-device HLS stream - "http://my-ip/mobile/my-stream-key/index.m3u8"
location /mobile {
types {
application/vnd.apple.mpegurl m3u8;
}
alias /HLS/mobile;
add_header Cache-Control no-cache;
}
#allows us to see how stats on viewers on our Nginx site using a URL like: "http://my-ip/stats"
location /stats {
stub_status;
}
#allows us to host some webpages which can show our videos: "http://my-ip/my-page.html"
location / {
root html;
index index.html index.htm;
}
}
}
Nhấn Ctrl + X để thoát. Nói "có" để lưu các thay đổi.
Bạn có thể tìm thấy hướng dẫn rõ ràng và ví dụ về các biến có thể có trong nginx.conf
tệp này nếu bạn truy vấn công cụ tìm kiếm yêu thích của mình để biết "chỉ thị nginx-rtmp". Tôi đã sử dụng nginx-rtmp với HLS trong một số năm nay, mà không sử dụng các chỉ thị "cho phép xuất bản" và "từ chối xuất bản" và tôi đã thấy không có trường hợp nào mọi người sử dụng / xâm chiếm máy chủ video của tôi. Vì vậy, tôi đã không bao gồm những chỉ thị ở đây. Đọc về và thêm các chỉ thị này nếu bạn muốn.
Sau khi thay đổi nginx.conf
tệp, bạn phải khởi động lại Nginx để sử dụng cấu hình mới:
sudo service nginx restart
Theo dõi chặt chẽ mọi thông báo lỗi Nginx và giải quyết bất kỳ lỗi nào có thể do lỗi chính tả, quyền sở hữu thư mục hoặc các vấn đề về quyền. Nếu bạn không có thông báo lỗi, thì bạn đã sẵn sàng tạo luồng mã hóa của mình.
Bạn phải có một bộ mã hóa video để tạo luồng. Tôi sử dụng OBS (Open Broadcaster Software) - đây là nguồn mở và hoạt động tốt với tôi. Có những giải pháp khác để lựa chọn, nằm ngoài phạm vi của hướng dẫn này. Tôi sẽ không bao gồm mọi thứ về việc định cấu hình bộ mã hóa video RTMP. Tất cả đều yêu cầu khoảng các biến đầu vào giống nhau mặc dù. Các cài đặt chính bạn sẽ cần nhập để sử dụng nginx.conf
cấu hình chính xác của tôi và để hoạt động tốt trên hầu hết các trình phát / trình duyệt / nền tảng như sau:
- Bộ mã hóa-x264
- Tốc độ bit thay đổi (không phải CBR hoặc Tốc độ bit không đổi), Chất lượng cao nhất
- Tốc độ bit tối đa-600kb / giây
- Audio-Codec-AAC
- Định dạng âm thanh-44.1khz
- Audio-bitrate-64kbps
- URL FMS- "rtmp: // my-ip: 1935 / live"
- Luồng khóa- "khóa của tôi"
- Độ phân giải-640x480
- FPS (khung hình mỗi giây) -30
- CFR (Tốc độ khung hình không đổi) - Có
- Khoảng cách khung hình - 2 giây (một khung hình chính cứ sau 2 giây)
- x264 Mã hóa đường cơ sở hồ sơ (có thể hoạt động với chính Chính tùy thuộc vào trình phát được sử dụng)
- CPU x264 Hiện tại rất nhanh
Tôi khuyên bạn nên thử các bộ mã hóa khác nhau và thử nghiệm chúng. Bạn có thể muốn tỷ lệ khung hình rộng - hoặc các tài liệu máy ảnh của bạn (hoặc chương trình phát sóng khác) có thể yêu cầu nó. Nếu vậy, hãy chắc chắn thay đổi thông tin này trong bộ mã hóa của bạn và tỷ lệ khung hình được liệt kê trong phần exec-ffmpeg của nginx.conf
tệp mà tôi đã cung cấp; nếu không, bạn sẽ nhận được một số nguồn cấp dữ liệu video tìm kiếm ngớ ngẩn.
Khi bộ mã hóa của bạn được thiết lập, bạn có thể kiểm tra tất cả. Khởi động bộ mã hóa với webcam của bạn hoặc một số loại thức ăn thử nghiệm chạy trên nó. Bạn có thể xem chương trình phát của mình tại thời điểm này với trình phát VLC bằng URL, chẳng hạn như:
http://my-ip/live/my-stream-key/index.m3u8
http://my-ip/mobile/my-stream-key/index.m3u8
Đây là cho các luồng video chính và di động của bạn, tương ứng. Thay thế IP của bạn và khóa truyền phát phù hợp.
Sau khi bạn phát sóng thành công kiểm tra luồng đầu tiên của bạn (thông qua ssh hoặc ftp) rằng chương trình phát trực tiếp của bạn đã được ghi lại trong /video_recordings
thư mục trên VPS Vultr của bạn. Bạn cũng có thể thử phát tệp được ghi trong VLC này bằng một URL như:
rtmp://my-ip/vod/filename.flv
Số liệu thống kê Nginx cũng có sẵn (với Nginx stub_status). Để xem số liệu thống kê về khách truy cập / người xem, truy cập:
http://my-ip/stats
Để xem video của bạn trên trang web, bạn sẽ cần một trình phát có thể nhúng. Có rất nhiều trình phát có thể nhúng sẽ phát video HLS. Tôi đã sử dụng JW Player trong một số năm nay, nhưng phiên bản miễn phí sẽ không chơi HLS. Flowplayer và Bitdash của Bitmovin (trong số các giải pháp khác) đủ hào phóng để cung cấp phiên bản phi thương mại cho người chơi của họ, điều này sẽ khiến luồng HLS của bạn được nhúng trong trang web. Đối với bài viết này, tôi đã thử cả hai và thấy cả hai đều hoạt động khá tốt với máy chủ video dựa trên Vultr / Nginx của tôi. Tôi sẽ trình bày ngắn gọn về cách tôi sử dụng Flowplayer với máy thử nghiệm của mình.
Nếu bạn định sử dụng phát trực tiếp HLS theo bất kỳ cách thông thường, duy trì hoặc thương mại nào, tôi sẽ khuyến khích bạn mua giấy phép từ Flowplayer hoặc bất kỳ người chơi nào bạn quyết định sử dụng. Bạn sẽ nhận được một trình phát có ít hạn chế hơn, nhiều tính năng hơn và có thể được gắn nhãn cho tổ chức của bạn. Bạn cũng sẽ nhận được hỗ trợ - có thể rất quan trọng. Khác với VPS Vultr, đây thực sự là chi phí duy nhất liên quan đến dự án.
Trước khi bạn làm bất cứ điều gì khác, điều quan trọng là phải quan tâm đến những hạn chế được gọi là "tên miền chéo", điều này sẽ làm tắt khả năng phát trực tuyến của bạn đến một trang web / trang web. Tạo một crossdomain.xml
tệp trong nginx/html
thư mục của bạn và đặt hướng dẫn trong đó để cho phép dữ liệu chảy giữa các tên miền:
sudo nano /usr/local/nginx/html/crossdomain.xml
Đầu tiên sao chép (từ trang này) và sau đó dán (nhấp chuột phải) vào trường trình soạn thảo nano dữ liệu XML sau:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
Nhấn Ctrl + O để ghi ra, sau đó Ctrl + X để lưu tệp vào đĩa và thoát.
Tôi đã lấy HTML5 (phiên bản 6.0.3) của Flowplayer, cho tôi một số tệp và thư mục khi giải nén. Tôi đã tải lên tất cả các tệp và thư mục vào thư mục con của thư mục gốc Nginx / HTML mà tôi đặt tên là "Flowplayer". Con đường chính xác là /usr/local/nginx/html/flowplayer
.
Để kiểm tra video của chúng tôi khi được nhúng vào trang web, hãy tạo một vài tệp HTML trong thư mục gốc của thư mục Nginx / HTML bằng cách sử dụng nano và điền vào chúng những nội dung sau.
Tập tin:
sudo nano /usr/local/nginx/html/hls.html
Mã HTML:
<!doctype html>
<head>
<link rel="stylesheet" href="#">
</head>
<body>
640x480 664kbps (live) Desktop Browsers<br>
<div style="width:640px;" class="flowplayer" data-swf="flowplayer/flowplayer.swf" data-ratio="0.75">
<video>
<source type="application/x-mpegurl" src="">
</video>
</div>
<br><br>
480x360 464kbps (mobile) Mobile Browsers <br>
<div style="width:480px;" class="flowplayer" data-swf="flowplayer/flowplayer.swf" data-ratio="0.75">
<video>
<source type="application/x-mpegurl" src="">
</video>
</div>
</body>
Tập tin:
sudo nano /usr/local/nginx/html/hls_progressive.html
Mã HTML:
<!doctype html>
<head>
<link rel="stylesheet" href="#">
<style> .flowplayer { width: 640px; } </style>
</head>
<body>
<div class="flowplayer" data-swf="flowplayer/flowplayer.swf" data-ratio="0.75">
<video>
<source type="application/x-mpegurl" src="">
<source type="application/x-mpegurl" src="">
</video>
</div>
<br>
</body>
Hãy chắc chắn thay thế "my-ip" và "my-stream-key" bằng dữ liệu của bạn.
Bạn phải thay thế đường dẫn flowplayer/skin/functional.css
cho dấu "#" trong biểu định kiểu href="#"
. Phần mềm hướng dẫn loại bỏ đường dẫn. Bạn phải điền một URL trong src=""
phần - nó đang bị loại bỏ bởi phần mềm hướng dẫn, sử dụng http://my-ip/live/my-stream-key/index.m3u8
và http://my-ip/mobile/my-stream-key/index.m3u8
, tương ứng. Bạn cũng phải thêm src
các thẻ script vào đầu cho cả hai jquery-1.11.2.min.js
và cho flowplayer.min.js
. Các thẻ đang được gỡ bỏ bởi phần mềm hướng dẫn. Bạn có thể tìm cách tạo thời trang cho các thẻ này bằng cách xem example html
tệp có trong bộ công cụ Flowplayer.
Khởi động bộ mã hóa với webcam của bạn hoặc một số loại thức ăn thử nghiệm chạy trên nó. Bạn có thể xem chương trình phát của mình trong trình duyệt bằng các URL sau:
http://my-ip/hls.html
http://my-ip/hls_progressive.html
Trang đầu tiên chỉ hiển thị từng luồng của bạn - kênh chính và nền tảng di động. Bạn sẽ có thể khởi động cả hai và xem chúng. Bạn sẽ nhận thấy rằng luồng nền tảng di động có kích thước nhỏ hơn. Các bước này chỉ để đảm bảo rằng mọi thứ đang chạy.
Trang thứ hai hiển thị một luồng duy nhất. Nhưng nó được thiết lập theo cách gọi là "truyền phát liên tục". Điều này có nghĩa là khi người xem phát video, cả máy chủ và trình phát đều cố gắng cung cấp cho người xem luồng bitrate cao, chất lượng cao nếu kết nối người xem có thể duy trì video đó. Nếu kết nối của họ kém và không thể duy trì kết nối, nó sẽ cuộn xuống để hiển thị luồng bitrate thấp hơn (di động) có băng thông thấp hơn 200 kbps. Nếu bạn muốn, bạn có thể tạo nhiều luồng tốt hơn, lũy tiến hơn với ffmpeg và định cấu hình chúng bằng ví dụ của tôi.
Tôi đã thử nghiệm cấu hình này trên một lõi Vultr VPS 1GB và tôi thấy rằng với một luồng trực tiếp duy nhất, cộng với luồng di động được xếp hạng chuyển đổi mà nó tạo ra với ffmpeg, việc sử dụng cpu ít hơn 35% và nó chỉ tiêu thụ 100 MB 1GB ram của tôi. Bây giờ đó là một thiết lập rất hiệu quả.
Nếu bạn dự định truyền phát video có kích thước pixel lớn hơn nhiều so với SD, bạn có thể thấy rằng bạn phải sử dụng VPS mạnh hơn. Tôi đã tò mò về điều này và đã chạy luồng chính của mình lên tới 1280x960 pixel và 2Mbps - tăng thêm tải cho mọi thứ. Nhưng VPS vẫn chỉ sử dụng 50% CPU và sử dụng bộ nhớ vẫn ở mức 100MB. Tôi đã thêm một tá người xem / trình duyệt và nó hầu như không có sự khác biệt về tải trên VPS VPS chỉ có băng thông được sử dụng tăng lên. Tôi chắc chắn rằng việc tạo các luồng đánh giá chuyển tiếp bổ sung với ffmpeg sẽ tiếp tục đặt thêm tải cho hệ thống.
Tôi đã sử dụng loại máy chủ này trong môi trường sản xuất có từ 50 đến 100 người dùng đồng thời và thấy rằng việc sử dụng tài nguyên tăng lên rất ít khi tăng kết nối người xem. Thử nghiệm với nó. Nhưng tôi nghĩ rằng hầu hết người dùng sẽ hài lòng khi sử dụng VPS 1GB lõi đơn. Tận hưởng máy chủ phát trực tuyến HLS mới của bạn!