一、視頻直播的技術原理和架構方案
直播模型一般包括三個模塊:主播方、服務器端和播放端
主播放創造視頻,加美顏、水印、特效、采集后推送給直播服務器
播放端:
直播服務器端:收集主播端的視頻推流,將其放大后推送給所有觀眾端,這個是核心功能,還有運營級別的訴求:比如鑒權認證,視頻連線和實時轉碼,自動鑒黃,多屏合一,以及云端錄制儲存功能,另外對于一惡搞主播端的推流視頻,中間需要經過一些環節才能達到播放端,因此對中間的質量進行監控,以及根據這些監控進行智能調度,也是非常重要的訴求,
二、實現思想和步驟
1、錄制---》編碼---》網絡傳輸---》解碼---》播放
如何錄制直播視頻源:手機,ffmpeg
怎樣上傳直播視頻(推到服務器)
怎樣播放直播視頻
直播間用戶是如何交互(送禮物/聊天室/彈幕)
2、如何搭建一個完整的視頻直播系統
3、搭建自己的直播平臺
本次測試:
視頻采集與編碼:ffmoeg
直播服務Rtmp/hlsRtmp/hls)Nginx+RTMP模塊
播放:網頁端Video.js(vlc)
服務器上針對nginx進行配置:
執行推流:
ffmpeg -re -i zhiboshipin.mp4 -c copy -f flv rtmp://192.168.1.35:1935/live1/test
注意,這個最后的"test",可以改為test1,test2,......,可以開無數的直播流,
然后在vlc下打開串流觀看,地址:
rtmp://192.168.1.35:1935/live1/test
m3u8的觀看地址:
http://192.168.1.35:8000/hls1/test.m3u8
這個8000是nginx的端口,
查看服務器上的文件,發現生成了很多ts文件:
分析一下test.m3u8文件,里面存儲的是片段:
三、搭建Nginx直播服務器
服務器由 Nginx+RTMP構成,Nginx是http服務器,RTMP是附加啊啊啊啊啊啊模塊,選擇源碼的方式安裝,可以自定義安裝模塊
安裝Nginx依賴,
apt-get install -y libpcre3 libpcre3-dev libssl-dev zlib1g-dev gcc wget unzip vim make curl
下載源碼:
https://github.com/winshining/nginx-http-flv-module
中文文檔:nginx-http-flv-module/README.CN.md at master · winshining/nginx-http-flv-module · GitHub
wget下載
解壓
unzip master.zip
然后下載nginx本身源碼,解壓
編譯安裝
配置好之后,make makeinstall
要刪除掉
Werror
四、配置rtmp服務器
啟動Nginx,執行命令:
/usr/local/nginx/sbin/nginx
vod目錄下的是點播功能,可以用rtmp協議播放網絡文件
五、搭建FFmpeg,直播推流
下載并安裝ffmpeg,
ffmpeg本地文件推流
ffmpeg -re -i input.mp4 -vcodec libx264 -acode aac -f flv
-re表示以正常的幀率推流,否則視頻很快推完
rtmp://192.168.1.35:1935/hls1/test1
ffmpeg攝像頭推流:
ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:vzerolatency -f flv rtmp://192.168.1.35/test
六、搭建Videojs,實戰網絡直播
新建網頁,使用第三方播放器(?video.js),播放源為:http://192.168.1.35:8080/hls/test1.m3u8
<p><em>Videojs播放直播.</em></p><video id="myVideo" class="video-js vjs-default-skin" preload="auto" width="640" height="264" controls><source src="http://192.168.1.35:8080/hls/test1.m3u8" type="application/x-mpegURL">
</video><script src="https://vjs.zencdn.net/7.20.3/video.min.js"></script><script>const player = videojs('myVideo', {html5: {hls: {overrideNative: true // 強制使用 video.js 的 HLS 處理}}});</script></body>
配置 Nginx 以支持 HLS 直播流(.m3u8
?和?.ts
?文件)并解決跨域問題:
# 在 http 或 server 塊中定義 MIME 類型(確保支持 HLS)
http {include mime.types;default_type application/octet-stream;# 添加 HLS 的 MIME 類型(如果 mime.types 中未定義)types {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}# 其他全局配置...
}server {listen 80;server_name your-domain.com; # 替換為你的域名或 IP# HLS 直播流文件路徑(根據實際路徑調整)location /live {# 允許跨域請求(CORS)add_header 'Access-Control-Allow-Origin' '*' always;add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;# 處理 OPTIONS 預檢請求if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 204;}# 禁止緩存(直播流需實時更新)add_header 'Cache-Control' 'no-cache';# 指定文件路徑alias /path/to/your/hls/files; # 替換為實際存放 m3u8/ts 文件的目錄autoindex off; # 禁止目錄列表# 啟用高效文件傳輸(可選)sendfile on;tcp_nopush on;}
}
開始本地推流
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://192.168.1.35:1935/live/test1
這樣就可以順利在瀏覽器觀看直播了
七、M3U8的多碼流自適應
low.m3u8
mid.m3u8
high.m3u8