[轉]H5直播之從推流服務搭建到視頻直播

轉自http://www.php.cn/html5-tutorial-403035.html

最近視頻直播比較火,發現目前 WEB 上主流的視頻直播方案有 HLS 和 RTMP,移動 WEB 端目前以 HLS 為主,PC端則以 RTMP 為主實時性較好,接下來將圍繞這兩種視頻流協議來展開H5直播主題分享,下面通過本文給大家分享HTML5視頻直播思路詳解,一起看看吧

?

前言

前不久抽空對目前比較火的視頻直播,做了下研究與探索,了解其整體實現流程,以及探討移動端HTML5直播可行性方案。

發現目前 WEB 上主流的視頻直播方案有 HLS 和 RTMP,移動 WEB 端目前以 HLS 為主(HLS存在延遲性問題,也可以借助 video.js 采用RTMP),PC端則以 RTMP 為主實時性較好,接下來將圍繞這兩種視頻流協議來展開H5直播主題分享。

一、視頻流協議HLS與RTMP

1. HTTP Live Streaming

HTTP Live Streaming(簡稱 HLS)是一個基于 HTTP 的視頻流協議,由 Apple 公司實現,Mac OS 上的 QuickTime、Safari 以及 iOS 上的 Safari 都能很好的支持 HLS,高版本 Android 也增加了對 HLS 的支持。一些常見的客戶端如:MPlayerX、VLC 也都支持 HLS 協議。

HLS 協議基于 HTTP,而一個提供 HLS 的服務器需要做兩件事:

編碼:以 H.263 格式對圖像進行編碼,以 MP3 或者 HE-AAC 對聲音進行編碼,最終打包到 MPEG-2 TS(Transport Stream)容器之中;分割:把編碼好的 TS 文件等長切分成后綴為 ts 的小文件,并生成一個 .m3u8 的純文本索引文件;瀏覽器使用的是 m3u8 文件。m3u8 跟音頻列表格式 m3u 很像,可以簡單的認為 m3u8 就是包含多個 ts 文件的播放列表。播放器按順序逐個播放,全部放完再請求一下 m3u8 文件,獲得包含最新 ts 文件的播放列表繼續播,周而復始。整個直播過程就是依靠一個不斷更新的 m3u8 和一堆小的 ts 文件組成,m3u8 必須動態更新,ts 可以走 CDN。一個典型的 m3u8 文件格式如下:

?

1

2

3

4

5

6

7

8

9

#EXTM3U

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000

gear1/prog_index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=311111

gear2/prog_index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=484444

gear3/prog_index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=737777

gear4/prog_index.m3u8

?

可以看到 HLS 協議本質還是一個個的 HTTP 請求 / 響應,所以適應性很好,不會受到防火墻影響。但它也有一個致命的弱點:延遲現象非常明顯。如果每個 ts 按照 5 秒來切分,一個 m3u8 放 6 個 ts 索引,那么至少就會帶來 30 秒的延遲。如果減少每個 ts 的長度,減少 m3u8 中的索引數,延時確實會減少,但會帶來更頻繁的緩沖,對服務端的請求壓力也會成倍增加。所以只能根據實際情況找到一個折中的點。

對于支持 HLS 的瀏覽器來說,直接這樣寫就能播放了:

?

1

<video src=”./bipbopall.m3u8″ height=”300″ width=”400″? preload=”auto” autoplay=”autoplay” loop=”loop” webkit-playsinline=”true”></video>

?

注意:HLS 在 PC 端僅支持safari瀏覽器,類似chrome瀏覽器使用HTML5 video

標簽無法播放 m3u8 格式,可直接采用網上一些比較成熟的方案,如:sewise-player、MediaElement、videojs-contrib-hls、jwplayer。

2. Real Time Messaging Protocol

Real Time Messaging Protocol(簡稱 RTMP)是 Macromedia 開發的一套視頻直播協議,現在屬于 Adobe。這套方案需要搭建專門的 RTMP 流媒體服務如 Adobe Media Server,并且在瀏覽器中只能使用 Flash 實現播放器。它的實時性非常好,延遲很小,但無法支持移動端 WEB 播放是它的硬傷。

雖然無法在iOS的H5頁面播放,但是對于iOS原生應用是可以自己寫解碼去解析的, RTMP 延遲低、實時性較好。瀏覽器端,HTML5 video

標簽無法播放 RTMP 協議的視頻,可以通過 video.js 來實現。

?

1

2

3

4

5

6

7

8

9

10

11

<link href=“http://vjs.zencdn.net/5.8.8/video-js.css” rel=“stylesheet”>

