HTTP Live Streaming直播(iOS直播)技術分析與實現

?  不經意間發現,大半年沒寫博客了,自覺汗顏。實則2012后半年,家中的事一樣接著一樣發生,實在是沒有時間。快過年了,總算忙里偷閑,把最近的一些技術成果,總結成了文章,與大家分享。

  前些日子,也是項目需要,花了一些時間研究了HTTP Live StreamingHLS)技術,并實現了一個HLS編碼器HLSLiveEncoder,當然,C++寫的。其功能是采集攝像頭與麥克風,實時進行H.264視頻編碼和AAC音頻編碼,并按照HLS的協議規范,生成分段的標準TS文件以及m3u8索引文件。通過我的HLSLiveEncoder和第三方Http服務器(例如:Nginx),成功實現了HTTP Live Streaming直播,并在iphone上測試通過。我就把這當中的一些收獲寫在這里。

HLS技術要點分析

  HTTP Live StreamingHLS是蘋果公司(Apple Inc.)實現的基于HTTP的流媒體傳輸協議,可實現流媒體的直播和點播,主要應用在iOS系統,為iOS設備(如iPhone、iPad)提供音視頻直播和點播方案。HLS點播,基本上就是常見的分段HTTP點播,不同在于,它的分段非常小。要實現HLS點播,重點在于對媒體文件分段,目前有不少開源工具可以使用,這里我就不再討論,只談HLS直播技術。

  相對于常見的流媒體直播協議,例如RTMP協議RTSP協議、MMS協議等,HLS直播最大的不同在于,直播客戶端獲取到的,并不是一個完整的數據流。HLS協議在服務器端將直播數據流存儲為連續的、很短時長的媒體文件(MPEG-TS格式),而客戶端則不斷的下載并播放這些小文件,因為服務器端總是會將最新的直播數據生成新的小文件,這樣客戶端只要不停的按順序播放從服務器獲取到的文件,就實現了直播。由此可見,基本上可以認為,HLS是以點播的技術方式來實現直播。由于數據通過HTTP協議傳輸,所以完全不用考慮防火墻或者代理的問題,而且分段文件的時長很短,客戶端可以很快的選擇和切換碼率,以適應不同帶寬條件下的播放。不過HLS的這種技術特點,決定了它的延遲一般總是會高于普通的流媒體直播協議。

  根據以上的了解要實現HTTP Live Streaming直播,需要研究并實現以下技術關鍵點

  1. 采集視頻源和音頻源的數據
  2. 對原始數據進行H264編碼和AAC編碼
  3. 視頻和音頻數據封裝為MPEG-TS包
  4. HLS分段生成策略及m3u8索引文件
  5. HTTP傳輸協議

  其中第1點和第2點,我之前的文章中已經提到過了,而最后一點,我們可以借助現有的HTTP服務器,所以,實現第3點和第4點是關鍵所在。

程序框架與實現 ? ? ? ? ?

  通過以上分析,實現HLS LiveEncoder直播編碼器,其邏輯和流程基本上很清楚了:分別開啟音頻與視頻編碼線程,通過DirectShow(或其他)技術來實現音視頻采集,隨后分別調用libx264和libfaac進行視頻和音頻編碼。兩個編碼線程實時編碼音視頻數據后,根據自定義的分片策略,存儲在某個MPEG-TS格式分段文件中,當完成一個分段文件的存儲后,更新m3u8索引文件。如下圖所示:

??

  上圖中HLSLiveEncoder當收到視頻和音頻數據后,需要首先判斷,當前分片是否應該結束,并創建新分片,以延續TS分片的不斷生成。需要注意的是,新的分片,應當從關鍵幀開始,防止播放器解碼失敗。核心代碼如下所示:

??

  TsMuxer的接口也是比較簡單的。

? ??

HLS分段生成策略和m3u8 ??

1. 分段策略

  • HLS的分段策略,基本上推薦是10秒一個分片,當然,具體時間還要根據分好后的分片的實際時長做標注
  • 通常來說,為了緩存等方面的原因,在索引文件中會保留最新的三個分片地址,以類似“滑動窗口”的形式,進行更新。

2. m3u8文件簡介

  m3u8,是HTTP Live Streaming直播的索引文件。m3u8基本上可以認為就是.m3u格式文件,區別在于,m3u8文件使用UTF-8字符編碼。

