推流,就是將採集到的音頻,視頻數據經過流媒體協議發送到流媒體服務器。git
如今直播應用,採用RTMP協議居多,也有部分使用HLS協議。github
採用RTMP協議,就要看下它與流媒體服務器交互的過程,RTMP協議的默認端口是1935,採用TCP協議。而且須要瞭解FLV的封裝格式。服務器
採用HLS協議,由於涉及到切片,延時會比較大,須要瞭解TS流。框架
作直播,數據的來源不可缺乏,就是採集攝像頭,麥克風的數據。ide
iOS平臺上採集音視頻數據,須要使用AVFoundation.Framework框架,從captureSession會話的回調中獲取音頻,視頻數據。編碼
軟編碼就是利用CPU資源來壓縮音視頻數據,硬編碼與之相反。spa
軟編碼的話,如今普遍採用FFmpeg庫結合編碼庫來實現,FFmpeg+X624來編碼視頻數據YUV/RGB輸出H264數據,
FFmpeg+fdk_aac來編碼音頻數據PCM輸出AAC數據。視頻
將音頻,視頻打包成packet。資源
根據所選流媒體協議,發送相應指令鏈接服務器,鏈接服務器成功後,就能夠發送packet數據了。開發
拉流,就是從流媒體服務器獲取音頻,視頻數據。
播放器端根據URL解析所用的流媒體協議(RTMP,HLS)。
解封裝,就是demux的過程,從容器格式(FLV,TS)中,分離出音視頻數據。
解碼,就是把獲取到的數據解壓縮,恢復成原始數據。解碼就是將H264變成YUV,AAC變成PCM。
解碼能夠使用軟解碼,硬解碼。
軟解碼就是利用CPU資源去解壓縮數據,採用的方式是FFmpeg解碼。
硬解碼,對於iOS平臺來講,能夠使用VideoToolbox.Framework(該框架只能在iOS 8.0及以上系統使用)
硬解碼視頻數據。Android平臺上,能夠使用MediaCodec來硬解碼視頻數據。
採用OpenGL渲染YUV數據,呈現視頻畫面。將PCM送入設備的硬件資源播放,產生聲音。
iOS播放流式音頻,使用Audio Queue 的方式,即,利用AudioToolbox.Framework 框架。