<video id=“example_video_1″ class=“video-js vjs-default-skin” controls preload=“auto” width=“640” height=“264” loop=“loop” webkit-playsinline>

<source src=“rtmp://10.14.221.17:1935/rtmplive/home” type=‘rtmp/flv’>

</video>

<script src=“http://vjs.zencdn.net/5.8.8/video.js”></script>

<script>

videojs.options.flash.swf = ‘video.swf’;

videojs(‘example_video_1′).ready(function() {

this.play();

});

</script>

?

3. 視頻流協議HLS與RTMP對比

二、直播形式

目前直播展示形式,通常以YY直播、映客直播這種頁面居多,可以看到其結構可以分成三層:

① 背景視頻層

② 關注、評論模塊

③ 點贊動畫

而現行H5類似直播頁面,實現技術難點不大,其可以通過實現方式分為:

① 底部視頻背景使用video視頻標簽實現播放

② 關注、評論模塊利用 WebScoket 來實時發送和接收新的消息通過DOM 和 CSS3 實現

③ 點贊利用 CSS3 動畫

了解完直播形式之后,接下來整體了解直播流程。

三、直播整體流程

直播整體流程大致可分為:

視頻采集端:可以是電腦上的音視頻輸入設備、或手機端的攝像頭、或麥克風,目前以移動端手機視頻為主。

直播流視頻服務端:一臺Nginx服務器,采集視頻錄制端傳輸的視頻流(H264/ACC編碼),由服務器端進行解析編碼,推送RTMP/HLS格式視頻流至視頻播放端。

視頻播放端:可以是電腦上的播放器(QuickTime Player、VLC),手機端的native播放器,還有就是 H5 的video標簽等,目前還是以手機端的native播放器為主。

(web前端學習交流群:328058344 禁止閑聊,非喜勿進!)

四、H5 錄制視頻

對于H5視頻錄制,可以使用強大的 webRTC (Web Real-Time Communication)是一個支持網頁瀏覽器進行實時語音對話或視頻對話的技術,缺點是只在 PC 的 Chrome 上支持較好,移動端支持不太理想。

使用 webRTC 錄制視頻基本流程

① 調用 window.navigator.webkitGetUserMedia()

獲取用戶的PC攝像頭視頻數據。

② 將獲取到視頻流數據轉換成 window.webkitRTCPeerConnection

(一種視頻流數據格式)。

③ 利用 WebScoket

將視頻流數據傳輸到服務端。

注意:

雖然Google一直在推WebRTC,目前已有不少成型的產品出現,但是大部分移動端的瀏覽器還不支持 webRTC(最新iOS 10.0也不支持),所以真正的視頻錄制還是要靠客戶端(iOS,Android)來實現,效果會好一些。

WebRTC支持度

WebRTC支持度

iOS原生應用調用攝像頭錄制視頻流程

① 音視頻的采集,利用AVCaptureSession和AVCaptureDevice可以采集到原始的音視頻數據流。

② 對視頻進行H264編碼,對音頻進行AAC編碼,在iOS中分別有已經封裝好的編碼庫(x264編碼、faac編碼、ffmpeg編碼)來實現對音視頻的編碼。

③ 對編碼后的音、視頻數據進行組裝封包。

④ 建立RTMP連接并上推到服務端。

五、搭建Ng

五、搭建Nginx+Rtmp直播流服務

安裝nginx、nginx-rtmp-module

① 先clone nginx項目到本地:

brew tap homebrew/nginx

② 執行安裝nginx-rtmp-module

brew install nginx-full –with-rtmp-module

2. nginx.conf配置文件,配置RTMP、HLS

查找到nginx.conf配置文件(路徑/usr/local/etc/nginx/nginx.conf),配置RTMP、HLS。

① 在http節點之前添加 rtmp 的配置內容:

② 在http中添加 hls 的配置

3. 重啟nginx服務

重啟nginx服務,瀏覽器中輸入 http://localhost:8080,是否出現歡迎界面確定nginx重啟成功。

nginx -s reload

六、直播流轉換格式、編碼推流

當服務器端接收到采集視頻錄制端傳輸過來的視頻流時,需要對其進行解析編碼,推送RTMP/HLS格式視頻流至視頻播放端。通常使用的常見編碼庫方案,如x264編碼、faac編碼、ffmpeg編碼等。鑒于 FFmpeg 工具集合了多種音頻、視頻格式編碼,我們可以優先選用FFmpeg進行轉換格式、編碼推流。

1.安裝 FFmpeg 工具

