H5到底如何做視頻直播

来源:http://www.cnblogs.com/gdsblog/archive/2017/05/12/6847262.html
-Advertisement-
Play Games

為了緊跟潮流,本文將向大家介紹一下視頻直播中的基本流程和主要的技術點,包括但不限於前端技術。 1 H5到底能不能做視頻直播? 當然可以, H5火了這麼久,涵蓋了各個方面的技術。 對於視頻錄製,可以使用強大的webRTC(Web Real-Time Communication)是一個支持網頁瀏覽器進行 ...


為了緊跟潮流,本文將向大家介紹一下視頻直播中的基本流程和主要的技術點,包括但不限於前端技術。

1 H5到底能不能做視頻直播?

當然可以, H5火了這麼久,涵蓋了各個方面的技術。

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

 

對於視頻播放,可以使用HLS(HTTP Live Streaming)協議播放直播流,iOSAndroid都天然支持這種協議,配置簡單,直接使用video標簽即可。

webRTC相容性:

video標簽播放hls協議視頻:

1 2 3 4 <video controls autoplay>       <source src="http://10.66.69.77:8080/hls/mystream.m3u8" type="application/vnd.apple.mpegurl" />       <p class="warning">Your browser does not support HTML5 video.</p>   </video>

2 到底什麼是HLS協議?

簡單講就是把整個流分成一個個小的,基於HTTP的文件來下載,每次只下載一些,前面提到了用於H5播放直播視頻時引入的一個.m3u8的文件,這個文件就是基於HLS協議,存放視頻流元數據的文件。

每一個.m3u8文件,分別對應若幹個ts文件,這些ts文件才是真正存放視頻的數據,m3u8文件只是存放了一些ts文件的配置信息和相關路徑,當視頻播放時,.m3u8是動態改變的,video標簽會解析這個文件,並找到對應的ts文件來播放,所以一般為了加快速度,.m3u8放在web伺服器上,ts文件放在cdn上。

.m3u8文件,其實就是以UTF-8編碼的m3u文件,這個文件本身不能播放,只是存放了播放信息的文本文件:

1 2 3 4 5 6 7 #EXTM3U                     m3u文件頭 #EXT-X-MEDIA-SEQUENCE       第一個TS分片的序列號 #EXT-X-TARGETDURATION       每個分片TS的最大的時長 #EXT-X-ALLOW-CACHE          是否允許cache #EXT-X-ENDLIST              m3u8文件結束符 #EXTINF                     指定每個媒體段(ts)的持續時間(秒),僅對其後面的URI有效 mystream-12.ts

ts文件:

HLS的請求流程是:
1 http請求m3u8的url。
2 服務端返回一個m3u8的播放列表,這個播放列表是實時更新的,一般一次給出5段數據的url。
3 客戶端解析m3u8的播放列表,再按序請求每一段的url,獲取ts數據流。

簡單流程:

3 HLS直播延時

我們知道hls協議是將直播流分成一段一段的小段視頻去下載播放的,所以假設列表裡面的包含5個ts文件,每個TS文件包含5秒的視頻內容,那麼整體的延遲就是25秒。因為當你看到這些視頻時,主播已經將視頻錄製好上傳上去了,所以時這樣產生的延遲。當然可以縮短列表的長度和單個ts文件的大小來降低延遲,極致來說可以縮減列表長度為1,並且ts的時長為1s,但是這樣會造成請求次數增加,增大伺服器壓力,當網速慢時回造成更多的緩衝,所以蘋果官方推薦的ts時長時10s,所以這樣就會大改有30s的延遲。參考資料:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/FrequentlyAskedQuestions/FrequentlyAskedQuestions.html

4 視頻直播的整個流程是什麼?

當視頻直播可大致分為:

1 視頻錄製端:一般是電腦上的音視頻輸入設備或者手機端的攝像頭或者麥克風,目前以移動端的手機視頻為主。

2 視頻播放端:可以是電腦上的播放器,手機端的native播放器,還有就是h5的video標簽等,目前還是已手機端的native播放器為主。

3 視頻伺服器端:一般是一臺nginx伺服器,用來接受視頻錄製端提供的視頻源,同時提供給視頻播放端流服務。

簡單流程:

 

 

5 怎樣進行音視頻採集?

當首先明確幾個概念:

