FFmpeg+Nginx+VLC打造M3U8直播

一、視頻直播的技術原理和架構方案

直播模型一般包括三個模塊:主播方、服務器端和播放端

主播放創造視頻,加美顏、水印、特效、采集后推送給直播服務器

播放端:

直播服務器端:收集主播端的視頻推流,將其放大后推送給所有觀眾端,這個是核心功能,還有運營級別的訴求:比如鑒權認證,視頻連線和實時轉碼,自動鑒黃,多屏合一,以及云端錄制儲存功能,另外對于一惡搞主播端的推流視頻,中間需要經過一些環節才能達到播放端,因此對中間的質量進行監控,以及根據這些監控進行智能調度,也是非常重要的訴求,

二、實現思想和步驟

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77980.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77980.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77980.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Redis】緩存三劍客問題實踐(上)

本篇對緩存三劍客問題進行介紹和解決方案說明&#xff0c;下篇將進行實踐&#xff0c;有需要的同學可以跳轉下篇查看實踐篇&#xff1a;&#xff08;待發布&#xff09; 緩存三劍客是什么&#xff1f; 緩存三劍客指的是在分布式系統下使用緩存技術最常見的三類典型問題。它們分…

Flink 2.0 編譯

文章目錄 Flink 2.0 編譯第一個問題 java 版本太低maven 版本太低maven 版本太高開始編譯擴展多版本jdk 配置 Flink 2.0 編譯 看到Flink2.0 出來了&#xff0c;想去玩玩&#xff0c;看看怎么樣&#xff0c;當然第一件事&#xff0c;就是編譯代碼&#xff0c;但是沒想到這么多問…

獲取印度股票市場列表、查詢IPO信息以及通過WebSocket實時接收數據

為了對接印度股票市場&#xff0c;獲取市場列表、查詢IPO信息、查看漲跌排行榜以及通過WebSocket實時接收數據等步驟。 1. 獲取市場列表 首先&#xff0c;您需要獲取支持的市場列表&#xff0c;這有助于了解哪些市場可以交易或監控。 請求方法&#xff1a;GETURL&#xff1a…

云原生--CNCF-1-云原生計算基金會介紹(云原生生態的發展目標和未來)

1、CNCF定義與背景 云原生計算基金會&#xff08;Cloud Native Computing Foundation&#xff0c;CNCF&#xff09;是由Linux基金會于2015年12月發起成立的非營利組織&#xff0c;旨在推動云原生技術的標準化、開源生態建設和行業協作。其核心目標是通過開源項目和社區協作&am…

【Rust 精進之路之第5篇-數據基石·下】復合類型:元組 (Tuple) 與數組 (Array) 的定長世界

系列&#xff1a; Rust 精進之路&#xff1a;構建可靠、高效軟件的底層邏輯 作者&#xff1a; 碼覺客 發布日期&#xff1a; 2025-04-20 引言&#xff1a;從原子到分子——組合的力量 在上一篇【數據基石上】中&#xff0c;我們仔細研究了 Rust 的四種基本標量類型&#xff1…

MongoDB 集合名稱映射問題

項目場景 在使用 Spring Data MongoDB 進行開發時&#xff0c;定義了一個名為 CompetitionSignUpLog 的實體類&#xff0c;并創建了對應的 Repository 接口。需要明確該實體類在 MongoDB 中實際對應的集合名稱是 CompetitionSignUpLog 還是 competitionSignUpLog。 問題描述 …

物聯網 (IoT) 安全簡介

什么是物聯網安全&#xff1f; 物聯網安全是網絡安全的一個分支領域&#xff0c;專注于保護、監控和修復與物聯網&#xff08;IoT&#xff09;相關的威脅。物聯網是指由配備傳感器、軟件或其他技術的互聯設備組成的網絡&#xff0c;這些設備能夠通過互聯網收集、存儲和共享數據…

PCB原理圖解析(炸雞派為例)

晶振 這是外部晶振的原理圖。 32.768kHz 的晶振&#xff0c;常用于實時時鐘&#xff08;RTC&#xff09;電路&#xff0c;因為它的頻率恰好是一天的分數&#xff08;32768 秒&#xff09;&#xff0c;便于實現秒計數。 C25 和 C24&#xff1a;兩個 12pF 的電容&#xff0c;用于…

Jupyter Notebook 中切換/使用 conda 虛擬環境的方式(解決jupyter notebook 環境默認在base下面的問題)

使用 nb_conda_kernels 添加所有環境 一鍵添加所有 conda 環境 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda in…

