IOS硬編碼

1. IOS硬編碼步驟

編碼步驟:
  ? 創(chuàng)建編碼器啄踊,調(diào)用接口 VTCompressionSessionCreate
  ? 設(shè)置編碼器屬性:幀率忧设、碼率、GOP颠通、分辨率址晕、像素格式,調(diào)用接口 VTSessionSetProperty
  ? 設(shè)置完屬性準(zhǔn)備編碼顿锰,調(diào)用接口VTCompressionSessionPrepareToEncodeFrames
  ? 編碼谨垃,調(diào)用接口VTCompressionSessionEncodeFrame輸入采集到的視頻數(shù)據(jù)
  ? 獲取到編碼后的數(shù)據(jù)并進(jìn)行處理
  ? 停止編碼器,調(diào)用接口VTCompressionSessionCompleteFrames
  ? 銷毀編碼器硼控,調(diào)用接口VTCompressionSessionInvalidate

2. 關(guān)鍵接口說(shuō)明

2.1 碼率控制

??碼率直接影響到圖像的質(zhì)量及大小刘陶,故碼率的設(shè)置是至關(guān)重要的。H264有以下4種碼率控制方法:
a. CBR(Constant Bit Rate)是以恒定比特率方式進(jìn)行編碼牢撼,有Motion發(fā)生時(shí)匙隔,由于碼率恒定,只能通過(guò)增大QP來(lái)減少碼字大小熏版,圖像質(zhì)量變差纷责,當(dāng)場(chǎng)景靜止時(shí),圖像質(zhì)量又變好撼短,因此圖像質(zhì)量不穩(wěn)定再膳。這種算法優(yōu)先考慮碼率(帶寬)。

b. VBR(Variable Bit Rate)動(dòng)態(tài)比特率曲横,其碼率可以隨著圖像的復(fù)雜程度的不同而變化喂柒,因此其編碼效率比較高,Motion發(fā)生時(shí)禾嫉,馬賽克很少灾杰。碼率控制算法根據(jù)圖像內(nèi)容確定使用的比特率,圖像內(nèi)容比較簡(jiǎn)單則分配較少的碼率(似乎碼字更合適)夭织,圖像內(nèi)容復(fù)雜則分配較多的碼字吭露,這樣既保證了質(zhì)量,又兼顧帶寬限制尊惰。這種算法優(yōu)先考慮圖像質(zhì)量讲竿。

c. CVBR(Constrained VariableBit Rate),這樣翻譯成中文就比較難聽(tīng)了,它是VBR的一種改進(jìn)方法弄屡。但是Constrained又體現(xiàn)在什么地方呢题禀?這種算法對(duì)應(yīng)的Maximum bitRate恒定或者Average BitRate恒定。這種方法的兼顧了以上兩種方法的優(yōu)點(diǎn):在圖像內(nèi)容靜止時(shí)膀捷,節(jié)省帶寬迈嘹,有Motion發(fā)生時(shí),利用前期節(jié)省的帶寬來(lái)盡可能的提高圖像質(zhì)量,達(dá)到同時(shí)兼顧帶寬和圖像質(zhì)量的目的秀仲。

d. ABR (Average Bit Rate) 在一定的時(shí)間范圍內(nèi)達(dá)到設(shè)定的碼率融痛,但是局部碼率峰值可以超過(guò)設(shè)定的碼率,平均碼率恒定神僵⊙闼ⅲ可以作為VBR和CBR的一種折中選擇

??VideoToolBox框架只支持ABR模式保礼。設(shè)置平均碼率是一個(gè)柔性的指標(biāo)沛励,實(shí)際輸出碼率允許在其上下浮動(dòng)。kVTCompressionPropertyKey_DataRateLimits 用來(lái)設(shè)置硬性碼率限制炮障,別看這段代碼很冗長(zhǎng)目派,實(shí)際做的就是設(shè)置碼率的硬性限制是每秒碼率不超過(guò)平均碼率的 1.5 倍,設(shè)置接口如下所示:

//設(shè)置平均碼率胁赢,單位為bps企蹭,碼率會(huì)上下浮動(dòng)
VTStatus status = VTSessionSetProperty_int(_encoderSession,
                                               kVTCompressionPropertyKey_AverageBitRate,
                                               _bitrate * 1024 * 1.0);

int bytesLimit = _bitrate * 1024 * GopValue / 8;
int secondLimit = GopValue;
CFNumberRef n1 = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &bytesLimit);
CFNumberRef n2 = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &secondLimit);
const void *values[] = {n1, n2};
CFArrayRef dataRateLimits = CFArrayCreate(kCFAllocatorDefault,
                                              (const void**)&values,
                                              sizeof(values)/sizeof(values[0]),
                                              NULL);
status = VTSessionSetProperty(_encoderSession, kVTCompressionPropertyKey_DataRateLimits,                                        dataRateLimits);
    
CFRelease(dataRateLimits);
CFRelease(n1);
CFRelease(n2);

2.2 設(shè)置畫(huà)質(zhì)

a. BP(Baseline Profile):基本畫(huà)質(zhì)。
??支持I/P 幀徘键,只支持無(wú)交錯(cuò)(Progressive)和CAVLC练对;主要應(yīng)用:可視電話遍蟋,會(huì)議電視吹害,和無(wú)線通訊等實(shí)時(shí)視頻通訊領(lǐng)域
b. EP(Extended profile):進(jìn)階畫(huà)質(zhì)。
??支持I/P/B/SP/SI 幀虚青,只支持無(wú)交錯(cuò)(Progressive)和CAVLC它呀;
c. 主流畫(huà)質(zhì)。
??提供I/P/B 幀棒厘,支持無(wú)交錯(cuò)(Progressive)和交錯(cuò)(Interlaced)蹄葱,也支持CAVLC 和CABAC 的支持祝峻;主要應(yīng)用:數(shù)字廣播電視和數(shù)字視頻存儲(chǔ)
d. 高級(jí)畫(huà)質(zhì)。
??在main Profile 的基礎(chǔ)上增加了8×8內(nèi)部預(yù)測(cè)、自定義量化情萤、 無(wú)損視頻編碼和更多的YUV 格式;應(yīng)用于廣電和存儲(chǔ)領(lǐng)域

