本文根據(jù)又拍云內(nèi)部技術(shù)分享會的演講整理而成椭员,主要內(nèi)容:圖像和音頻數(shù)據(jù)采集、處理笛园;音視頻編碼隘击、封包發(fā)送、云端(服務端)及播放器研铆。
直播無疑是2016年大熱話題埋同,去年4月份,又拍云基于內(nèi)容分發(fā)網(wǎng)絡(luò)推出一站式直播解決方案棵红,包括實時轉(zhuǎn)碼凶赁、實時錄制、分發(fā)加速逆甜、水印虱肄、截圖、秒級禁播交煞、延時直播等功能咏窿。本文希望系統(tǒng)介紹直播各個環(huán)節(jié),幫助視頻直播創(chuàng)業(yè)者們更全面素征、深入地了解直播技術(shù)集嵌,更好地進行技術(shù)選型。
△?直播流程圖
一御毅、采集音視頻數(shù)據(jù)
采集攝像頭和麥克風的數(shù)據(jù)根欧。
圖像采集
圖像采集和編碼面臨的主要挑戰(zhàn)在于:設(shè)備兼容性差、卡頓敏感以及各種對圖像的處理操作如美顏和水印等亚享。
圖像采集設(shè)置前置攝像頭咽块、后置攝像頭绘面,并配置采集的參數(shù)欺税、圖像數(shù)據(jù)的長寬、fps揭璃、輸出的方向晚凿、橫屏豎屏等,然后從回調(diào)中取到數(shù)據(jù)瘦馍。處理如下:
_videoCamera.outputImageOrientation = videoCameraOrientation;
// 設(shè)置拍攝幀頻 _videoCamera.frameRate = _fps
音頻采集
音頻采集和編碼主要面臨的挑戰(zhàn)在于:噪聲消除(Denoise)歼秽、回聲消除(AEC)算法等。
前期不需要音頻數(shù)據(jù)處理需求的時候情组, 只需配置音頻采集的采樣頻率燥筷、采樣精度和聲道箩祥,處理如下:
_audioFormat0.mSampleRate = 44100.00;
_audioFormat0.mFormatID = kAudioFormatLinearPCM;
_audioFormat0.mBitsPerChannel = 16;
二、數(shù)據(jù)處理
音頻處理中具體包含混音肆氓、降噪和聲音特效等處理袍祖。視頻處理中包含美顏、水印谢揪、以及各種自定義濾鏡等處理蕉陋。
音頻處理是直播難點之一,尤其主播離手機有一段距離拨扶,直播環(huán)境會有噪音凳鬓,所以直播的音頻處理是整體降噪的過程。增益降噪等處理可直接從 speex 項目中抽出來的聲音處理代碼患民,然后調(diào)用缩举、處理。如有類似在直播的時候播放背景音樂的混音需求匹颤,就需要使用 Audio Unit 來實現(xiàn)音頻數(shù)據(jù)的混音蚁孔,而還需要將混音的背景音樂轉(zhuǎn)成 PCM 數(shù)據(jù),拷貝一份送入混音惋嚎,原來的數(shù)據(jù)送入播放器杠氢。
濾鏡、美顏功能是直播標配另伍,如果需要美白鼻百、水印、裁剪等處理效果摆尝,就必須處理拿到的buffer, 這個時候還要考慮到拿到的數(shù)據(jù)是YUV 還是 RGB温艇。iOS 上是不能對 YUV 格式直接進行美顏處理,只能是 RGB 格式堕汞∩装可選擇使用 GPUImage 庫,調(diào)用 GPUImage 來進行采集和美白讯检、水印琐鲁、裁剪的處理,然后取出來進行編碼上傳人灼,并顯示在預覽畫面上围段。
三、音視頻編碼
視頻編碼的意義
原始視頻數(shù)據(jù)存儲空間大投放,一個 1080P 的 7 s 視頻需要 817 MB
原始視頻數(shù)據(jù)傳輸占用帶寬大奈泪,10 Mbps 的帶寬傳輸上述 7 s 視頻需要 11 分鐘
而經(jīng)過 H.264 編碼壓縮之后,視頻大小只有 708 k ,10 Mbps 的帶寬僅僅需要 500 ms 涝桅,可以滿足實時傳輸?shù)男枨蟀葑耍詮囊曨l采集傳感器采集來的原始視頻勢必要經(jīng)過視頻編碼。
編碼首先要開啟編碼器冯遂,軟編碼就是利用CPU資源來壓縮音視頻數(shù)據(jù)砾隅,硬編碼與之相反。
軟編碼: 現(xiàn)在廣泛采用FFmpeg庫結(jié)合編碼庫來實現(xiàn)债蜜,F(xiàn)Fmpeg + x264 來編碼視頻數(shù)據(jù)YUV/RGB輸出H264數(shù)據(jù)晴埂, FFmpeg+fdk_aac 來編碼音頻數(shù)據(jù)PCM輸出AAC數(shù)據(jù)。
硬編碼: iOS 8之后開放了硬解碼和硬編碼AP寻定,所以基本上都是選擇VideoToolBox 和 AudioToolBox 進行圖像和音頻的硬編碼儒洛。
四、封包發(fā)送
將音頻狼速,視頻打包成packet琅锻。
又拍云播放器采用 FFMPEG 進行數(shù)據(jù)的接收,推流端默認使用 FFMPEG 進行數(shù)據(jù)的封包發(fā)送向胡。
相對來說恼蓬,封包最主要注意的一個點是時間戳。因為用的AVPacket封包僵芹,每個包都會有一個DST(Decode Time Stamp)处硬、PST (Presentation Time Stamp)參數(shù),從字面上可以理解拇派,就是解碼時間和顯示時間荷辕,在沒有B幀存在的情況下DTS的順序和PTS的順序應該是一樣的。
這塊還涉及到重連和丟幀件豌,用戶的網(wǎng)絡(luò)情況波動斷開了,會進行重連疮方。重連失敗之后才會發(fā)送失敗回調(diào)。丟幀是一個弱網(wǎng)情況的策略茧彤,根據(jù)音視頻數(shù)據(jù)的緩沖區(qū)大小來判斷是否丟幀,丟幀會優(yōu)先丟非關(guān)鍵幀,保留關(guān)鍵幀骡显,而一旦需要丟關(guān)鍵幀的時,關(guān)鍵幀后的非關(guān)鍵幀也會一起丟掉直到下一個關(guān)鍵幀.來保證畫面不會花屏。
五曾掂、云端(服務端)
對比兩種推送協(xié)議在直播領(lǐng)域的現(xiàn)狀和優(yōu)缺點惫谤。
RTMP
HLS
1、RTMP
RTMP (Real Time Messaging Protocol)實時消息傳輸協(xié)議遭殉,該協(xié)議基于 TCP石挂,是一個協(xié)議族,包括 RTMP 基本協(xié)議及 RTMPT/RTMPS/RTMPE 等多種變種险污。RTMP 是一種設(shè)計用來進行實時數(shù)據(jù)通信的網(wǎng)絡(luò)協(xié)議,主要用來在 Flash/AIR 平臺和支持 RTMP 協(xié)議的流媒體/交互服務器之間進行音視頻和數(shù)據(jù)通信。支持該協(xié)議的軟件包括 Adobe Media Server/Ultrant Media Server/red5 等蛔糯。
RTMP 是目前主流的流媒體傳輸協(xié)議拯腮,廣泛用于直播領(lǐng)域,可以說市面上絕大多數(shù)的直播產(chǎn)品都采用了這個協(xié)議蚁飒。
優(yōu)點
CDN 支持良好动壤,主流的 CDN 廠商都支持
協(xié)議簡單,在各平臺上實現(xiàn)容易
缺點
基于 TCP 淮逻,傳輸成本高琼懊,在弱網(wǎng)環(huán)境丟包率高的情況下問題顯著
不支持瀏覽器推送
Adobe 私有協(xié)議,Adobe 已經(jīng)不再更新
2爬早、HLS
HLS(HTTP Live Streaming)協(xié)議哼丈,是蘋果公司實現(xiàn)的基于HTTP的流媒體傳輸協(xié)議,可實現(xiàn)流媒體的直播和點播筛严。
HLS主要應用在iOS系統(tǒng)醉旦,為iOS設(shè)備(如iPhone、iPad)提供音視頻直播和點播方案桨啃。HLS點播车胡,基本上就是常見的分段HTTP點播,不同在于照瘾,它的分段非常小匈棘。
優(yōu)點
不用考慮防火墻或者代理的問題
分段文件時長很短,客戶端可以很快的選擇和切換碼率析命,以適應不同帶寬條件下的播放羹饰。
缺點
延遲一般會高于普通的流媒體直播協(xié)議
對直播延遲比較敏感的服務請慎用HLS。
根據(jù)所選流媒體協(xié)議碳却,發(fā)送相應指令連接服務器队秩,連接服務器成功后,就可以發(fā)送packet數(shù)據(jù)了昼浦。 又拍云采用用的是 RTMP馍资,服務端會進行轉(zhuǎn)碼、錄制关噪、轉(zhuǎn) HLS 的操作鸟蟹。
六、播放器
播放器主要負責拉流使兔、解碼建钥、播放。
拉流端
拉流虐沥,就是從流媒體服務器獲取音頻熊经、視頻數(shù)據(jù)泽艘。
1、解析協(xié)議
播放器端根據(jù)URL解析所用的流媒體協(xié)議(RTMP镐依,HLS)匹涮。
2、解封裝
解封裝槐壳,就是demux的過程然低,從容器格式(FLV,TS)中务唐,分離出音視頻數(shù)據(jù)雳攘。
3、解碼
解碼枫笛,就是把獲取到的數(shù)據(jù)解壓縮吨灭,恢復成原始數(shù)據(jù)。解碼就是將H264變成YUV崇堰,AAC變成PCM沃于。解碼可以使用軟解碼,硬解碼海诲。
軟解碼就是利用CPU資源去解壓縮數(shù)據(jù)繁莹,采用的方式是FFmpeg解碼。
硬解碼特幔,對于iOS平臺來說咨演,可以使用VideoToolbox.Framework(該框架只能在iOS 8.0及以上系統(tǒng)使用) 硬解碼視頻數(shù)據(jù)。Android平臺上蚯斯,可以使用MediaCodec來硬解碼視頻數(shù)據(jù)薄风。
4、渲染數(shù)據(jù)
采用OpenGL渲染YUV數(shù)據(jù)拍嵌,呈現(xiàn)視頻畫面遭赂。將PCM送入設(shè)備的硬件資源播放,產(chǎn)生聲音横辆。
iOS播放流式音頻撇他,使用Audio Queue 的方式,即利用AudioToolbox.Framework 框架狈蚤。