視頻編碼:所謂視頻編碼就是指通過特定的壓縮技術,將某個視頻格式的文件轉換成另一種視頻格式文件的方式,我們使用的iphone錄製的視頻,必須要經過編碼,上傳,解碼,才能真正的在用戶端的播放器里播放。

編解碼標準:視頻流傳輸中最為重要的編解碼標準有國際電聯的H.261、H.263、H.264,其中HLS協議支持H.264格式的編碼。
音頻編碼:同視頻編碼類似,將原始的音頻流按照一定的標準進行編碼,上傳,解碼,同時在播放器里播放,當然音頻也有許多編碼標準,例如PCM編碼,WMA編碼,AAC編碼等等,這裡我們HLS協議支持的音頻編碼方式是AAC編碼。

下麵將利用ios上的攝像頭,進行音視頻的數據採集,主要分為以下幾個步驟:

 

1 音視頻的採集,ios中,利用AVCaptureSession和AVCaptureDevice可以採集到原始的音視頻數據流。
2 對視頻進行H264編碼,對音頻進行AAC編碼,在ios中分別有已經封裝好的編碼庫來實現對音視頻的編碼。
3 對編碼後的音、視頻數據進行組裝封包;
4 建立RTMP連接並上推到服務端。

 

ps:由於編碼庫大多使用C語言編寫,需要自己使用時編譯,對於ios,可以使用已經編譯好的編碼庫。

x264編碼:https://github.com/kewlbear/x264-ios

faac編碼:https://github.com/fflydev/faac-ios-build

ffmpeg編碼:https://github.com/kewlbear/FFmpeg-iOS-build-script

關於如果想給視頻增加一些特殊效果,例如增加濾鏡等,一般在編碼前給使用濾鏡庫,但是這樣也會造成一些耗時,導致上傳視頻數據有一定延時。

簡單流程:

6 前面提到的ffmpeg是什麼?

和之前的x264一樣,ffmpeg其實也是一套編碼庫,類似的還有Xvid,Xvid是基於MPEG4協議的編解碼器,x264是基於H.264協議的編碼器,ffmpeg集合了各種音頻,視頻編解碼協議,通過設置參數可以完成基於MPEG4,H.264等協議的編解碼,demo這裡使用的是x264編碼庫。

7 什麼是RTMP?

Real Time Messaging Protocol(簡稱 RTMP)是 Macromedia 開發的一套視頻直播協議,現在屬於 Adobe。和HLS一樣都可以應用於視頻直播,區別是RTMP基於flash無法在ios的瀏覽器里播放,但是實時性比HLS要好。所以一般使用這種協議來上傳視頻流,也就是視頻流推送到伺服器。

這裡列舉一下hls和rtmp對比:

8 推流

簡所謂推流,就是將我們已經編碼好的音視頻數據發往視頻流伺服器中,一般常用的是使用rtmp推流,可以使用第三方庫librtmp-iOS進行推流,librtmp封裝了一些核心的api供使用者調用,如果覺得麻煩,可以使用現成的ios視頻推流sdk,也是基於rtmp的,https://github.com/runner365/LiveVideoCoreSDK

9 推流伺服器搭建

簡簡單的推流伺服器搭建,由於我們上傳的視頻流都是基於rtmp協議的,所以伺服器也必須要支持rtmp才行,大概需要以下幾個步驟:

1 安裝一臺nginx伺服器。

2 安裝nginx的rtmp擴展,目前使用比較多的是https://github.com/arut/nginx-rtmp-module