brew install ffmpeg

2.推流MP4文件

視頻文件地址:/Users/gao/Desktop/video/test.mp4

推流拉流地址:rtmp://localhost:1935/rtmplive/home,rtmp://localhost:1935/rtmplive/home

?

1

2

3

4

//RTMP 協議流

ffmpeg -re -i /Users/gao/Desktop/video/test.mp4 -vcodec libx264 -acodec aac -f flv rtmp://10.14.221.17:1935/rtmplive/home

//HLS 協議流

ffmpeg -re -i /Users/gao/Desktop/video/test.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -q 10 rtmp://10.14.221.17:1935/hls/test

?

注意:

當我們進行推流之后,可以安裝VLC、ffplay(支持rtmp協議的視頻播放器)本地拉流進行演示

3.FFmpeg推流命令

① 視頻文件進行直播

?

1

2

ffmpeg -re -i /Users/gao/Desktop/video/test.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -q 10 rtmp://192.168.1.101:1935/hls/test

ffmpeg -re -i /Users/gao/Desktop/video/test.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -q 10 rtmp://10.14.221.17:1935/hls/test

?

② 推流攝像頭+桌面+麥克風錄制進行直播

?

1

ffmpeg -f avfoundation -framerate 30 -i “1:0″ \-f avfoundation -framerate 30 -video_size 640x480 -i “0” \-c:v libx264 -preset ultrafast \-filter_complex ‘overlay=main_w-overlay_w-10:main_h-overlay_h-10′ -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://192.168.1.101:1935/hls/test

?

更多命令,請參考:

FFmpeg處理RTMP流媒體的命令大全

FFmpeg常用推流命令

七、H5 直播視頻播放

移動端iOS和 Android 都天然支持HLS協議,做好視頻采集端、視頻流推流服務之后,便可以直接在H5頁面配置 video 標簽播放直播視頻。

?

1

2

3

4

<video controls preload=“auto” autoplay=“autoplay” loop=“loop” webkit-playsinline>

<source src=“http://10.14.221.8/hls/test.m3u8″ type=“application/vnd.apple.mpegurl” />

<p class=“warning”>Your browser does not support HTML5 video.</p>

</video>

?

八、總結

本文從視頻采集上傳,服務器處理視頻推流,以及H5頁面播放直播視頻一整套流程,具體闡述了直播實現原理,實現過程中會遇到很多性能優化問題。

① H5 HLS 限制必須是H264+AAC編碼。

② H5 HLS 播放卡頓問題,server 端可以做好分片策略,將 ts 文件放在 CDN 上,前端可盡量做到 DNS 緩存等。

③ H5 直播為了達到更好的實時互動,也可以采用RTMP協議,通過video.js 實現播放。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

使用HTML5實現網頁音樂播放器

HTML5 video播放器全屏(fullScreen)實現的方法


---------------------
作者:China_Lzw
來源:CSDN
原文:https://blog.csdn.net/qq285679784/article/details/86010076
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

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

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

相關文章

【數據庫原理及應用】經典題庫附答案(14章全)——第五章:關系數據理論

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

webform數據導出

把數據放到一個泛型集合里&#xff0c;再把泛型集合里面的數據放到一個table中&#xff0c;設置好文件路徑&#xff0c;然后進行文件讀取&#xff0c;最后供用戶下載。 數據導出放在一個按鈕中就可以了 using System; using System.Collections.Generic; using System.Linq; us…

C語言試題117之有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前 20 項之和

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13…求出這個數列的前 20 項之和。 分析…

Ionic Mac 環境配置

2019獨角獸企業重金招聘Python工程師標準>>> Ionic Mac 環境配置 安裝cordova之前要安裝nodejs 會包含npm安裝&#xff08;npm是個包管理器&#xff09;&#xff0c;到官網下載https://nodejs.org/en/download/ 是個pkg包下載之后雙擊下載包運行然后 step …

【數據庫原理及應用】經典題庫附答案(14章全)——第六章:關系數據庫設計過程

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

(03).NET MAUI實戰 基礎控件

1.概要本章將繼續介紹.NET MAUI中的常用基礎控件&#xff0c;讓剛剛接觸MAUI的小伙伴有寫基礎的認識&#xff0c;心里有底開發起來將得心應手。下面將列出一些常用的基礎控件&#xff1a;控件名中文名稱說明Button按鈕與WPF中的基礎用法無太大變化CheckBox單選框與WPF中的基礎用…

ffmpeg源碼分析及mp4文件解析

