ios 音視頻

https://blog.csdn.net/leixiaohua1020/article/details/18893769 學(xué)習(xí)資料

ffmpeg 【em 派個】

FFmpeg是一個跨平臺的視音頻錄制、轉(zhuǎn)換和流媒體化的解決方案。在Windows平臺上,FFmepg的使用非常廣泛,大部分播放器都是基于FFmpeg內(nèi)核的,比如:Mplayer,ffplay,射手播放器,暴風(fēng)影音,KMPlayer,QQ影音等。而且FFmpeg的視音頻編解碼功能非常強大,它幾乎囊括了所有的視音頻編解碼標準,我們熟知的格式轉(zhuǎn)碼工具格式工廠也是基于FFmpeg內(nèi)核的。

介紹:視頻播放過程

首先簡單介紹以下視頻文件的相關(guān)知識。我們平時看到的視頻文件有許多格式,比如 avi, mkv, rmvb, mov, mp4等等,這些被稱為容器Container), 不同的容器格式規(guī)定了其中音視頻數(shù)據(jù)的組織方式(也包括其他數(shù)據(jù),比如字幕等)。容器中一般會封裝有視頻和音頻軌,也稱為視頻流(stream)和音頻 流,播放視頻文件的第一步就是根據(jù)視頻文件的格式,解析(demux)出其中封裝的視頻流、音頻流以及字幕(如果有的話),解析的數(shù)據(jù)讀到包 (packet)中,每個包里保存的是視頻幀(frame)或音頻幀,然后分別對視頻幀和音頻幀調(diào)用相應(yīng)的解碼器(decoder)進行解碼,比如使用 H.264編碼的視頻和MP3編碼的音頻,會相應(yīng)的調(diào)用H.264解碼器和MP3解碼器,解碼之后得到的就是原始的圖像(YUV or RGB)和聲音(PCM)數(shù)據(jù),然后根據(jù)同步好的時間將圖像顯示到屏幕上,將聲音輸出到聲卡,最終就是我們看到的視頻。

AVFrame轉(zhuǎn)UIImage

使用ffmepg解碼視頻一般都是生成AVFrame。然后再轉(zhuǎn)換成RGB或YUV.AVFrame 轉(zhuǎn)RGB:?

把轉(zhuǎn)換出來的UIImage畫到UIImgeView上即可顯示出來!

視頻播放器播放一個互聯(lián)網(wǎng)上的視頻文件,需要經(jīng)過以下幾個步驟:解協(xié)議,解封裝,解碼視音頻,視音頻同步。如果播放本地文件則不需要解協(xié)議,為以下幾個步驟:解封裝,解碼視音頻,視音頻同步。他們的過程如圖所示。

6.1 直播平臺參數(shù)對比

主流互聯(lián)網(wǎng)視音頻平臺直播服務(wù)的參數(shù)對比如表所示:

現(xiàn)有網(wǎng)絡(luò)視音頻平臺參數(shù)對比

名稱協(xié)議封裝視頻編碼音頻編碼播放器

CNTV私有

華數(shù)TV RTMP FLV H.264AACFlash

六間房 RTMP FLV H.264AACFlash

中國教育電視臺 RTMP FLV H.264AACFlash

北廣傳媒移動電視 RTMP FLV H.264AACFlash

上海IPTVRTSP+RTPTS H.264MP2機頂盒

可以看出,直播服務(wù)普遍采用了RTMP作為流媒體協(xié)議,F(xiàn)LV作為封裝格式,H.264作為視頻編碼格式,AAC作為音頻編碼格式。采用RTMP作為直播協(xié)議的好處在于其被Flash播放器支持。而Flash播放器如今已經(jīng)安裝在全球99%的電腦上,并且與瀏覽器結(jié)合的很好。因此這種流媒體直播平臺可以實現(xiàn)“無插件直播”,極大的簡化了客戶端的操作。封裝格式,視頻編碼,音頻編碼方面,無一例外的使用了FLV + H.264 + AAC的組合。FLV是RTMP使用的封裝格式,H.264是當今實際應(yīng)用中編碼效率最高的視頻編碼標準,AAC則是當今實際應(yīng)用中編碼效率最高的音頻編碼標準。視頻播放器方面,都使用了Flash播放器。

二、常用技術(shù)

軟硬解碼.h264:使用iOS8.0之后蘋果開源的VideoToolBox,這正是很多直播軟件最低兼容iOS8的原因了

美顏處理:CPUImage,內(nèi)置150多種濾鏡,功能強大

拉流播放:ijkplayer.framework、VLC

推流RTMP:安裝nginx+rtmp服務(wù)器,ffmpeg推流

視頻錄制:UIImagePiackerController、AVCaptureSession、GPUImageVideoCamera

發(fā)送彈幕:BarrageRenderer第三方庫

即時通訊:XMPP、環(huán)信、融云等

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é)議的流媒體/交互服務(wù)器之間進行音視頻和數(shù)據(jù)通信.

二 RTP/RTCP協(xié)議概述

RTP協(xié)議是Internet上針對流媒體傳輸?shù)幕A(chǔ)協(xié)議,該協(xié)議詳細說明在互聯(lián)網(wǎng)上傳輸音視頻的標準數(shù)據(jù)包格式。RTP協(xié)議本身只保證實時數(shù)據(jù)的傳輸,RTCP協(xié)議則負責(zé)流媒體的傳輸質(zhì)量保證,提供流量控制和擁塞控制等服務(wù)。在RTP會話期間,各參與者周期性彼此發(fā)送RTCP報文。報文中包含各參與者數(shù)據(jù)發(fā)送和接收等統(tǒng)計信息,參與者可以據(jù)此動態(tài)控制流媒體傳輸質(zhì)量。

RFC3550 [1]定義RTP/RTCP協(xié)議的基本內(nèi)容,包括報文格式、傳輸規(guī)則等。除此之外,IETF還定義一系列擴展協(xié)議,包括RTP協(xié)議基于檔次的擴展,和RTCP協(xié)議基于報文類型的擴展,等等。詳細內(nèi)容可參考文獻[2]。

三 WebRTC線程關(guān)系和數(shù)據(jù)流

WebRTC對外提供兩個線程:Signal和Worker,前者負責(zé)信令數(shù)據(jù)的處理和傳輸,后者負責(zé)媒體數(shù)據(jù)的處理和傳輸。在WebRTC內(nèi)部,有一系列線程各司其職,相互協(xié)作完成數(shù)據(jù)流管線。下面以Video數(shù)據(jù)的處理流程為例,說明WebRTC內(nèi)部的線程合作關(guān)系。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容