//設(shè)置畫(huà)質(zhì)
status = VTSessionSetProperty(encoder->_encoderSession,
                                      kVTCompressionPropertyKey_ProfileLevel,
                                      kVTProfileLevel_H264_High_AutoLevel);

IOS 常用畫(huà)質(zhì)配置:
實(shí)時(shí)直播:
??低清Baseline Level 1.3
??標(biāo)清Baseline Level 3
??半高清Baseline Level 3.1
??全高清Baseline Level 4.1
存儲(chǔ)媒體:
??低清 Main Level 1.3
??標(biāo)清 Main Level 3
??半高清 Main Level 3.1
??全高清 Main Level 4.1
高清存儲(chǔ):
??半高清 High Level 3.1
??全高清 High Level 4.1

2.3 配置I幀間隔,GOP

// 設(shè)置一個(gè)GOP多少幀
VTSessionSetProperty_int(encoder->_encoderSession,
                                          kVTCompressionPropertyKey_MaxKeyFrameInterval,
                                          frameRate * kGOPIntervalInSeconds);
//SetVTSessionProperty(_compressionSession,
                     kVTCompressionPropertyKey_MaxKeyFrameInterval, 180);
// 設(shè)置3s必須有一個(gè)關(guān)鍵幀
//SetVTSessionProperty(_compressionSession,
                     kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration,
                     3);

2.4 配置工作模式

??設(shè)置編碼器的工作模式是實(shí)時(shí)還是離線饵较,實(shí)時(shí)會(huì)編得快些玲销,延遲更低,但壓縮效率會(huì)差一些支救,離線則編得慢些抢野,延遲更大,但壓縮效率會(huì)更高各墨。本地錄制視頻文件可以使用離線模式指孤,RTC 場(chǎng)景下為了降低延遲,則需要使用實(shí)時(shí)模式了。

VTSessionSetProperty(encoder->_encoderSession,
                             kVTCompressionPropertyKey_RealTime,
                             kCFBooleanTrue);

2.5 配置是否產(chǎn)生B幀

??High profile 支持 B 幀, 但是 B 幀會(huì)加大延遲恃轩。

VTSessionSetProperty(encoder->_encoderSession,
                             kVTCompressionPropertyKey_AllowFrameReordering,
                             kEnableBFrame ? kCFBooleanTrue : kCFBooleanFalse);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末结洼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子叉跛,更是在濱河造成了極大的恐慌补君,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昧互,死亡現(xiàn)場(chǎng)離奇詭異挽铁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)敞掘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)叽掘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人玖雁,你說(shuō)我怎么就攤上這事更扁。” “怎么了赫冬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵浓镜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我劲厌,道長(zhǎng)膛薛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任补鼻,我火速辦了婚禮哄啄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘风范。我一直安慰自己咨跌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布硼婿。 她就那樣靜靜地躺著锌半,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寇漫。 梳的紋絲不亂的頭發(fā)上刊殉,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音猪腕,去河邊找鬼冗澈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛陋葡,可吹牛的內(nèi)容都是我干的亚亲。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捌归!你這毒婦竟也來(lái)了肛响?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惜索,失蹤者是張志新(化名)和其女友劉穎特笋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體巾兆,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猎物,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了角塑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔫磨。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖圃伶,靈堂內(nèi)的尸體忽然破棺而出堤如,到底是詐尸還是另有隱情,我是刑警寧澤窒朋,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布搀罢,位于F島的核電站,受9級(jí)特大地震影響侥猩,放射性物質(zhì)發(fā)生泄漏榔至。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一拭宁、第九天 我趴在偏房一處隱蔽的房頂上張望洛退。 院中可真熱鬧瓣俯,春花似錦杰标、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至驼仪,卻和暖如春掸犬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绪爸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工湾碎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奠货。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓介褥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柔滔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 前言 系列文章:《iOS視頻開(kāi)發(fā)(一):視頻采集》《iOS視頻開(kāi)發(fā)(二):視頻H264硬編碼》《iOS視頻開(kāi)發(fā)(三...
    GenoChen閱讀 19,085評(píng)論 11 60
  • iOS硬編碼實(shí)現(xiàn) 前言 在上一篇中溢陪,我們已經(jīng)知道iOS編碼的一些概念知識(shí),從現(xiàn)在開(kāi)始睛廊,我們可以正式對(duì)采集到的視頻進(jìn)...
    coderwhy閱讀 5,444評(píng)論 4 8
  • 前言 這里我們重點(diǎn)介紹硬編碼的使用方式形真,也就是VideoToolBox框架的使用 編碼的流程:采集--> 獲取到視...
    CoreCoder閱讀 561評(píng)論 0 1
  • GOP(Group of picture) 關(guān)鍵幀的周期,也就是兩個(gè)IDR幀之間的距離超全,一個(gè)幀組的最大幀數(shù)咆霜,一般而...
    Caiaolun閱讀 4,775評(píng)論 0 3
  • FFmpeg X264編碼參數(shù) 目錄 碼率控制 1 X264的preset和tune 2 編碼延時(shí)建議...
    古則閱讀 29,823評(píng)論 1 15