一.mp4文件的組織 1. mp4文件的box(ffmpeg中叫atom) mp4是由一系列的box組成的&#xff0c;每個box的header是8個字節(4字節的長度,4字節的type) 第一個box比較特殊&#xff0c;其type類型為ftyp,還包含一個sub-type 0000000: 0000 0020 6674 7970 6973 6f6d 0000 0200 ... f…

【數據庫原理及應用】經典題庫附答案(14章全)——第七章:數據庫恢復技術

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

C++庫(Google Breakpad)

Google Breakpad是什么&#xff1f; 一個開源的多平臺崩潰報告系統。 Google breakpad是一個非常實用的跨平臺的崩潰轉儲和分析模塊&#xff0c;它支持Windows&#xff0c;Linux和Mac和Solaris。由于他本身跨平臺&#xff0c;所以很大程度上減少了我們在平臺移植時的工作&#…

java eleven進度條

2019獨角獸企業重金招聘Python工程師標準>>> 一個矩形組件 MethodDescribleJProgrssBar()不帶進度字符&#xff0c;最小值0最大值100的水平進度條JProgressBar(int orient)VERTICAL/HORIZONTALJProgressBar(int in,int max)指定最大最小的水平進度條JProgressBar(in…

Docker:多階段構建 ASP.NET Core 應用鏡像

本文選自『.NET大牛之路』知識星球&#xff0c;發布于2022年05月25日。今天我們一起來寫 Dockerfile 構建一個 ASP.NET Core 應用鏡像&#xff0c;同時還會將鏡像發布到 Docker Hub 倉庫。1創建示例 Web 應用程序為了演示&#xff0c;我們先創建一個 ASP.NET Core 應用程序&…

[轉]【JAVA各版本特性】JAVA 1.0

閑來想了解下各版本之間的特性&#xff0c;搜索沒有最新的特性說明&#xff0c;故想寫一份。廢話不多說。 JDK Version 1.0 1996-01-23 Oak(橡樹) 初代版本&#xff0c;偉大的一個里程碑&#xff0c;但是是純解釋運行&#xff0c;使用外掛JIT&#xff0c;性能比較差&#xff0…

【數據庫原理及應用】經典題庫附答案(14章全)——第八章:數據庫并發控制

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

Tomcat(Windows)

百度云&#xff1a;鏈接&#xff1a;http://pan.baidu.com/s/1pKYrf79 密碼&#xff1a;56t0官網下載網址&#xff1a;http://archive.apache.org/dist/tomcat/tomcat-9/v9.0.0.M13/bin/ 轉載于:https://www.cnblogs.com/haxianhe/p/9271103.html

北京Uber優步司機獎勵政策(3月11日)

滴快車單單2.5倍&#xff0c;注冊地址&#xff1a;http://www.udache.com/ 如何注冊Uber司機(全國版最新最詳細注冊流程)/月入2萬/不用搶單&#xff1a;http://www.cnblogs.com/mfryf/p/4612609.html 優步獎勵低/不掙錢/怎么辦?看這里&#xff1a;http://www.cnblogs.com/mfry…

【招聘(廣州)】成功易(廣州).Net Core中高級開發工程師

成功易&#xff08;廣州&#xff09;信息技術有限公司簡介成功易是一家集團性公司&#xff0c;創立于2002年&#xff0c;總部位于北京&#xff0c;旗下擁有7家子公司。廣州成功易成立于2019年&#xff0c;人員逐漸增長150人&#xff0c;組織架構完善&#xff0c; 我們是騰訊廣告…

【數據庫原理及應用】經典題庫附答案(14章全)——第九章:數據庫安全性

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

webstrom使用方法

一、設置file-settings- -color&fonts設置&#xff0c;字體 主體 -file and code templates模板ctrlr 查找&#xff0c;替換1 雙擊shift 快速查找2 file -new project 新建文件夾3 file-new 新建html css js等4 右鍵-local history 查看歷史5 雙擊選擇某個元素&#xff0c;…

ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' 解決Mysql錯誤

1、停止 服務 PS C:\WINDOWS\system32> net stop mysql mysql 服務正在停止. mysql 服務已成功停止。2、執行 mysqld --shared-memory --skip-grant-tables PS C:\WINDOWS\system32> mysqld --shared-memory --skip-grant-tables ------以下操作 另外打開一個 終端--…

xcode 設置快捷鍵 整行上下移動

2019獨角獸企業重金招聘Python工程師標準>>> 設置整行代碼上下移動&#xff1a;找到Xcode中的自帶的配置文件&#xff1a;/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist用文本編輯IDETextKeyBind…