【JAVA】十三、基礎知識“接口”精細講解!(二)(新手友好版~)

哈嘍大家好呀qvq&#xff0c;這里是乎里陳&#xff0c;接口這一知識點博主分為三篇博客為大家進行講解&#xff0c;今天為大家講解第二篇java中實現多個接口&#xff0c;接口間的繼承&#xff0c;抽象類和接口的區別知識點&#xff0c;更適合新手寶寶們閱讀~更多內容持續更新中…

基于MuJoCo物理引擎的機器人學習仿真框架robosuite

Robosuite 基于 MuJoCo 物理引擎&#xff0c;能支持多種機器人模型&#xff0c;提供豐富多樣的任務場景&#xff0c;像基礎的抓取、推物&#xff0c;精細的開門、擰瓶蓋等操作。它可靈活配置多種傳感器&#xff0c;提供本體、視覺、力 / 觸覺等感知數據。因其對強化學習友好&am…

企業微信自建應用開發回調事件實現方案

目錄 1. 前言 2. 正文 2.1 技術方案 2.2 策略上下文 2.2 添加客戶策略實現類 2.3 修改客戶信息策略實現類 2.4 默認策略實現類 2.5 接收事件的實體類&#xff08;可以根據事件格式的參數做修改&#xff09; 2.6 實際接收回調結果的接口 近日在開發企業微信的自建應用時…

Linux將多個塊設備掛載到一個掛載點

在 Linux 系統中&#xff0c;直接將多個塊設備掛載到同一個掛載點是不可能的。這是因為 Linux 的文件系統掛載機制設計為一個掛載點一次只能關聯一個文件系統。如果嘗試將多個塊設備掛載到同一個掛載點&#xff0c;后一次掛載會覆蓋前一次的掛載&#xff0c;導致只有最后掛載的…

Spark-SQL(四)

本節課學習了spark連接hive數據&#xff0c;在 spark-shell 中&#xff0c;可以看到連接成功 將依賴放進pom.xml中 運行代碼 創建文件夾 spark-warehouse 為了使在 node01:50070 中查看到數據庫&#xff0c;需要添加如下代碼&#xff0c;就可以看到新創建的數據庫 spark-sql_1…

野外價值觀:在真實世界的語言模型互動中發現并分析價值觀

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

el-select+vue-virtual-scroller解決數據量大卡頓問題

解決el-select中數據量過大時&#xff0c;顯示及搜索卡頓問題&#xff0c;及正確的回顯默認選中數據 粗略的封裝了組件&#xff0c;有需要各種屬性自定義的&#xff0c;自己添加設置下 環境 node 16.20.1 npm 8.19.4 vue2、element-ui "vue-virtual-scroller"…

Sqlite3交叉編譯全過程

Sqlite3交叉編譯全過程 一、概述二、下載三、解壓四、配置五、編譯六、安裝七、驗證文件類型八、移植8.1、頭文件sqlite3.h8.2、動態鏈接庫移植8.3、靜態態鏈接庫移植 九、驗證使用9.1. 關鍵函數說明 十、觸發器使用十一、sqlite表清空且恢復id值十二、全文總結 一、概述 SQLi…

軟考軟件設計師考試情況與大綱概述

文章目錄 **一、考試科目與形式****二、考試大綱與核心知識點****科目1&#xff1a;計算機與軟件工程知識****科目2&#xff1a;軟件設計** **三、備考建議****四、參考資料** 這是一個系列文章的開篇 本文對2025年軟考軟件設計師考試的大綱及核心內容進行了整理&#xff0c;并…

【數學建模】孤立森林算法:異常檢測的高效利器

孤立森林算法&#xff1a;異常檢測的高效利器 文章目錄 孤立森林算法&#xff1a;異常檢測的高效利器1 引言2 孤立森林算法原理2.1 核心思想2.2 算法流程步驟一&#xff1a;構建孤立樹(iTree)步驟二&#xff1a;構建孤立森林(iForest)步驟三&#xff1a;計算異常分數 3 代碼實現…

【Android面試八股文】Android系統架構【一】

Android系統架構圖 1.1 安卓系統啟動 1.設備加電后執行第一段代碼&#xff1a;Bootloader 系統引導分三種模式&#xff1a;fastboot&#xff0c;recovery&#xff0c;normal&#xff1a; fastboot模式&#xff1a;用于工廠模式的刷機。在關機狀態下&#xff0c;按返回開機 鍵進…