#EXTM3U                     m3u文件頭,必須放在第一行
#EXT-X-MEDIA-SEQUENCE       第一個TS分片的序列號
#EXT-X-TARGETDURATION       每個分片TS的最大的時長
#EXT-X-ALLOW-CACHE          是否允許cache
#EXT-X-ENDLIST              m3u8文件結束符
#EXTINF                     extra info,分片TS的信息,如時長,帶寬等

  一個簡單的m3u8索引文件

? ??

運行效果 ? ? ? ? ?

  在Nginx工作目錄下啟動HLSLiveEncoder,并用VLC播放器連接播放

? ? ?

  通過iPhone播放的效果

? ? ?

?

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

??haibindev.cnblogs.com,合作請聯系QQ。(轉載請注明作者和出處)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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

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

相關文章

中文論文格式【雜】

轉自知乎,https://www.zhihu.com/question/23791742/answer/344752056 【紙張】畢業論文一律打印,采取A4紙張,頁邊距一律采取:上、下2.5cm,左3cm,右1.5cm,行間距取多倍行距(設置值為1.25);字符間距為默認值…

jmeter 非gui 模式跑jmx

D:\study\apache-jmeter-3.0\bin>jmeter -n -t D:\study\apache-jmeter-3.0\基金排行.jmx -l D:\study\apache-jmeter-3.0\result_log\獲取基金排行.jtl D:\study\apache-jmeter-3.2\bin>jmeter -n -t D:\study\apache-jmeter-3.2\bin\examples\test\百度新聞首頁.jmx -l…

noip模擬賽 遭遇

分析:暴力挺好打的,對于前30%的數據神搜,hi相同的數據將所有的建筑按照c從小到大排序,看最多能跳多少,ci0的數據將所有的建筑按照h從小到大排序,枚舉起點和終點,看能否跳這么多,取個max就可以了.這樣70分就…

揭開全景相機創業真相:國外一開源國內就自主

今年以來全景相機有了一個大爆發,國外Google、三星、諾基亞等大廠都進入了這個領域,國內也有很多廠商推出了全景相機。 Bubl全景相機國外一開源,國內就自主。這在VR(虛擬現實)領域體現的淋漓盡致——Google的Cardborad…

福大軟工1816 · 團隊現場編程實戰(抽獎系統)

值得一看的補充版本演示視頻 軟工錦鯉在這里程序版本鏈接及說明 按時提交版本 以基礎功能為主github鏈接:first version測試環境說明 本程序在python 3.6以上環境下運行操作說明: 鍵入抽獎關鍵詞,支持:#我要紅包#或“我要換組“或…

LeakCanary——直白的展現Android中的內存泄露

之前碰到的OOM問題,終于很直白的呈現在我的眼前:我嘗試了MAT,但是發現不怎么會用。直到今天終于發現了這個新工具: 當我們的App中存在內存泄露時會在通知欄彈出通知: 當點擊該通知時,會跳轉到具體的頁面&am…

老司機做VR視頻,需要什么樣的全景相機?

做為一個在全景內容領域摸爬滾打一年有余的老司機,經歷了太多的坑。最近有不少朋友轉行進入這個領域,問我買什么樣的相機好。我現在項目太多,根本沒空詳盡解答。所以寫下這篇文章,不懂得自己看吧。 說白了,買什么樣子…

域乎曹勝虎:傳統互聯網“生病”了

11月17日,2018(第12屆)創業周暨全球創業周中國站在上海盛大召開,由上海域乎信息技術有限公司(以下簡稱“域乎”)承辦的區塊鏈專場論壇——《區塊鏈產業應用賦能精英論壇》成功舉辦,吸引了眾多業…

xml的方式配置AOP:Aspect Oriented Programming

在某些類中, 什么時機, 做什么事情 切入點(point-cut): 在某些類中(Class<?>[] itfc new Class<?>[] { IStudentService.class }) 通知: 什么時機, 做什么事情(InvocationHandler的invoke方法) 切面: 切入點 通知 織入(weaver): Proxy.newProxyInstance: 把切入…

[No0000112]ComputerInfo,C#獲取計算機信息(cpu使用率,內存占用率,硬盤,網絡信息)...