3 配置nginx的conf文件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 rtmp {          server {              listen 1935;  #監聽的埠            chunk_size 4000;                             application hls {  #rtmp推流請求路徑             live on;               hls on;               hls_path /usr/local/var/www/hls;               hls_fragment 5s;           }       }   }  

4 重啟nginx,將rtmp的推流地址寫為rtmp://ip:1935/hls/mystream,其中hls_path表示生成的.m3u8和ts文件所存放的地址,hls_fragment表示切片時長,mysteam表示一個實例,即將來要生成的文件名可以先自己隨便設置一個。更多配置可以參考:https://github.com/arut/nginx-rtmp-module/wiki/

根據以上步驟基本上已經實現了一個支持rtmp的視頻伺服器了。

10 在HTML5頁面進行播放直播視頻?

簡單來說,直接使用video標簽即可播放hls協議的直播視頻:

1 2 3 4 <video autoplay webkit-playsinline>       <source src="http://10.66.69.77:8080/hls/mystream.m3u8" type="application/vnd.apple.mpegurl" />       <p class="warning">Your browser does not support HTML5 video.</p>   </video>

需要註意的是,給video標簽增加webkit-playsinline屬性,這個屬性是為了讓video視頻在ios的uiwebview裡面可以不全屏播放,預設ios會全屏播放視頻,需要給uiwebview設置allowsInlineMediaPlayback=YES。業界比較成熟的videojs,可以根據不同平臺選擇不同的策略,例如ios使用video標簽,pc使用flash等。

11 坑點總結

簡根據以上步驟,筆者寫了一個demo,從實現ios視頻錄製,採集,上傳,nginx伺服器下發直播流,h5頁面播放直播視頻者一整套流程,總結出以下幾點比較坑的地方:

1 在使用AVCaptureSession進行採集視頻時,需要實現AVCaptureVideoDataOutputSampleBufferDelegate協議,同時在- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection捕獲到視頻流,要註意的是didOutputSampleBuffer這個方法不是didDropSampleBuffer方法,後者只會觸發一次,當時開始寫的是didDropSampleBuffer方法,差了半天才發現方法調用錯了。

2 在使用rtmp推流時,rmtp地址要以rtmp://開頭,ip地址要寫實際ip地址,不要寫成localhost,同時要加上埠號,因為手機端上傳時是無法識別localhost的。

這裡後續會補充上一些坑點,有的需要貼代碼,這裡先列這麼多。

12 業界支持

目前,騰訊雲,百度雲,阿裡雲都已經有了基於視頻直播的解決方案,從視頻錄製到視頻播放,推流,都有一系列的sdk可以使用,缺點就是需要收費,如果可以的話,自己實現一套也並不是難事哈。

 

demo地址:https://github.com/lvming6816077/LMVideoTest/

 

參考資料:http://www.nihaoshijie.com.cn/index.php/archives/615


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天大風大雨, 但心情還行, 繼續擼DOTA 狀態模式(state pattern)定義 當一個對象的內在狀態改變時允許改變其行為, 這個對象看起來像是改變了其類 這在我們開發的業務中太常見了, 角色許可權的管理, 給予不同的許可權, 不同角色的操作就會發生改變 該類圖中包含三個角色 Context: ...
  • 看到游戲, 就來勁了, 職責鏈模式詳解 職責鏈模式(chain of responsibility)的定義 為了避免請求的發送者和接受者之間的耦合關係, 使多個接收對象都用機會處理請求. 將這些對象連成一條鏈, 並沿著這條鏈傳遞請求, 直到有一個對象處理它為止 職責鏈模式解決的問題 客戶端與具體的處 ...
  • 1.children()方法:$('div').children() 遍歷查找div元素的所有子元素節點 2.next()方法:$('div').next() 查找div元素後相鄰的同級元素但非所有同級元素 [相關方法] (1)nextAll()方法:$('div').nextAll() 查找div ...
  • $ionicHistory 定義:當用戶通過導航欄切換視圖頁面的時候,ionicHistory起到跟蹤視圖的作用,類似的瀏覽器的行為方式,一個ionic應用程式能夠保持以前的視圖,當前視圖,和前視圖(如果有一個)。然而,一個典型的Web瀏覽器只跟蹤一個歷史堆棧在一個線性的方式。不同於傳統的瀏覽器環境 ...
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.o ...
  • 組件中的路由 `` 無參數 與router1.x不同點 在vue router2.x中使用 帶參數 在vue devtools中可查看到所有的某個路由的所有信息: 路由的重定向 路由的重定向需要我們在路由文件中配置: 註意:從圖中看出,雖然路由發生了跳轉,但是後面跟的參數並沒有發生變化。 組件內的導 ...
  • for...in遍歷拿到的x是鍵(下標)。而for...of遍歷拿到的x是值,但在對象中會提示不是一個迭代器報錯。例子如下: let x; let a = ['A','B','C']; let b = {name: '劉德華',age: '18'}; console.log(a.length); f ...
  • 一、難以掌控的回調 我在第一話中介紹了非同步的概念、事件迴圈、以及JS編程中可能的3種非同步情況(用戶交互、I/O、定時器)。在編寫非同步操作代碼時,最直接、也是每個JSer最先接觸的寫法一定是回調函數(callback),比如下麵這位段代碼: Ajax請求是一種I/O操作,往往需要較長時間來完成,為了不 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...