ฉันทำงานให้กับหน่วยงานของรัฐขนาดเล็กที่ต้องการจัดให้มีการถ่ายทอดสดการประชุมคณะกรรมการสำหรับสาธารณะ เราใช้ OBS ในการเข้ารหัสและไม่เคยสร้างปัญหาใดๆ ให้กับเรา แต่เมื่อเร็วๆ นี้เรามีข้อร้องเรียนมากมายว่าสตรีมแบบสดของเราขาดการเชื่อมต่อหรือโหลดไม่ได้เลยบนเว็บเอนด์ของเรา
เราใช้เซิร์ฟเวอร์สตรีม NGINX RTMP/HLS ที่สร้างขึ้นเมื่อ 5 ปีที่แล้วเพื่อให้บริการสตรีมนี้ และเมื่อไม่นานมานี้ ฉันได้อัปเดตเป็นเซิร์ฟเวอร์ Ubuntu เวอร์ชันล่าสุดและเพื่อให้ทันสมัยที่สุดเท่าที่จะเป็นไปได้ ฉันยังติดตั้ง NGINX ใหม่และ อัปเดตบางสิ่งที่นี่และที่นั่น แต่โดยทั่วไปจะเก็บการกำหนดค่าเก่าของเราไว้ อย่างไรก็ตาม ตอนนี้ฉันได้ทำการทดสอบแล้ว ฉันสังเกตเห็นประสิทธิภาพที่มีปัญหาซึ่งอาจเป็นเบราว์เซอร์ แต่ฉันอยากจะถามที่นี่ก่อนเพื่อให้แน่ใจว่าเซิร์ฟเวอร์ของเราเล่นตามกฎ
nginx.conf ของเรามีดังนี้:
load_module "โมดูล/ngx_rtmp_module.so";
ผู้ใช้ www-data;
worker_processes อัตโนมัติ
เหตุการณ์ {
worker_connections 1024;
}
http {
รวม /etc/nginx/mime.types;
แอปพลิเคชัน default_type/octet-stream;
ส่งไฟล์บน;
keepalive_timeout 65;
# หากคุณต้องการเปิดใช้งาน gzip ให้ยกเลิกการแสดงความคิดเห็นต่อไปนี้:
#gzip บน;
#gzip_disable "msie6";
เซิร์ฟเวอร์{
ฟัง 80;
server_name localhost;
add_header Access-Control-Allow-Origin *;
#rtmp สถานะ
สถานที่ /สถิติ{
rtmp_stat ทั้งหมด;
rtmp_stat_stylesheet stat.xsl;
}
ตำแหน่ง /stat.xsl {
#สิ่งนี้จะย้าย stat.xsl ไปยังตำแหน่งอื่น
รูท /usr/src/nginx-rtmp-module;
}
ตำแหน่ง / ควบคุม {
rtmp_control ทั้งหมด;
}
error_page 500 502 503 504 /50x.html;
ตำแหน่ง = /50x.html {
รูท html;
}
#client (VLC และอื่นๆ) สามารถเข้าถึง HLS ได้ที่นี่
ตำแหน่ง /hls {
ราก /tmp;
add_header 'การควบคุมแคช' 'ไม่มีแคช';
add_header 'Access-Control-Allow-Origin' '*' เสมอ;
add_header 'Access-Control-Expose-Headers' 'ความยาวเนื้อหา';
ถ้า ($request_method = 'ตัวเลือก'){
add_header 'การควบคุมการเข้าถึง - อนุญาต - ต้นทาง' '*';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'ประเภทเนื้อหา' 'ข้อความ/ชุดอักขระธรรมดา=UTF-8';
add_header 'ความยาวเนื้อหา' 0;
กลับ 204;
}
}
ประเภท {
แอปพลิเคชัน/ขีด+xml mpd;
แอปพลิเคชัน/vnd.apple.mpegurl m3u8;
วิดีโอ/mp2t ts;
}
}
}
rtmp {
เซิร์ฟเวอร์{
ฟัง 8081;
chunk_size 8192;
ปิง 30;
alert_method รับ;
อนุญาตให้เล่นทั้งหมด
#อนุญาตให้เผยแพร่ทั้งหมด;
แอปพลิเคชันสด {
# เราจะแบ่งการสตรีมเป็นบิตเรตที่แตกต่างกันที่นี่สำหรับการสตรีมแบบปรับได้
มีชีวิตต่อ;
exec ffmpeg -i rtmp://localhost:8081/live/$name -async 1 -vsync -1 -c:v libx264 -c:a libfdk_aac -b:v 256k -b:a 32k -vf "scale=480: trunc(ow/a/2)*2" -tune zerolatency -preset เร็วมาก -crf 23 -f flv rtmp://localhost:8081/hls/$name_low -c:v libx264 -c:a libfdk_aac -b:v 768k -b:a 96k -vf "scale=720:trunc(ow/a/2)*2" -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://localhost:8081/hls/$name_mid -c: v libx264 -c:a libfdk_aac -b:v 1024k -b:a 128k -vf "scale=960:trunc(ow/a/2)*2" -tune zerolatency -preset veryfast -crf 23 -f flv rtmp:/ /localhost:8081/hls/$name_high -c:v libx264 -c:a libfdk_aac -b:v 1920k -b:a 128k -vf "scale=1280:trunc(ow/a/2)*2" -tune zerolatency -preset เร็วมาก -crf 23 -f flv rtmp://localhost:8081/hls/$name_hd720 -c copy -f flv rtmp://localhost:8081/hls/$name_src;
}
#คุณควรส่งสตรีม x.264/aac RTMP ผ่าน ffmpeg ไปยังแอปพลิเคชันนี้
แอปพลิเคชัน hls {
อนุญาตให้เล่นทั้งหมด
#อนุญาตให้เผยแพร่ทั้งหมด;
มีชีวิตต่อ;
เปิด;
hls_path /tmp/hls;
hls_playlist_length 60s;
hls_fragment 1s;
hls_variant _low BANDWIDTH=288000,RESOLUTION=426x240;
hls_variant _mid BANDWIDTH=448000,RESOLUTION=640x360;
hls_variant _high BANDWIDTH=1152000,RESOLUTION=854x480;
hls_variant _hd720 BANDWIDTH=2048000,RESOLUTION=1280x720;
hls_variant _src BANDWIDTH=4096000,RESOLUTION=1920x1080;
}
}
}
ตามที่กล่าวไว้ เราใช้ Video.js เพื่อให้บริการสตรีมแก่ผู้ใช้ของเราบนเว็บไซต์ของเราการกำหนดค่าเกี่ยวกับสิ่งนั้นอาจอยู่นอกเหนือขอบเขตของบอร์ดนี้ แต่เพื่อประโยชน์ของข้อมูลที่ครบถ้วน สตรีมนี้เล่นได้บน Firefox และ Chrome (ทั้งบนเดสก์ท็อป) และ Brave Browser (มือถือ) โดยไม่มีปัญหา แต่ไม่ต้องการ ทำงานบน Brave Browser (บนเดสก์ท็อป) หรือ Chrome (บนมือถือ)
มีอะไรเกี่ยวกับ nginx.conf นี้ที่อาจก่อให้เกิดการทำงานประเภทนั้น (หรือขาดไป?) หรือว่าจะสมบูรณ์ในส่วนของเว็บนี้หรือไม่?