github地址&#xff1a;https://github.com/charygao/SmsComputerMonitor 軟件用于實時監控當前系統資源等情況&#xff0c;并調用接口&#xff0c;當資源被超額占用時&#xff0c;發送警報到個人手機&#xff1b;界面模擬Console的顯示方式&#xff0c;信息緩沖大小由配置決定…

I2C總線之(一)---概述

概述&#xff1a;IC 是Inter-Integrated Circuit的縮寫&#xff0c;發音為"eye-squared cee" or "eye-two-cee" , 它是一種兩線接口。 IC 只是用兩條雙向的線&#xff0c;一條 Serial Data Line (SDA) &#xff0c;另一條Serial Clock (SCL)。 SCL&#xf…

js中級(1)

動畫(1) Css樣式提供了運動 過渡的屬性transition 從一種情況到另一種情況叫過渡 Transition:attr time linear delay&#xff1b; Attr 是變化的屬性 Time 是花費的時間 Linear 變化的速度 Delay 是延遲 復習background:url() no-repeat 50% 50% red; Background-image Ba…

I2C總線之(二)---時序

一、協議 1.空閑狀態 I2C總線總線的SDA和SCL兩條信號線同時處于高電平時&#xff0c;規定為總線的空閑狀態。此時各個器件的輸出級場效應管均處在截止狀態&#xff0c;即釋放總線&#xff0c;由兩條信號線各自的上拉電阻把電平拉高。 2.起始位與停止位的定義&#xff1a; 起始信…

微信小程序設置底部導航欄目方法

微信小程序底部想要有一個漂亮的導航欄目&#xff0c;不知道怎么制作&#xff0c;于是百度找到了本篇文章&#xff0c;分享給大家。 好了 小程序的頭部標題 設置好了&#xff0c;我們來說說底部導航欄是如何實現的。 我們先來看個效果圖 這里&#xff0c;我們添加了三個導航圖標…

HTTP協議(3)瀏覽器的使用之查看源碼

在做CTF的Web類題目時&#xff0c;推薦使用Firefox瀏覽器。下面介紹一些在解題過程中關于瀏覽器的常用技巧。首先就是查看源碼。在做Web題目時&#xff0c;經常需要查看網站源碼&#xff0c;有的flag直接就藏在源碼中&#xff0c;有些題目則是在源碼中給出提示和線索&#xff0…

Autofac IoC容器基本使用步驟【1】

原文&#xff1a;http://www.bkjia.com/Asp_Netjc/888119.html 【原文中有一個地方報錯&#xff0c;下面已修改】 一.基本步驟: 1.設計適合控制反轉(IoC)的應用程序 2.給應用程序Autofac 引用. 3.注冊組件. 4.創建一個Container以備后用. 5.從Container創建一個 lifetime scop…

I2C總線之(三)---以C語言理解IIC

為了加深對I2C總線的理解&#xff0c;用C語言模擬IIC總線&#xff0c;邊看源代碼邊讀波形&#xff1a; 如下圖所示的寫操作的時序圖&#xff1a; 讀時序的理解同理。對于時序不理解的朋友請參考“I2C總線之(二)---時序” 完整的程序如下&#xff1a; #include<reg51.h>…

結對編程總結

這個項目我和我的結對伙伴共花了兩個月時間&#xff0c;之所以選這個項目&#xff0c;因為我們之前都學習過Python&#xff0c;也做過類似的程序&#xff0c;相比較其他項目而言&#xff0c;這個項目更合適&#xff0c;也讓我們對詞頻統計方面的知識加深了了解。寫這個程序我們…

JavaScript初學者必看“new”

2019獨角獸企業重金招聘Python工程師標準>>> 譯者按: 本文簡單的介紹了new, 更多的是介紹原型(prototype)&#xff0c;值得一讀。 原文: JavaScript For Beginners: the ‘new’ operator 譯者: Fundebug 為了保證可讀性&#xff0c;本文采用意譯而非直譯。 <di…

libGDX-wiki發布

為方便大家學習和訪問&#xff0c;我將libgdx的wiki爬取到doku-wiki下&#xff0c;專門建立了以下地址。歡迎大家來共同完善。 http://wiki.v5ent.com 轉載于:https://www.cnblogs.com/mignet/p/ligbdx_wiki.html