濰坊做網(wǎng)站聯(lián)系方式seo的方法
文章目錄
- 1 流媒體基礎(chǔ)
- 本文教程下載地址
- 1.1 流媒體
- 1.2 流式傳輸方式
- 1.2.1 順序流式傳輸
- 1.2.2 實時流式傳輸
- 1.3 流媒體傳輸協(xié)議
- 1.3.1 rtmp協(xié)議
- 1.3.2 HLS協(xié)議
- 1.3.3 RTSP協(xié)議
- 1.3.4 視頻流的對比
- 1.4 視頻編碼(codec)
- 1.5 分辨率的規(guī)范
- 分辨率簡介:
- 1.5.2 分辨率單位
- 1.6 碼率
- 1.7 針?biāo)俾?FPS
- 1.7.1 常見媒體的FPS幀率
- 1.7 屏幕類型
- 2 視頻點(diǎn)播解決方案
- 3 視頻直播解決方案
- 3.1 視頻直播流程
- 3.1.1 視頻采集:
- 3.1.2 處理
- 3.2 推流拉流環(huán)境搭建
- 3.3 DVR錄制
- 3.4 鑒權(quán)(HTTP回調(diào)和服務(wù)器定制)
- 3.5 http接口
- 4 ffmpeg集成
- 4.1 ffmpeg簡介
- 4.2 ffmpeg 環(huán)境搭建
- 4.3 ffmpeg命令使用
- 通用選項
- 視頻選項
- 高級選項
- 音頻選項
- 音視頻捕獲選項
- 高級選項
- 實例:
- 未測試demo
- 5 srs 集群與轉(zhuǎn)碼
- 5.1 Forward小型集群
- 5.1.1 簡介
- 5.1.2 原理
- 5.1.3 配置
- 5.2 Edge邊緣服務(wù)器集群
- 5.2.1 edge簡介
- 5.2.2 Edge的主要應(yīng)用場景:
- 5.2.3 配置
- 5.3 ffmpeg轉(zhuǎn)碼
- 5.3.1 應(yīng)用場景
- 5.3.2 SRS轉(zhuǎn)碼的主要流程包括
- 5.3.3 ffmpeg配置:
- Other Transcode Config
- 6 終端設(shè)備播放
- 7 調(diào)試相關(guān)工具
- 5.1 推流測試工具:OBS
- 5.2 拉流測試工具
- 5.3 h5開源:B站開源的flv.js ,vidio.js
- 5.4 音視頻查看工具,MediaInfo_GUI_20
- 8 參考:官方
- 9 直播會議解決方案(未完待續(xù))
1 流媒體基礎(chǔ)
本文教程下載地址
https://download.csdn.net/download/a254939392/89505918
點(diǎn)擊下載
1.1 流媒體
流媒體(Streaming Media)技術(shù)是指將一連串的媒體數(shù)據(jù)壓縮后,以流的方式在網(wǎng)絡(luò)中分段傳送,實現(xiàn)在網(wǎng)絡(luò)上實時傳輸影音以供觀賞的一種技術(shù)。 [2] 流媒體實際指的是一種新的媒體傳送方式,有聲音流、視頻流、文本流、圖像流、動畫流等,而非一種新的媒體。 [2] 流媒體文件格式是支持采用流式傳輸及播放的媒體格式。常用格式有:RA:實時聲音;RM:實時視頻或音頻的實時媒體;RT:實時文本;RP:實時圖像;SMII.:同步的多重數(shù)據(jù)類型綜合設(shè)計文件;SWF:real flash和shockwavc flash動面文件;RPM: HTMI。文件的插件;[RAM](https://baike.baidu.com/item/RAM/144481):流媒體的源文件,是包含RA、RM、SMIIJ文件地址(URL地址)的文本文件;CSF:一種類似媒體容器的文件格式,可以將非常多的媒體格式包含在其中,而不僅僅限于音、視頻。quicktime,mov,asf,[wmv](https://baike.baidu.com/item/wmv/1195900),wma,avi,mpeg,mpg,dat,mts; aam多媒體教學(xué)課件格式,可將authorware生成的文件壓縮為aam和aas流式文件播放
1.2 流式傳輸方式
在網(wǎng)絡(luò)上傳輸音、視頻信息有兩個方式:下載和流式傳輸。下載:就是把音、視頻文件完全下載到本機(jī)后開始播放,它的特點(diǎn)是必須等到視頻文件下載完成方可播放,播放等待時間較長,無法去播放還未下載的部分視頻 流式傳輸:就是客戶端通過鏈接視頻服務(wù)器實時傳輸音、視頻信息,實現(xiàn)“邊下載邊播放”。流式傳輸是指通過網(wǎng)絡(luò)傳送媒體(音頻、視頻等)技術(shù)的總稱。
實現(xiàn)流式傳輸主要有兩種方式:順序流式傳輸( progressive streaming)和實時流式傳輸( real time streaming)
1.2.1 順序流式傳輸
順序流式傳輸是順序下載,用戶在觀看在線媒體的同時下載文件,在這一過程中,用戶只能觀看下載完的部分,而不能直接觀看未下載部分。也就是說,用戶總是在一段延時后才能看到服務(wù)器傳送過來的信息。由于標(biāo)準(zhǔn)的HTTP服務(wù)器就可以發(fā)送這種形式的文件,它經(jīng)常被稱為HTTP流式傳輸。由于順序流式傳輸能夠較好地保證節(jié)目播放的質(zhì)量,因此比較適合在網(wǎng)站上發(fā)布的、可供用戶點(diǎn)播的、高質(zhì)量的視頻。
順序流式文件是放在標(biāo)準(zhǔn)HTTP或FTP服務(wù)器上,易于管理,基本上與防火墻無關(guān)。順序流式傳輸不適合長片段和有隨機(jī)訪問要求的視頻,如:講座、演說與演示。它也不支持現(xiàn)場廣播
1.2.2 實時流式傳輸
實時流式傳輸必須保證匹配連接帶寬,使媒體可以被實時觀看到。在觀看過程中用戶可以任意觀看媒體前面或后面的內(nèi)容,但在這種傳輸方式中,如果網(wǎng)絡(luò)傳輸狀況不理想,則收到的圖像質(zhì)量就會比較差實時流式傳輸需要特定服務(wù)器,如 Quick Time Streaming Server、 Realserver或 Windows Media server。這些服務(wù)器允許對媒體發(fā)送進(jìn)行更多級別的控制,因而系統(tǒng)設(shè)置、管理比標(biāo)準(zhǔn)HTTP服務(wù)器更復(fù)雜。實時流式傳輸還需要特殊網(wǎng)絡(luò)協(xié)議,如:RTSP( realtime streaming protocol)或MMS(microsoft media server)。在有防火墻時,有時會對這些協(xié)議進(jìn)行屏閉,導(dǎo)致用戶不能看到一些地點(diǎn)的實時內(nèi)容,實時流式傳輸總是實時傳送,因此特別適合現(xiàn)場事件#常見的實時流式傳輸協(xié)議有RTSP、RTMP、RSVP 等
1.3 流媒體傳輸協(xié)議
(rtp/rtcp/rtsp/rtmp/mms/hls)
常用的 rtmp 與hls http-flv
1.3.1 rtmp協(xié)議
RTMP(Real Time Messaging Protocol)是Adobe Systems公司為Flash播放器和服務(wù)器之間音頻、視頻和數(shù)據(jù)傳輸開發(fā)的開放協(xié)議。它有三種變種:
(1)工作在TCP之上的明文協(xié)議,使用端口1935;
(2)RTMPT封裝在HTTP請求之中,可穿越防火墻;
(3)RTMPS類似RTMPT,但使用的是HTTPS連接。
RTMP視頻播放的特點(diǎn):
(1)RTMP協(xié)議是采用實時的流式傳輸,所以不會緩存文件到客戶端,這種特性說明用戶想下載RTMP協(xié)議下的視頻是比較難的;
(2)視頻流可以隨便拖動,既可以從任意時間點(diǎn)向服務(wù)器發(fā)送請求進(jìn)行播放,并不需要視頻有關(guān)鍵幀。相比而言,HTTP協(xié)議下視頻需要有關(guān)鍵幀才可以隨意拖動。
(3)RTMP協(xié)議支持點(diǎn)播/回放(通俗點(diǎn)將就是支持把flv,f4v,mp4文件放在RTMP服務(wù)器,客戶端可以直接播放),直播(邊錄制視頻邊播放)。
RTMP環(huán)境的架設(shè):
因為該協(xié)議是adobe公司開發(fā)的,所以最初服務(wù)器端架設(shè)的環(huán)境是FMS(Flash Media Server),該軟件為收費(fèi)軟件,價格昂貴。后來,開源軟件red5的推出,使rtmp協(xié)議的架設(shè)成本大大縮小,但是在性能方面不如fms的穩(wěn)定。此外,wowza雖然是收費(fèi)的,但價格比較適中。
1.3.2 HLS協(xié)議
HTTP Live Streaming(HLS)是蘋果公司實現(xiàn)的基于HTTP的流媒體傳輸協(xié)議,可實現(xiàn)流媒體的直播和點(diǎn)播,主要應(yīng)用于iOS系統(tǒng)。`HLS點(diǎn)播是分段HTTP點(diǎn)播,不同在于它的分段非常小。要實現(xiàn)HLS點(diǎn)播,重點(diǎn)在于對媒體文件分段,目前有不少開源工具可以使用。相對于常見的流媒體直播協(xié)議,HLS直播最大的不同在于,直播客戶端獲取到的并不是一個完整的數(shù)據(jù)流,HLS協(xié)議在服務(wù)器端將直播數(shù)據(jù)流存儲為連續(xù)的、很短時長的媒體文件(MPEG-TS格式),而客戶端則不斷的下載并播放這些小文件,因為服務(wù)器總是會將最新的直播數(shù)據(jù)生成新的小文件,這樣客戶端只要不停的按順序播放從服務(wù)器獲取到的文件,就實現(xiàn)了直播。由此可見,基本上可以認(rèn)為,HLS是以點(diǎn)播的技術(shù)方式實現(xiàn)直播。由于數(shù)據(jù)通過HTTP協(xié)議傳輸,所以完全不用考慮防火墻或者代理的問題,而且分段文件的時長很短,客戶端可以很快的選擇和切換碼率,以適應(yīng)不同帶寬條件下的播放。不過HLS的這種技術(shù)特點(diǎn),決定了它的延遲一般總是會高于普通的流媒體直播協(xié)議。`原理就是把整個流分成一個個小小的基于Http的文件來下載,這樣可以以不同的速率來下載同樣的源(碼流自適應(yīng)),最開始會先去下載一個m3u8,這是一個playList,找到可以用的流,
'HLS協(xié)議規(guī)定:
1)封裝格式是TS
2)視頻編碼格式是H264,音頻是MP3/AAC/AC3HLS的工作方式是:將視頻拆分成若干ts格式的小文件,通過m3u8格式的索引文件對這些ts小文件建立索引。一般
10秒一個ts文件,播放器連接m3u8文件播放,當(dāng)快進(jìn)時通過m3u8即可找到對應(yīng)的索引文件,并去下載對應(yīng)的ts文
件,從而實現(xiàn)快進(jìn)、快退以近實時 的方式播放視頻。
IOS、Android設(shè)備、及各大瀏覽器都支持HLS協(xié)議。
1.3.3 RTSP協(xié)議
RTSP(Real Time Streaming Protocol):實時流傳送協(xié)議,是用來控制聲音或影像的多媒體串流協(xié)議, 由RealNetworks和Netscape共同提出的;
1.3.4 視頻流的對比
協(xié)議 | httpflv | rtmp | hls | dash |
---|---|---|---|---|
傳輸方式 | http流 | tcp流 | http | http |
視頻封裝格式 | flv | flv tag | Ts文件 | Mp4 3gp webm |
延時 | 低 | 低 | 高 | 高 |
數(shù)據(jù)分段 | 連續(xù)流 | 連續(xù)流 | 切片文件 | 切片文件 |
Html5播放 | 可通過html5解封包播放(flv.js) | 不支持 | 可通過html5解封包播放(hls.js) | 如果dash文件列表是mp4webm文件,可直接播放 |
1.4 視頻編碼(codec)
所謂視頻編碼方式就是指通過壓縮技術(shù),將原始視頻格式的文件轉(zhuǎn)換成另一種視頻格式文件的方式。視頻流傳輸中最為重要的編解碼標(biāo)準(zhǔn)有國際電聯(lián)的H.261、H.263、H.264,運(yùn)動靜止圖像專家組的M-JPEG和國際標(biāo)準(zhǔn)化組織運(yùn)動圖像專家組的MPEG系列標(biāo)準(zhǔn),此外在互聯(lián)網(wǎng)上被廣泛應(yīng)用的還有Real-Networks的RealVideo、微軟公司的WMV以及Apple公司的QuickTime
視頻編碼的意義: 原始視頻數(shù)據(jù)存儲空間大,一個 1080P 的 7s 視頻需要 817 MB
原始視頻數(shù)據(jù)傳輸占用帶寬大,10 Mbps 的帶寬傳輸上述 7 s 視頻需要 11 分鐘。而經(jīng)過 H.264 編碼壓縮之后,視頻大小只有 708 k ,10 Mbps 的帶寬僅僅需要 500 ms ,可以滿足實時傳輸?shù)男枨?#xff0c;所以從視頻采集傳感器采集來的原始視頻勢必要經(jīng)過視頻編碼。
基本原理:
為什么巨大的原始視頻可以編碼成很小的視頻呢?這其中的技術(shù)是什么呢?核心思想就是去除冗余信息:
1)空間冗余:圖像相鄰像素之間有較強(qiáng)的相關(guān)性
2)時間冗余:視頻序列的相鄰圖像之間內(nèi)容相似
3)編碼冗余:不同像素值出現(xiàn)的概率不同
4)視覺冗余:人的視覺系統(tǒng)對某些細(xì)節(jié)不敏感
5)知識冗余:規(guī)律性的結(jié)構(gòu)可由先驗知識和背景知識得到
編碼器的選擇:
視頻編碼器經(jīng)歷了數(shù)十年的發(fā)展,已經(jīng)從開始的只支持幀內(nèi)編碼演進(jìn)到現(xiàn)如今的 H.265 和 VP9 為代表的新一代編碼器,下面是一些常見的視頻編碼器:
1)H.264/AVC
2)HEVC/H.265
3)VP8
4)VP9
5)FFmpeg
注:音頻編碼器有Mp3, AAC等。
視頻和音頻都需要經(jīng)過編碼,才能保存成文件。不同的編碼格式(CODEC),有不同的壓縮率,會導(dǎo)致文件大小和清晰度的差異。
常用的視頻編碼格式如下。
H.262
H.264
H.265
#以上編碼格式都是有版權(quán)的,但是可以免費(fèi)使用
#還有幾種無版權(quán)的視頻編碼格式。
VP8
VP9
AV1
音頻編碼
常用的音頻編碼格式
MP3
AAC
1.5 分辨率的規(guī)范
標(biāo)清: 480x320, 640x480 高清: 1024x720p 或 1920x1080i (隔行掃描) 全高清: 1920x1080p超(高)清: 3840x2160,7680x43204K: 4K分辨率是1080p的4倍 3840×2160 = 1920×2×1080×28K: 8K分辨率是4K的4倍 7680×4320 = 3840×2×2160×2ps:P:progressive,意思是逐行掃描,幀編碼I:interlace,意思是隔行掃描,場編碼#兩者是視頻編碼里的編碼方式,分辨率一樣
美國消費(fèi)電子協(xié)會(CEA)將4K的分辨率正式命名為Ultra HD(Ultra High-Definition)
https://www.cnblogs.com/chengfangming/p/4804958.html
http://service.ivideostar.com/bbs/thread-540-1-7.html
分辨率簡介:
分辨率,又稱解析度、解像度,可以細(xì)分為顯示分辨率、圖像分辨率、打印分辨率和掃描分辨率等。顯示分辨率(屏幕分辨率)是屏幕圖像的精密度,是指顯示器所能顯示的像素有多少。由于屏幕上的點(diǎn)、線和面都是由像素組成的,顯示器可顯示的像素越多,畫面就越精細(xì),同樣的屏幕區(qū)域內(nèi)能顯示的信息也越多,所以分辨率是個非常重要的性能指標(biāo)??梢园颜麄€圖像想象成是一個大型的棋盤,而分辨率的表示方式就是所有經(jīng)線和緯線交叉點(diǎn)的數(shù)目。顯示分辨率一定的情況下,顯示屏越小圖像越清晰,反之,顯示屏大小固定時,顯示分辨率越高圖像越清晰。通常情況下,圖像的分辨率越高,所包含的像素就越多,圖像就越清晰,印刷的質(zhì)量也就越好。同時,它也會增加文件占用的存儲空間
1.5.2 分辨率單位
描述分辨率的單位有:dpi([點(diǎn)每英寸])、lpi(線每英寸)、ppi([像素每英寸])和[PPD](PPPixels Per Degree 角分辨率,像素每度)。但只有l(wèi)pi是描述光學(xué)分辨率的尺度的。雖然dpi和ppi也屬于分辨率范疇內(nèi)的單位,但是他們的含義與lpi不同。而且lpi與dpi無法換算,只能憑經(jīng)驗估算。 [2] 另外,ppi和dpi經(jīng)常都會出現(xiàn)混用現(xiàn)象。但是他們所用的領(lǐng)域也存在區(qū)別。從技術(shù)角度說,“像素”只存在于電腦顯示領(lǐng)域,而“點(diǎn)”只出現(xiàn)于打印或印刷領(lǐng)域
像素
像素即px,是畫面中最小的點(diǎn)(單位色塊)。分辨率=畫面水平方向的像素值 * 畫面垂直方向的像素值。
分辨率可以分為兩方面:屏幕分辨率和圖像分辨率。
1. 屏幕分辨率: 例如,屏幕分辨率是1024×768,也就是說設(shè)備屏幕的水平方向上有1024個像素點(diǎn),垂直方向上有768個像素點(diǎn)。像素的大小是沒有固定長度的,不同設(shè)備上一個單位像素色塊的大小是不一樣的。 例如,尺寸面積大小相同的兩塊屏幕,分辨率大小可以是不一樣的,分辨率高的屏幕上面像素點(diǎn)(色塊)就多,所以屏幕內(nèi)可以展示的畫面就更細(xì)致,單個色塊面積更小。而分辨率低的屏幕上像素點(diǎn)(色塊)更少,單個像素面積更大,可以顯示的畫面就沒那么細(xì)致。
2. 圖像分辨率: 例如,一張圖片分辨率是500x200,也就是說這張圖片在屏幕上按1:1放大時,水平方向有500個像素點(diǎn)(色塊),垂直方向有200個像素點(diǎn)(色塊)。 在同一臺設(shè)備上,圖片分辨率越高,這張圖片1:1放大時,圖片面積越大;圖片分辨率越低,這張圖片1:1縮放時,圖片面積越小。(可以理解為圖片的像素點(diǎn)和屏幕的像素點(diǎn)是一個一個對應(yīng)的)。 但是,在屏幕上把圖片超過100%放大時,為什么圖片上像素色塊也變的越大,其實是設(shè)備通過算法對圖像進(jìn)行了像素補(bǔ)足,我們把圖片放的很大后看到的一塊一塊的方格子,雖然理解為一個圖像像素,但是其實是已經(jīng)補(bǔ)充了很多個屏幕像素;同理,把圖片小于100%縮小時,也是通過算法將圖片像素進(jìn)行減少。 最后,雖然不同設(shè)備上像素塊大小會不一樣,但是同一臺硬件設(shè)備上的屏幕分辨率、像素塊大小是不會變的。PC電腦上之所以可以調(diào)整屏幕分辨率,其實也是通過算法轉(zhuǎn)換了
1.6 碼率
? 碼率又叫比特率即每秒傳輸?shù)腷it數(shù),單位為bps(Bit Per Second),碼率越大傳送數(shù)據(jù)的速度越快。
? 碼率的計算公式是:文件大小(轉(zhuǎn)成bit)/ 時長(秒)/1024 = kbps 即每秒傳輸千位數(shù)
? 例如一個1M的視頻,它的時長是10s,它的碼率等于
1*1024*1024*8/10/1024 = 819Kbps
1.7 針?biāo)俾?FPS
每秒傳輸幀數(shù)(Frames Per Second)
FPS是圖像領(lǐng)域中的定義,是指畫面每秒傳輸幀數(shù),通俗來講就是指動畫或視頻的畫面數(shù)。FPS是測量用于保存、顯示動態(tài)視頻的信息數(shù)量。每秒鐘幀數(shù)越多,所顯示的動作就會越流暢。通常,要避免動作不流暢的'最低是30'。某些計算機(jī)視頻格式,每秒只能提供15幀。FPS”也可以理解為我們常說的“刷新率(單位為Hz)”,例如我們常在CS游戲里說的“FPS值”。我們在裝機(jī)選購顯卡和顯示器的時候,都會注意到“刷新率”。一般我們設(shè)置缺省刷新率都在75Hz(即75幀/秒)以上。例如:75Hz的刷新率刷也就是指屏幕一秒內(nèi)只掃描75次,即75幀/秒。而當(dāng)刷新率太低時我們?nèi)庋鄱寄芨杏X到屏幕的閃爍,不連貫,對圖像顯示效果和視覺感觀產(chǎn)生不好的影響。電影以每秒24張畫面的速度播放,也就是一秒鐘內(nèi)在屏幕上連續(xù)投射出24張靜止畫面。有關(guān)動畫播放速度的單位是fps,其中的f就是英文單詞Frame(畫面、幀),p就是Per(每),s就是Second(秒)。用中文表達(dá)就是多少幀每秒,或每秒多少幀。電影是24fps,通常簡稱為24幀。
1.7.1 常見媒體的FPS幀率
電影:24fps
電視(PAL):25fps
電視(NTSC):30fps
CRT顯示器:75Hz以上
液晶顯示器:一般為60Hz#在游戲過程中一般人能接受的最低FPS約為30Hz,基本流暢等級則需要>60Hz。
1.7 屏幕類型
普屏4:3 320*240 640*480
寬屏16:9 480*272 640*360 672*378 720*480 1024*600 1280*720 1920*1080
2 視頻點(diǎn)播解決方案
3 視頻直播解決方案
3.1 視頻直播流程
采集 —>處理—>編碼和封裝—>推流到服務(wù)器—>服務(wù)器流分發(fā)—>播放器流播放
3.1.1 視頻采集:
#音頻采集
音頻數(shù)據(jù)既能與圖像結(jié)合組合成視頻數(shù)據(jù),也能以純音頻的方式采集播放,后者在很多成熟的應(yīng)用場景如在線電臺和語音電臺等起著非常重要的作用。音頻的采集過程主要通過設(shè)備將環(huán)境中的模擬信號采集成 PCM 編碼的原始數(shù)據(jù),然后編碼壓縮成 MP3 等格式的數(shù)據(jù)分發(fā)出去。常見的音頻壓縮格式有:MP3,AAC,HE-AAC,Opus,FLAC,Vorbis (Ogg),Speex 和 AMR等。
音頻采集和編碼主要面臨的挑戰(zhàn)在于:延時敏感、卡頓敏感、噪聲消除(Denoise)、回聲消除(AEC)、靜音檢測(VAD)和各種混音算法等。#圖像采集
將圖像采集的圖片結(jié)果組合成一組連續(xù)播放的動畫,即構(gòu)成視頻中可肉眼觀看的內(nèi)容。圖像的采集過程主要由攝像頭等設(shè)備拍攝成 YUV 編碼的原始數(shù)據(jù),然后經(jīng)過編碼壓縮成 H.264 等格式的數(shù)據(jù)分發(fā)出去。常見的視頻封裝格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB 和 WebM 等。
圖像由于其直觀感受最強(qiáng)并且體積也比較大,構(gòu)成了一個視頻內(nèi)容的主要部分。圖像采集和編碼面臨的主要挑戰(zhàn)在于:設(shè)備兼容性差、延時敏感、卡頓敏感以及各種對圖像的處理操作如美顏和水印等。#視頻采集
視頻采集的采集源主要有攝像頭采集、屏幕錄制和從視頻文件推流。
3.1.2 處理
視頻或者音頻完成采集之后得到原始數(shù)據(jù),為了增強(qiáng)一些現(xiàn)場效果或者加上一些額外的效果,我們一般會在將其編碼壓縮前進(jìn)行處理,比如打上時間戳或者公司 Logo 的水印,祛斑美顏和聲音混淆等處理。在主播和觀眾連麥場景中,主播需要和某個或者多個觀眾進(jìn)行對話,并將對話結(jié)果實時分享給其他所有觀眾,連麥的處理也有部分工作在推流端完成。
處理環(huán)節(jié)中分為音頻和視頻處理,音頻處理中具體包含混音、降噪和聲音特效等處理,視頻處理中包含美顏、水印、以及各種自定義濾鏡等處理。
3.2 推流拉流環(huán)境搭建
#百度下載srs
鏈接:https://pan.baidu.com/s/1vgHCHWZk5jZzZohAkcnIjA
提取碼:qtc9#安裝srs
cd srs-3.0release/
cd trunk/
./configure --full
make -j 4#啟動
# /usr/local/srs/objs/srs -c /usr/local/srs/conf/srs.conf
./objs/srs -c ./conf/srs.conf
# 配置文件編輯
[root@iZ2zeagh7rzys1mcssbjm3Z conf]# vim /data/srs-3.0release/trunk/conf/srs.conf# main config for srs.
# @see full.conf for detail config.#配置監(jiān)聽端口
listen 1935;
#最大連接數(shù)設(shè)置
max_connections 1000;
#日志配置
srs_log_tank file;
srs_log_file ./objs/srs.log;
http_api {enabled on;listen 1985;
}
http_server {enabled on;listen 7777;dir ./objs/nginx/html;
}
stats {network 0;disk sda sdb xvda xvdb;
}
#vhost __defaultVhost__ {
#}vhost kn.pcc58.com {#配置hls協(xié)議hls {#是否開啟HLS,on:開啟 off:關(guān)閉,默認(rèn)是off enabled on;#hls存儲方式#disk:把m3u8/ts寫到磁盤(默認(rèn))#ram:發(fā)送m3u8/ts到內(nèi)存,但是必須使用srs自帶的http server進(jìn)行分發(fā)。#both, disk and ram。hls_storage disk;#當(dāng)hls寫到磁盤時,指定寫入的目錄。 hls_path ./objs/nginx/html;hls_fragment 10;#ts文件的數(shù)目:配置hls_window,指定m3u8中保存多少個切片,會自動清理舊的切片hls_window 60;}#http_flv 協(xié)議支持http_remux {enabled on;mount [vhost]/[app]/[stream].flv;hstrs on;}
}
3.3 DVR錄制
? SRS支持將RTMP流錄制成flv文件
1、參考
https://github.com/ossrs/srs/wiki/v1_CN_DVR
2、錄制配置
# main config for srs.
# @see full.conf for detail config.listen 1935;
max_connections 1000;
srs_log_tank file;
srs_log_file ./objs/srs.log;
http_api {enabled on;listen 1985;
}
http_server {enabled on;listen 7777;dir ./objs/nginx/html;
}
stats {network 0;disk sda sdb xvda xvdb;
}
#vhost __defaultVhost__ {
#}vhost kn.pcc58.com {hls{enabled on;hls_storage disk;hls_path ./objs/nginx/html;hls_fragment 5;hls_window 60;}#dvr 錄制文件dvr {enabled on;#配置文件路徑名稱dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].mp4;dvr_plan session;}
}
DVR的計劃即決定什么時候關(guān)閉flv文件,打開新的flv文件,主要的錄制計劃包括:
配置dvr_plan 參數(shù)
- session:按照session來關(guān)閉flv文件,即編碼器停止推流時關(guān)閉flv,整個session錄制為一個flv。
- segment:按照時間分段錄制,flv文件時長配置為dvr_duration和dvr_wait_keyframe。注意:若不按關(guān)鍵幀切flv(即dvr_wait_keyframe配置為off),所以會導(dǎo)致后面的flv啟動時會花屏。
- time_jitter: 時間戳抖動算法。full使用完全的時間戳矯正;zero只是保證從0開始;off不矯正時間戳。
參考conf/dvr.segment.conf
和conf/dvr.session.conf
配置實例。
3 直播效果
? 直播結(jié)束后會在服務(wù)器生成錄播的文件。
示例: 112233.1592379301363.mp4 stream名稱:112233 時間拖 mp4后綴
[root@iZ2zeagh7rzys1mcssbjm3Z live]# pwd
/data/srs-3.0release/trunk/objs/nginx/html/live
[root@iZ2zeagh7rzys1mcssbjm3Z live]# ls
'112233.1592379301363.mp4 112233-306.ts 112233-308.ts 112233-310.ts 112233-312.ts 112233-40.ts 112233-42.ts 112233-44.ts 112233-46.ts 112233.m3u8' 123-23.ts 123-25.ts 123-27.ts 123-29.ts demo.html livestream_ld.html
112233-305.ts 112233-307.ts 112233-309.ts 112233-311.ts 112233-39.ts 112233-41.ts 112233-43.ts 112233-45.ts 112233-47.ts 123-22.ts 123-24.ts 123-26.ts 123-28.ts 123.m3u8 livestream.html livestream_sd.html
[root@iZ2zeagh7rzys1mcssbjm3Z live]#
3.4 鑒權(quán)(HTTP回調(diào)和服務(wù)器定制)
? SRS不支持服務(wù)器腳本(參考:服務(wù)器端腳本),服務(wù)器端定制有一個重要的替代功能,就是HTTP回調(diào)。譬如當(dāng)客戶端連接到SRS時,回調(diào)指定的http地址,這樣可以實現(xiàn)驗證功能。
參考地址:https://github.com/ossrs/srs/wiki/v1_CN_HTTPCallback#config-srs
- 事件:發(fā)生該事件時,即回調(diào)指定的HTTP地址。
- HTTP地址:可以支持多個,以空格分隔,SRS會依次回調(diào)這些接口。
- 數(shù)據(jù):SRS將數(shù)據(jù)POST到HTTP接口。
- 返回值:SRS要求HTTP服務(wù)器返回HTTP200并且response內(nèi)容為整數(shù)錯誤碼(0表示成功),其他錯誤碼會斷開客戶端連接。
#開啟srs,callback 配置
http_hooks {enabled on;on_connect http://127.0.0.1:9005/api/connect;#on_publish http://127.0.0.1:9005/api/pull_token;
}
1、Event列表
事件 | 數(shù)據(jù) | 說明 |
---|---|---|
on_connect | { “action”: “on_connect”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “l(fā)ive”, “tcUrl”: “rtmp://x/x?key=xxx”, “pageUrl”: “http://x/x.html” } | 當(dāng)客戶端連接到指定的vhost和app時 |
on_close | { “action”: “on_close”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “l(fā)ive” } | 當(dāng)客戶端關(guān)閉連接,或者SRS主動關(guān)閉連接時 |
on_publish | { “action”: “on_publish”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “l(fā)ive”, “stream”: “l(fā)ivestream” } | 當(dāng)客戶端發(fā)布流時,譬如flash/FMLE方式推流到服務(wù)器 |
on_unpublish | { “action”: “on_unpublish”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “l(fā)ive”, “stream”: “l(fā)ivestream” } | 當(dāng)客戶端停止發(fā)布流時 |
on_play | { “action”: “on_play”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “l(fā)ive”, “stream”: “l(fā)ivestream” } | 當(dāng)客戶端開始播放流時 |
on_stop | { “action”: “on_stop”, “client_id”: 1985, “ip”: “192.168.1.10”, “vhost”: “video.test.com”, “app”: “l(fā)ive”, “stream”: “l(fā)ivestream” } | 當(dāng)客戶端停止播放時。備注:停止播放可能不會關(guān)閉連接,還能再繼續(xù)播放。 |
2、鑒權(quán)服務(wù)
java示例代碼:鑒權(quán)成功條件 httpcode 200 and 響應(yīng)0
@PostMapping("/api/connect")
public int login(@RequestBody PushVo pushVo) {System.out.println("================");System.out.println(pushVo);//rtmp://kn.pcc58.com:1935/live?token=123213xxxxxtojkeString token = pushVo.getTcUrl().split("?")[1];//token驗證System.out.println("=========end=======");return 0;
}
3.5 http接口
參考文獻(xiàn):https://github.com/ossrs/srs/wiki/v1_CN_HTTPApi
? SRS提供HTTP接口,供外部程序管理服務(wù)器,并支持跨域(js可以直接控制和獲取服務(wù)器的各種信息)。
SRS的HTTP接口遵循最簡單原則,主要包括:
- 只提供json數(shù)據(jù)格式接口,要求請求和響應(yīng)的數(shù)據(jù)全都是json。
- 不提供html數(shù)據(jù),譬如運(yùn)行SRS后,瀏覽器打開HTTP接口或HTTP服務(wù)地址,看到的是json,不是html。
配置文件需要開啟http-api:
# http-api.conf
listen 1935;
http_api {enabled on;listen 1985;
}
vhost __defaultVhost__ {
}
訪問api:瀏覽器打開地址http://127.0.0.1:1985/api/v1
{"code": 0,"server": 21063,"urls": {"versions": "the version of SRS","summaries": "the summary(pid, argv, pwd, cpu, mem) of SRS","rusages": "the rusage of SRS","self_proc_stats": "the self process stats","system_proc_stats": "the system process stats","meminfos": "the meminfo of system","authors": "the license, copyright, authors and contributors","features": "the supported features of SRS","requests": "the request itself, for http debug","vhosts": "manage all vhosts or specified vhost","streams": "manage all streams or specified stream","clients": "manage all clients or specified client, default query top 10 clients","raw": "raw api for srs, support CUID srs for instance the config","clusters": "origin cluster server API"},"tests": {"requests": "show the request info","errors": "always return an error 100","redirects": "always redirect to /api/v1/test/errors","[vhost]": "http vhost for http://error.srs.com:1985/api/v1/tests/errors"}
}
訪問api:瀏覽器打開地址http://127.0.0.1:1985/api/v1/clients/
4 ffmpeg集成
4.1 ffmpeg簡介
FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機(jī)程序。采用LGPL或GPL許可證。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進(jìn)的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質(zhì)量,libavcodec里很多code都是從頭開發(fā)的。
FFmpeg在Linux平臺下開發(fā),但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運(yùn)行,包括Windows、Mac OS X等。這個項目最早由Fabrice Bellard發(fā)起,2004年至2015年間由Michael Niedermayer主要負(fù)責(zé)維護(hù)。許多FFmpeg的開發(fā)人員都來自MPlayer項目,而且當(dāng)前FFmpeg也是放在MPlayer項目組的服務(wù)器上。項目的名稱來自MPEG視頻編碼標(biāo)準(zhǔn),前面的"FF"代表"Fast Forward"。 [1] FFmpeg編碼庫可以使用GPU加速FFmpeg有非常強(qiáng)大的功能 ,包括'視頻采集功能、視頻格式轉(zhuǎn)換、視頻抓圖、給視頻加水印'等。ffmpeg是用來轉(zhuǎn)換不同格式的多媒體文件的一個命令行工具。# 參考官方:http://ffmpeg.org/ffmpeg.html
4.2 ffmpeg 環(huán)境搭建
1 、下載
#官方下載
https://johnvansickle.com/ffmpeg/
#百度云盤下載
鏈接:https://pan.baidu.com/s/1BTuSYa_k_O9BEzYINUsMDw
提取碼:ng5o
復(fù)制這段內(nèi)容后打開百度網(wǎng)盤手機(jī)App,操作更方便哦
2、解壓后使用
tar -xvf ffmpeg-release-amd64-static.tar.xz
4.3 ffmpeg命令使用
命令格式:
#命令格式:ffmpeg -i [輸入文件名] [參數(shù)選項] -f [格式] [輸出文件]ffmpeg [[options][`-i' input_file]]... {[options] output_file}...
通用選項
-L license
-h 幫助
-fromats 顯示可用的格式,編解碼的,協(xié)議的。。。
-f fmt 強(qiáng)迫采用格式fmt
-I filename 輸入文件
-y 覆蓋輸出文件
-t duration 設(shè)置紀(jì)錄時間 hh:mm:ss[.xxx]格式的記錄時間也支持
-ss position 搜索到指定的時間 [-]hh:mm:ss[.xxx]的格式也支持
-title string 設(shè)置標(biāo)題
-author string 設(shè)置作者
-copyright string 設(shè)置版權(quán)
-comment string 設(shè)置評論
-target type 設(shè)置目標(biāo)文件類型(vcd,svcd,dvd) 所有的格式選項(比特率,編解碼以及緩沖區(qū)大小)自動設(shè)置 ,只需要輸入如下的就可以了:
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 激活高質(zhì)量設(shè)置
-itsoffset offset 設(shè)置以秒為基準(zhǔn)的時間偏移,該選項影響所有后面的輸入文件。該偏移被加到輸入文件的時戳,定義一個正偏移意味著相應(yīng)的流被延遲了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持
視頻選項
-b bitrate 設(shè)置比特率,缺省200kb/s-r fps 設(shè)置幀頻 缺省25-s size 設(shè)置幀大小 格式為WXH 缺省160X128.下面的簡寫也可以直接使用:
Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576-aspect aspect 設(shè)置橫縱比 4:3 16:9 或 1.3333 1.7777-croptop size 設(shè)置頂部切除帶大小 像素單位-cropbottom size –cropleft size –cropright size-padtop size 設(shè)置頂部補(bǔ)齊的大小 像素單位-padbottom size –padleft size –padright size –padcolor color 設(shè)置補(bǔ)齊條顏色(hex,6個16進(jìn)制的數(shù),紅:綠:蘭排列,比如 000000代表黑色)-vn 不做視頻記錄-bt tolerance 設(shè)置視頻碼率容忍度kbit/s-maxrate bitrate設(shè)置最大視頻碼率容忍度-minrate bitreate 設(shè)置最小視頻碼率容忍度-bufsize size 設(shè)置碼率控制緩沖區(qū)大小-vcodec codec 強(qiáng)制使用codec編解碼方式。 如果用copy表示原始編解碼數(shù)據(jù)必須被拷貝。-sameq 使用同樣視頻質(zhì)量作為源(VBR)-pass n 選擇處理遍數(shù)(1或者2)。兩遍編碼非常有用。第一遍生成統(tǒng)計信息,第二遍生成精確的請求的碼率-passlogfile file 選擇兩遍的紀(jì)錄文件名為file
高級選項
-g gop_size 設(shè)置圖像組大小-intra 僅適用幀內(nèi)編碼-qscale q 使用固定的視頻量化標(biāo)度(VBR)-qmin q 最小視頻量化標(biāo)度(VBR)-qmax q 最大視頻量化標(biāo)度(VBR)-qdiff q 量化標(biāo)度間最大偏差 (VBR)-qblur blur 視頻量化標(biāo)度柔化(VBR)-qcomp compression 視頻量化標(biāo)度壓縮(VBR)-rc_init_cplx complexity 一遍編碼的初始復(fù)雜度-b_qfactor factor 在p和b幀間的qp因子-i_qfactor factor 在p和i幀間的qp因子-b_qoffset offset 在p和b幀間的qp偏差-i_qoffset offset 在p和i幀間的qp偏差-rc_eq equation 設(shè)置碼率控制方程 默認(rèn)tex^qComp-rc_override override 特定間隔下的速率控制重載-me method 設(shè)置運(yùn)動估計的方法 可用方法有 zero phods log x1 epzs(缺省) full-dct_algo algo 設(shè)置dct的算法 可用的有 0 FF_DCT_AUTO 缺省的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC-idct_algo algo 設(shè)置idct算法??捎玫挠?0 FF_IDCT_AUTO 缺省的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM-er n 設(shè)置錯誤殘留為n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE-ec bit_mask 設(shè)置錯誤掩蔽為bit_mask,該值為如下值的位掩碼 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)-bf frames 使用frames B 幀,支持mpeg1,mpeg2,mpeg4-mbd mode 宏塊決策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD-4mv 使用4個運(yùn)動矢量 僅用于mpeg4-part 使用數(shù)據(jù)劃分 僅用于mpeg4-bug param 繞過沒有被自動監(jiān)測到編碼器的問題-strict strictness 跟標(biāo)準(zhǔn)的嚴(yán)格性-aic 使能高級幀內(nèi)編碼 h263+-umv 使能無限運(yùn)動矢量 h263+-deinterlace 不采用交織方法-interlace 強(qiáng)迫交織法編碼 僅對mpeg2和mpeg4有效。當(dāng)你的輸入是交織的并且你想要保持交織以最小圖像損失的時候采用該選項。可選的方法是不交織,但是損失更大-psnr 計算壓縮幀的psnr-vstats 輸出視頻編碼統(tǒng)計到vstats_hhmmss.log-vhook module 插入視頻處理模塊 module 包括了模塊名和參數(shù),用空格分開
音頻選項
-ab bitrate 設(shè)置音頻碼率-ar freq 設(shè)置音頻采樣率-ac channels 設(shè)置通道 缺省為1-an 不使能音頻紀(jì)錄-acodec codec 使用codec編解碼
音視頻捕獲選項
-vd device 設(shè)置視頻捕獲設(shè)備。比如/dev/video0-vc channel 設(shè)置視頻捕獲通道 DV1394專用-tvstd standard 設(shè)置電視標(biāo)準(zhǔn) NTSC PAL(SECAM)-dv1394 設(shè)置DV1394捕獲-av device 設(shè)置音頻設(shè)備 比如/dev/dsp
高級選項
-map file:stream 設(shè)置輸入流映射-debug 打印特定調(diào)試信息-benchmark 為基準(zhǔn)測試加入時間-hex 傾倒每一個輸入包-bitexact 僅使用位精確算法 用于編解碼測試-ps size 設(shè)置包大小,以bits為單位-re 以本地幀頻讀數(shù)據(jù),主要用于模擬捕獲設(shè)備-loop 循環(huán)輸入流。只工作于圖像流,用于ffserver測試
實例:
未測試demo
https://www.jianshu.com/p/749cf4ef073a
1 獲取視頻信息
ffmpeg -i video.MP4
2.將圖片序列合成視頻
./ffmpeg -f image2 -i image%d.jpg test.mp4
3 將視頻分解成圖片序列
./ffmpeg -i test.mp4 image%d.jpg#設(shè)置標(biāo)題 備注
./ffmpeg -i test.mp4 -metadata title=我是標(biāo)題 -y aaa.mp4
./ffmpeg -i test.mp4 -metadata comment=我是備注 -y aaa.mp4
#設(shè)置分辨率
./ffmpeg -i input.mp4 -vf scale=1080:1920 output.mp4# 未完待續(xù)
5 srs 集群與轉(zhuǎn)碼
5.1 Forward小型集群
#官方參考
# https://github.com/ossrs/srs/wiki/v1_CN_Forward
5.1.1 簡介
srs定位為直播服務(wù)器,其中一項重要的功能是forward,即將服務(wù)器的流轉(zhuǎn)發(fā)到其他服務(wù)器。備注:SRS的邊緣RTMP參考Edge,支持訪問時回源,為大規(guī)模并發(fā)提供最佳解決方案。注意:edge可以從源站拉流,也可以將流轉(zhuǎn)發(fā)給源站。也就是說,播放edge上的流時,edge會回源拉流;推流到edge上時,edge會直接將流轉(zhuǎn)發(fā)給源站。注意:若只需要中轉(zhuǎn)流給源站,不必用forward,直接使用edge模式即可??梢灾苯又С滞屏骱屠鞯闹修D(zhuǎn),簡單快捷。Forward應(yīng)用于目標(biāo)服務(wù)器是多個,譬如將一路流主動送給多路服務(wù)器;edge雖然配置了多臺服務(wù)器,但是只用了一臺,有故障時才切換。#注意:優(yōu)先使用edge,除非知道必須用forward,才使用forward。forward本身是用做熱備,即用戶推一路流上來,可以被SRS轉(zhuǎn)發(fā)(或者轉(zhuǎn)碼后轉(zhuǎn)發(fā))到多個slave源站,CDN邊緣可以回多個slave源,實現(xiàn)故障熱備的功能,構(gòu)建強(qiáng)容錯系統(tǒng)。
5.1.2 原理
Forward適合搭建小型集群,為什么這么說呢?因為每個slave節(jié)點(diǎn)都和master節(jié)點(diǎn)有相同數(shù)量的直播流編碼器推流給master,那么master就會Forward到每一個Slave。那么在slave節(jié)點(diǎn)上不論需不需要都會有master過來的流。試想一下,如果編碼器的數(shù)量為10,那么master到slave之間的帶寬就是:帶寬=10 * slave的個數(shù) *直播流碼率,隨著slave的增多,master的出口帶寬會不斷提高。而現(xiàn)實是,在某些slave節(jié)點(diǎn)其實根本沒有人看……這樣就造成了master到slave之間的帶寬浪費(fèi)-#所以說Forward適合與搭建小型集群。那么大集群怎么破?----使用edge功能為了和edge方式區(qū)分,forward定義一次詞匯如下:master:主服務(wù)器,編碼器推流到這個服務(wù)器,或者用ingest流到服務(wù)器??傊?#xff0c;master就是主服務(wù)器,負(fù)責(zé)轉(zhuǎn)發(fā)流給其他服務(wù)器。
slave:從服務(wù)器,主服務(wù)器轉(zhuǎn)發(fā)流到這個服務(wù)器。
如果結(jié)合edge集群方式,一般而言master和slave都是origin(源站服務(wù)器),edge邊緣服務(wù)器可以從master或者slave回源取流。實際上master和slave也可以是edge,但是不推薦,這種組合方式太多了,測試沒有辦法覆蓋到。因此,強(qiáng)烈建議簡化服務(wù)器的結(jié)構(gòu),只有origin(源站服務(wù)器)才配置轉(zhuǎn)發(fā),edge(邊緣服務(wù)器)只做邊緣。
https://gitee.com/kfd-bigdata/oss/blob/master/image/srs_forward.jpg
5.1.3 配置
vhost __defaultVhost__ {forward {enabled on;#slave ip 端口destination 172.17.236.196:1935;}}
5.2 Edge邊緣服務(wù)器集群
5.2.1 edge簡介
SRS的Edge提供訪問時回源機(jī)制,在CDN/VDN等流眾多的應(yīng)用場景中有重大意義, forward/ingest方案會造成大量帶寬浪費(fèi)。同時,SRS的Edge能對接所有的RTMP源站服務(wù)器, 不像FMS的Edge只能對接FMS源站(有私有協(xié)議);另外,SRS的Edge支持SRS源站的所有邏輯 (譬如轉(zhuǎn)碼,轉(zhuǎn)發(fā),HLS,DVR等等),也就是說可以選擇在源站切片HLS,也可以直接在 邊緣切片HLS。
#備注:Edge一般負(fù)載高,SRS支持的并發(fā)足夠跑滿千兆網(wǎng)帶寬了。所謂邊緣edge服務(wù)器,就是邊緣直播緩存服務(wù)器,配置時指定為remote模式和origin(指定一 個或多個源站IP),這個邊緣edge服務(wù)器就是源站的緩存了。當(dāng)用戶推流到邊緣服務(wù)器時,邊緣直接將流轉(zhuǎn)發(fā)給源站。譬如源站在北京BGP機(jī)房,湖南有個 電信ADSL用戶要推流發(fā)布自己的直播流,要是直接推流到北京BGP可能效果不是很好,可以在 湖南電信機(jī)房部署一個邊緣,用戶推流到湖南邊緣,邊緣轉(zhuǎn)發(fā)給北京源站BGP。當(dāng)用戶播放邊緣服務(wù)器的流時,邊緣服務(wù)器看有沒有緩存,若緩存了就直接將流發(fā)給客戶端。 若沒有緩存,則發(fā)起一路回源鏈接,從源站取數(shù)據(jù)源源不斷放到自己的緩存隊列。也就是說, 多個客戶端連接到邊緣時,只有一路回源。這種結(jié)構(gòu)在CDN是最典型的部署結(jié)構(gòu)。譬如北京源站, 在全國32個省每個省都部署了10臺服務(wù)器,一共就有320臺邊緣,假設(shè)每個省1臺邊緣服務(wù)器都有 2000用戶觀看,那么就有64萬用戶,每秒鐘集群發(fā)送640Gbps數(shù)據(jù);而回源鏈接只有320個, 實現(xiàn)了大規(guī)模分發(fā)。邊緣edge服務(wù)器,實際上是解決大并發(fā)問題產(chǎn)生的分布式集群結(jié)構(gòu)。SRS的邊緣可以指定多個源站, 在源站出現(xiàn)故障時會自動切換到下一個源站,不影響用戶觀看,具有最佳的容錯性,用戶完全不會覺察。
5.2.2 Edge的主要應(yīng)用場景:
CDN/VDN大規(guī)模集群,客戶眾多流眾多需要按需回源。
小規(guī)模集群,但是流比較多,需要按需回源。
骨干帶寬低,邊緣服務(wù)器強(qiáng)悍,可以使用多層edge,降低上層BGP帶寬。
注意:edge可以從源站拉流,也可以將流轉(zhuǎn)發(fā)給源站。也就是說,播放edge上的流時,edge會 回源拉流;推流到edge上時,edge會直接將流轉(zhuǎn)發(fā)給源站。#注意:若只需要中轉(zhuǎn)流給源站,不必用forward,直接使用edge模式即可??梢灾苯又С滞屏?和拉流的中轉(zhuǎn),簡單快捷。Forward應(yīng)用于目標(biāo)服務(wù)器是多個,譬如將一路流主動送給多路服務(wù) 器;edge雖然配置了多臺服務(wù)器,但是只用了一臺,有故障時才切換。注意:優(yōu)先使用edge,除非知道必須用forward,才使用forward。
5.2.3 配置
vhost __defaultVhost__ {# the mode of vhost, local or remote.# local: vhost is origin vhost, which provides stream source.# remote: vhost is edge vhost, which pull/push to origin.# default: localmode remote;# for edge(remote mode), user must specifies the origin server# format as: <server_name|ip>[:port]# @remark user can specifies multiple origin for error backup, by space,# for example, 192.168.1.100:1935 192.168.1.101:1935 192.168.1.102:1935#可配置多個源站,在故障時會切換到下一個源站。origin 127.0.0.1:1935 localhost:1935;# for edge, whether open the token traverse mode,# if token traverse on, all connections of edge will forward to origin to check(auth),# it's very important for the edge to do the token auth.# the better way is use http callback to do the token auth by the edge,# but if user prefer origin check(auth), the token_traverse if better solution.# default: offtoken_traverse off;
}
#注:在SRS中還有另外一種集群方式,edge方式。注意兩種方式的用詞不同。在Forward模式中,中心節(jié)點(diǎn)叫Master,邊緣節(jié)點(diǎn)叫Slave;在edge模式中,中心節(jié)點(diǎn)叫origin(源站),邊緣節(jié)點(diǎn)叫做edge。
5.3 ffmpeg轉(zhuǎn)碼
#官方參考:https://github.com/ossrs/srs/wiki/v3_CN_FFMPEG
5.3.1 應(yīng)用場景
FFMPEG的重要應(yīng)用場景包括:
-
推送一路高碼率,轉(zhuǎn)多路輸出。譬如:游戲直播中,推送一路1080p流到SRS,SRS可以轉(zhuǎn)碼輸出1080p/720p/576p多路,低碼率可以給移動設(shè)備觀看。這樣節(jié)省了推流帶寬(一般源站為BGP帶寬,很貴),也減輕了客戶端壓力(譬如客戶端邊玩游戲邊直播)。
-
支持多屏輸出。譬如:網(wǎng)頁推流(主播)編碼為vp6/mp3或speex,推流到SRS后無法支持HLS(要求h264+aac),可以轉(zhuǎn)碼成h264+aac后切片成HLS或者推送到其他服務(wù)器再分發(fā)。
-
加水印。適用于需要對流進(jìn)行加水印的情況,譬如打上自己的logo。SRS支持文字水印和圖片水印,也可以支持視頻作為水印,或者將兩路流疊加(參考ffmpeg的用法)。
-
截圖:參考使用Transcoder截圖
-
其他濾鏡:SRS支持所有ffmpeg的濾鏡。
5.3.2 SRS轉(zhuǎn)碼的主要流程包括
- 編碼器推送RTMP流到SRS的vhost。
- SRS的vhost若配置了轉(zhuǎn)碼,則進(jìn)行轉(zhuǎn)碼。
- 轉(zhuǎn)碼后,按照配置,推送到SRS本身或者其他RTMP服務(wù)器。
5.3.3 ffmpeg配置:
vhost kn.pcc58.com {
...transcode {enabled on;ffmpeg ./objs/ffmpeg/ffmpeg;engine ff {enabled on;vcodec libx264;acodec aac;vfps 25;vwidth 300;# video height, must be even numbers.vheight 3320;vthreads 4;vprofile main;vpreset medium;# vthreads 12;aparams {}output rtmp://xxx.xxx.236.196:[port]/[app]?vhost=__defaultVhost__/[stream]_[engine];}}
}
RS的轉(zhuǎn)碼參數(shù)全是FFMPEG的參數(shù),有些參數(shù)SRS做了自定義,見下表。
SRS參數(shù) | FFMPEG參數(shù) | 實例 | 說明 |
---|---|---|---|
vcodec | vcodec | ffmpeg … -vcodec libx264 … | 指定視頻編碼器 |
vbitrate | b:v | ffmpeg … -b:v 500000 … | 輸出的視頻碼率 |
vfps | r | ffmpeg … -r 25 … | 輸出的視頻幀率 |
vwidth/vheight | s | ffmpeg … -s 400x300 -aspect 400:300 … | 輸出的視頻寬度x高度,以及寬高比 |
vthreads | threads | ffmpeg … -threads 8 … | 編碼線程數(shù) |
vprofile | profile:v | ffmpeg … -profile:v high … | 編碼x264的profile |
vpreset | preset | ffmpeg … -preset medium … | 編碼x264的preset |
acodec | acodec | ffmpeg … -acodec libaacplus … | 音頻編碼器 |
abitrate | b:a | ffmpeg … -b:a 70000 … | 音頻輸出碼率。libaacplus:16-72k |
asample_rate | ar | ffmpeg … -ar 44100 … | 音頻采樣率 |
achannels | ac | ffmpeg … -ac 2 … | 音頻聲道 |
Other Transcode Config
conf/full.conf中有很多FFMPEG轉(zhuǎn)碼配置的實例,也可以參考ffmpeg的命令行。
- mirror.transcode.srs.com 將視頻流上半截,翻轉(zhuǎn)到下半截,看起來像個鏡子。
- drawtext.transcode.srs.com 加文字水印。
- crop.transcode.srs.com 剪裁視頻。
- logo.transcode.srs.com 添加圖片logo。
- audio.transcode.srs.com 只對音頻轉(zhuǎn)碼。
- copy.transcode.srs.com 不轉(zhuǎn)碼只轉(zhuǎn)封裝,類似于SRS的Forward。
- all.transcode.srs.com 轉(zhuǎn)碼參數(shù)的詳細(xì)說明。
- ffempty.transcode.srs.com 一個ffmpeg的mock,不轉(zhuǎn)碼只打印參數(shù)。
- app.transcode.srs.com 對指定的app的流轉(zhuǎn)碼。
- stream.transcode.srs.com 對指定的流轉(zhuǎn)碼。
- vn.transcode.srs.com 只輸出音頻,禁止視頻輸出。
6 終端設(shè)備播放
#hls 綫上演示地址
http://106.13.72.138/video_hls/index.html
#rtmp 綫上演示地址
http://106.13.72.138/video_rtmp/index.html
#flv 綫上演示地址
http://106.13.72.138/video_flv/index.html#h5 demo百度云下載地址
鏈接:https://pan.baidu.com/s/1OIqvnacrAD9gyz2PyuWUnw
提取碼:s666
復(fù)制這段內(nèi)容后打開百度網(wǎng)盤手機(jī)App,操作更方便哦
7 調(diào)試相關(guān)工具
5.1 推流測試工具:OBS
#obs 百度云下載鏈接
鏈接:https://pan.baidu.com/s/1_NL7EL0BIIlrGikqlT3cdg
提取碼:n480
復(fù)制這段內(nèi)容后打開百度網(wǎng)盤手機(jī)App,操作更方便哦
5.2 拉流測試工具
1、SRS 在線調(diào)試:http://ossrs.net/srs.release/trunk/research/players/srs_player.html
2、VLC
5.3 h5開源:B站開源的flv.js ,vidio.js
5.4 音視頻查看工具,MediaInfo_GUI_20
#官網(wǎng)下載地址
https://mediaarea.net/download/binary/mediainfo-gui/20.03/MediaInfo_GUI_20.03_Windows.exe
#百度云盤下載地址
鏈接:https://pan.baidu.com/s/1Zcq4fOkYY18nTwrOsi7RYQ
提取碼:5pmr
#硬件編碼
https://www.cnblogs.com/qihangzj/p/11562350.html
rtmp://cshop.pbphkj.com:1935/live/wwww_ff
8 參考:官方
# 參考srs官方:https://github.com/ossrs/srs/wiki/v1_CN_Home
# 參考ffmpeg官方:http://ffmpeg.org/ffmpeg.html#參考srs官方教程:https://github.com/ossrs/srs/wiki/v1_CN_Docshttps://recomm.cnblogs.com/blogpost/11970135
9 直播會議解決方案(未完待續(xù))
、熟悉Janus、MediaSoup等開源服務(wù);
了解學(xué)習(xí)重點(diǎn)用
本章將介紹幾種多方通信的架構(gòu)模型,以及比較有名的開源項目的優(yōu)劣情況,并傳授大家如何選擇出最適自己或適合團(tuán)隊的開源項目。
- 12-1 多人互動架構(gòu)方案
- 12-2 Mesh架構(gòu)模型詳解
- 12-3 MCU架構(gòu)模型詳解
- 12-4 SFU架構(gòu)模型詳解
- 12-5 Licode流媒體服務(wù)器架構(gòu)和特點(diǎn)
- 12-6 Janus流媒體服務(wù)器的架構(gòu)及特點(diǎn)
- 12-7 Medooze流媒體服務(wù)器架構(gòu)及特點(diǎn)
- 12-8 Mediasoup流媒體服務(wù)器架構(gòu)及特點(diǎn)
Janus:
#官網(wǎng):
https://janus.conf.meetecho.com/
#github地址
https://github.com/meetecho/janus-gateway
安裝:
#1 依賴安裝
yum install -y libmicrohttpd-devel jansson-devel \openssl-devel sofia-sip-devel glib2-devel \opus-devel libogg-devel libcurl-devel pkgconfig gengetopt \libconfig-devel libtool autoconf automake#-- yum install libsrtp-devel#2 依賴安裝
yum -y install python3 python3-pip ninja-build
yum -y install git#3 meson安裝 https://github.com/mesonbuild/meson
wget https://github.com/mesonbuild/meson/releases/download/0.55.0/meson-0.55.0.tar.gz
tar xvf meson-0.55.0.tar.gz
chmod -R 777 meson-0.55.0
cd meson-0.55.0/
./setup.py install
meson -v#4 libnice安裝
git clone https://gitlab.freedesktop.org/libnice/libnice.git
meson --prefix=/usr build && ninja -C build && sudo ninja -C build install#yum install -y libcurl libcurl-devel apr-devel cyrus-sasl* apr-util-devel zlib* python-devel libevent#libsrtp-2.2.0 4699 root 2020/07/22 09:10:04 wget https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz4700 root 2020/07/22 09:10:23 tar xfv v2.2.0.tar.gz4701 root 2020/07/22 09:10:28 cd libsrtp-2.2.04702 root 2020/07/22 09:10:34 ./configure --prefix=/usr --enable-openssl --libdir=/usr/lib644703 root 2020/07/22 09:10:42 make shared_library && sudo make installpython3 -m pip install mesonpython3 -m pip install ninja4688 root 2020/07/22 09:02:31 git clone https://gitlab.freedesktop.org/libnice/libnice.gitmeson --prefix=/usr build && ninja -C build && sudo ninja -C build install#janus-gateway安裝
git clone https://github.com/meetecho/janus-gateway.git
cd janus-gateway
./autogen.sh
./configure --prefix=/opt/janus
make
make install
make configs/opt/janus/bin/janus -F /opt/janus/etc/janus/