拉流(播放):
根據(jù)協(xié)議類型(如RTMP盔夜、RTP负饲、RTSP堤魁、HTTP等),與服務(wù)器建立連接并接收數(shù)據(jù)返十;
解析二進(jìn)制數(shù)據(jù)妥泉,從中找到相關(guān)流信息;
根據(jù)不同的封裝格式(如FLV洞坑、TS)解復(fù)用(demux)盲链;
分別得到已編碼的H.264視頻數(shù)據(jù)和AAC音頻數(shù)據(jù);
使用硬解碼(對(duì)應(yīng)系統(tǒng)的API)或軟解碼(FFMpeg)來(lái)解壓音視頻數(shù)據(jù)迟杂;
經(jīng)過(guò)解碼后得到原始的視頻數(shù)據(jù)(YUV)和音頻數(shù)據(jù)(AAC)刽沾;
因?yàn)橐纛l和視頻解碼是分開(kāi)的,所以我們得把它們同步起來(lái)逢慌,否則會(huì)出現(xiàn)音視頻不同步的現(xiàn)象悠轩,比如別人說(shuō)話會(huì)跟口型對(duì)不上间狂;
最后把同步的音頻數(shù)據(jù)送到耳機(jī)或外放攻泼,視頻數(shù)據(jù)送到屏幕上顯示。
了解了播放器的播放流程后鉴象,我們可以優(yōu)化以下幾點(diǎn):
首屏?xí)r間優(yōu)化
從步驟2入手忙菠,通過(guò)預(yù)設(shè)解碼器類型,省去探測(cè)文件類型時(shí)間纺弊;
從步驟5入手牛欢,縮小視頻數(shù)據(jù)探測(cè)范圍,同時(shí)也意味著減少了需要下載的數(shù)據(jù)量淆游,特別是在網(wǎng)絡(luò)不好的時(shí)候傍睹,減少下載的數(shù)據(jù)量能為啟動(dòng)播放節(jié)省大量的時(shí)間,當(dāng)檢測(cè)到I幀數(shù)據(jù)后就立馬返回并進(jìn)入解碼環(huán)節(jié)犹菱。
推流:
經(jīng)過(guò)輸出設(shè)備(AVCaptureVideoDataOutput)得到原始的采樣數(shù)據(jù)--視頻數(shù)據(jù)(YUV)和音頻數(shù)據(jù)(AAC)拾稳;
使用硬編碼(對(duì)應(yīng)系統(tǒng)的API)或軟編碼(FFMpeg)來(lái)編碼壓縮音視頻數(shù)據(jù);
分別得到已編碼的H.264視頻數(shù)據(jù)和AAC音頻數(shù)據(jù)腊脱;
根據(jù)不同的封裝格式(如FLV访得、TS、MPEG-TS)陕凹;
使用HLS協(xié)議的時(shí)候加上這一步(HLS分段生成策略及m3u8索引文件)
通過(guò)流上傳到服務(wù)器悍抑;
服務(wù)器進(jìn)行相關(guān)協(xié)議的分發(fā)
推流步驟說(shuō)明:很容易看出推流跟播放其實(shí)是逆向的,具體流程就不多說(shuō)了杜耙。
- 優(yōu)化一:適當(dāng)?shù)腝os(Quality of Service搜骡,服務(wù)質(zhì)量)策略。
推流端會(huì)根據(jù)當(dāng)前上行網(wǎng)絡(luò)情況控制音視頻數(shù)據(jù)發(fā)包和編碼佑女,在網(wǎng)絡(luò)較差的情況下浆兰,音視頻數(shù)據(jù)發(fā)送不出去磕仅,造成數(shù)據(jù)滯留在本地,這時(shí)簸呈,會(huì)停掉編碼器防止發(fā)送數(shù)據(jù)進(jìn)一步滯留榕订,同時(shí)會(huì)根據(jù)網(wǎng)絡(luò)情況選擇合適的策略控制音視頻發(fā)送。
比如網(wǎng)絡(luò)很差的情況下蜕便,推流端會(huì)優(yōu)先發(fā)送音頻數(shù)據(jù)劫恒,保證用戶能聽(tīng)到聲音,并在一定間隔內(nèi)發(fā)關(guān)鍵幀數(shù)據(jù)轿腺,保證用戶在一定時(shí)間間隔之后能看到一些畫(huà)面的變化两嘴。
- 優(yōu)化二:合理的關(guān)鍵幀配置。
合理控制關(guān)鍵幀發(fā)送間隔(建議2秒或1秒一個(gè))族壳,這樣可以減少后端處理過(guò)程憔辫,為后端的緩沖區(qū)設(shè)置更小創(chuàng)造條件。
軟硬編解選擇
網(wǎng)上有不少關(guān)于選擇軟解還是硬解的分析文章仿荆,這里也介紹一些經(jīng)驗(yàn)贰您,但根本問(wèn)題是,沒(méi)有一個(gè)通用方案能最優(yōu)適配所有操作系統(tǒng)和機(jī)型拢操。
推流編碼: 推薦Andorid4.3(API18)或以上使用硬編锦亦,以下版本使用軟編;iOS使用全硬編方案令境;
播放解碼:Andorid杠园、iOS播放器都使用軟解碼方案,經(jīng)過(guò)我們和大量客戶的測(cè)試以及總結(jié)舔庶,雖然犧牲了功耗抛蚁,但是在部分細(xì)節(jié)方面表現(xiàn)會(huì)較優(yōu),且可控性強(qiáng)惕橙,兼容性也強(qiáng)瞧甩,出錯(cuò)情況少,推薦使用吕漂。
附軟硬編解碼優(yōu)缺點(diǎn)對(duì)比:
采集
采集的步驟:
- 創(chuàng)建AVCaptureSession
- 輸入對(duì)象AVCaptureDeviceInput
- 輸出對(duì)象AVCaptureVideoDataOutput
- 輸出代理方法captureOutput(_:didOutputSampleBuffer:fromConnection:)
相關(guān)內(nèi)容
- 采集數(shù)據(jù):iOS平臺(tái)上采集音視頻數(shù)據(jù)亲配,需要使用AVFoundation.Framework框架,從captureSession會(huì)話的回調(diào)中獲取音頻惶凝,視頻數(shù)據(jù)吼虎。
- 傳輸層協(xié)議:主要采用RTMP協(xié)議居多(默認(rèn)端口1935,采用TCP協(xié)議)苍鲜,也有部分使用HLS協(xié)議
- 音/視頻編碼解碼:FFMpege編碼解碼
- 視頻編碼格式:H.265思灰、H.264、MPEG-4等混滔,封裝容器有TS洒疚、MKV歹颓、AVI、MP4等
- 音頻編碼格式:G.711μ油湖、AAC巍扛、Opus等,封裝有MP3乏德、OGG撤奸、AAC等
- 渲染工具:采用OpenGL渲染YUV數(shù)據(jù),呈現(xiàn)視頻畫(huà)面喊括。將PCM送入設(shè)備的硬件資源播放胧瓜,產(chǎn)生聲音。iOS播放流式音頻郑什,使用Audio Queue 的方式府喳,即,利用AudioToolbox.Framework 框架蘑拯。
參考技術(shù)文章
http://www.reibang.com/p/10b338e56800
快速集成iOS基于RTMP的視頻推流
雷霄驊(leixiaohua1020)的專欄
參考框架
RTMP推流
LiveVideoCoreSDK
FLVKit
PLMediaStreamingKit
直播播放器
ijkplayer
美顏
GPUImage