音視頻通訊——直播協議和視頻推流

近年來直播已成爲互聯網行業的大熱話題,直播答題、遊戲直播、競賽直播等層出不窮,直播早已成爲人們耳熟能詳的技術。事實上直播的興起不只與新時代人們要求爲本身代言的心理有關,同時也得益於帶寬的提速和CDN技術的發展。伴隨着CDN技術的成熟,企業本身部署雲服務器作直播也愈來愈簡單c++

本文做爲直播介紹系列文的第2篇,主要和你們談談直播協議、視頻推流等技術內容程序員

直播協議

流媒體分爲直播和點播。一般來講點播使用的都是HTTP協議,直播主要用的是RTMP, HLS, HTTP-FLV等。近年來直播協議也有新發展如DASH,但仍處於起步階段。數據庫

直播和點播協議的不一樣,根源在於他們的業務差別。點播,常見用於優酷,愛奇藝等視頻網站中電視劇、電影等媒體資源的播放,即點播都是錄製好的視頻,一千我的看同一個視頻,不管任什麼時候候點進去獲取到的媒體數據都是同樣的,而直播則否則,不一樣時候點進來觀看到的信息是不同的。服務器

一般來說,直播和點播是相互並不交融的,不過近些年來也有人創新發展——直播時移模式,即點播與直播相結合。其作法是將直播流錄製成一小片一小片的點播文件,而後用戶能夠在任何地點、任意終端訪問任意內容。好比你正在看一場球賽的直播,而後有一個鏡頭很精彩,想立刻再看一遍,就能夠拖一下進度條回退而後回放,在看完回放後還能夠一鍵返回直播。網絡

目前直播分發主要有如下特色:異步

1,flv居多,ts較少,緣由主要是ts標準太過於複雜。Flv的標準開放文檔是11頁,ts的有174頁。對於通常的直播,flv基本能知足需求,所以ts應用就較少。固然了,咱們也能夠藉助於FFmpeg,可是它會將流媒體方面你想獲得的和想不到的都封裝了,不夠精準。socket

2,rtmp和hls並存。通常來說,rtmp用在PC端上,使用flash播放;hls用做手機和平板上。測試

3,實時流通常使用rtmp。rtmp能作到1到3秒的延遲,是直播裏除了rtsp外延遲最低的協議。PC上支持直接播放,移動端能夠用FFmpeg解碼播放。除了rtmp還有其餘協議適合實時流媒體播放嗎?網站

實際上http-flv比rtmp更合適實時流播放。兩者延遲同樣,在PC端上均可直接播,移動端須要使用ffmpeg,但http-flv還有個好處就是能穿牆。但大多數CDN並不支持http-flv直播,由於通常的Web服務器不支持http-flv,這是個流媒體問題。編碼

直播服務器

直播中流媒體數據的傳輸主要依賴服務器。目前開源的流媒體服務器,有RED五、CRTMPD、NGINX-RTMP和SRS等

RED5:最古老的基於flash的流媒體服務的開源流媒體服務器。它由Java語言編寫,使用rtmp做爲流媒體傳輸協議,與FMS徹底兼容;具備流化flv、MP3文件,實時錄製客戶端流爲flv文件,共享對象,實時視頻播放、Remoting等功能。但因爲其技術較爲落後,新入場的直播平臺都已放棄使用。

CRTMPD:使用c++語言編寫,支持多種rtmp協議、IPTV相關網絡協議和移動設備的流媒體服務器。使用單線程異步socket,在當時處於領先水平,可是當NGINX出現後就漸漸淡出大衆視野了。

NGINX-RTMP :基於NGINX模塊,使用C語言編寫的流媒體服務器,也是目前市場上使用最多的流媒體服務器。伴隨着2012年CDN業務的擴展,直播業務需求暴漲,因爲NGINX-RTMP中直播點播共用一套服務器,且用戶熟悉信任NGINX;NGINX-RTMP逐漸處於行業壟斷地位。

SRS(Simple Rtmp Sever)是一個國產的流媒體服務器,產品定位是運營級的互聯網直播服務器集羣,追求更好的概念完整性和最簡單實現的代碼。據官網介紹其效率很是高,能達到NGINX-RTMP的3倍,並且中英文文檔各有一份,較爲適合國內程序員的開發環境。

直播推流

直播推流的整體過程以下圖

圖片描述

如上圖所示,直播中一般在從攝像頭和麥克風等採集到相關數據源後須要作一些封裝前處理,如去噪、美顏、變聲等,而後進行音視頻編碼,再用相適應的流媒體協議封裝,進行碼率自適應後就可投到相關站點展現了。

可是在不一樣的技術語言下作直播推流的方法也是不一樣的

若是你是iOS或者Android程序員,作RTMP推流就會更簡單,能夠直接找一個推流的數據庫而後給出視頻參數,以及最終的RTMP地址,就能推出一個標準的RTMP流

若是你是C++程序員,會麻煩不少,你至少要掌握採集、編碼、寫流這3個步驟。固然,這些步驟都有庫能夠調用,可是即使如此,假設你使用FFmpeg庫,完成上述動做代碼也須要100行左右了;由於其主要的代碼流程就需包括打開音視頻設備、建立編解碼器、設置編碼參數、初始化網絡流句柄、寫協議頭、循環採集數據、解碼數據、編碼數據、格式封裝和寫網絡流。

固然,你能夠直接用FFmpeg的命令行,一條命令完成推流,可是這也僅限於測試或者作簡單的demo,真正的工程環境中並不適用,由於這種一條簡單命令的方法在許多功能上都不能支持。

總結:

總之,作直播難易程度主要是和你想實現的功能有關,若是你只是打算本身作測試,那下載一個開源服務器代碼,編碼運行,再用FFmpeg一行命令推流,再用播放器播放也就完成了。可是若是想要商業化,知足用戶的多種需求,如回聲抑制、連麥直播、美顏濾鏡等,問題的複雜度就呈指數倍上漲了。

相關文章
相關標籤/搜索