iOS短視頻SDK中的AVFoundation實踐

1. 前言

iOS中你雌,AVFoundation是一個集視頻播放器联、播放緩存、視頻轉(zhuǎn)碼婿崭、圖層混合拨拓、混音、變調(diào)氓栈、變速等諸多功能的多媒體庫渣磷,在iOS短視頻SDK中,使用到了
AVFoundation的硬解和播放模塊授瘦,以下將介紹短視頻SDK中對這些模塊的應(yīng)用實踐和遇到的問題以及解決方案醋界。

2. 基本概念

  1. 解碼:將壓縮數(shù)據(jù)還原為未壓縮數(shù)據(jù)竟宋,關(guān)于利用VideoToolbox硬解H.264可以參考這篇文章
  2. 編碼:將原始數(shù)據(jù)進行壓縮生成另一種格式形纺;
  3. 轉(zhuǎn)碼:將已壓縮的視頻碼流轉(zhuǎn)換成另一種視頻碼流丘侠;

3. 問題及解決方案

AVFoundation中提供了多層可用于播放的組件,例如AVPlayerViewControllerAVPlayer逐样,這些系統(tǒng)組件可以滿足視頻的基本播放功能蜗字,在項目中,我們采用了AVPlayer進行播放預(yù)覽脂新,但使用中遇到不少問題挪捕,后改用AVAssetReader做解碼,對解碼后的數(shù)據(jù)進行處理后做預(yù)覽争便。下面介紹播放預(yù)覽中系統(tǒng)組件的一些使用注意事項级零。

3.1 MediaToolBox使用注意事項

在使用AVPlayer做音頻變調(diào)、混響的預(yù)覽時滞乙,用到了MTAudioProcessingTap 妄讯,該類的所有回調(diào)是以函數(shù)指針存放于結(jié)構(gòu)體中:

typedef struct {
    int version;
    void* CM_NULLABLE clientInfo;
    MTAudioProcessingTapInitCallback CM_NULLABLE init;
    MTAudioProcessingTapFinalizeCallback CM_NULLABLE finalize;
    MTAudioProcessingTapPrepareCallback CM_NULLABLE prepare;
    MTAudioProcessingTapUnprepareCallback CM_NULLABLE unprepare;
    MTAudioProcessingTapProcessCallback CM_NONNULL process;
} MTAudioProcessingTapCallbacks;

OCC函數(shù)交互時,我們會在clientInfo變量中存放OC對象酷宵,在C語言函數(shù)的回調(diào)方法里使用__bridge的方式獲取OC對象。
當(dāng)OC對象釋放時躬窜,MTAudioProcessingTapcallback才返回浇垦,在回調(diào)的C函數(shù)里面獲取到的clientInfo就是野指針,crash就產(chǎn)生了荣挨。
clientInfo指向的對象被釋放時男韧,需要保存已釋放的狀態(tài),在回調(diào)里首先檢查該狀態(tài)默垄,判斷當(dāng)前對象是否釋放此虑,以避免造成野指針訪問。

3.2 AVAssetReader使用注意事項

AVAssetReader可用于讀取AVAsset媒體資源的軌道數(shù)據(jù)口锭,支持解碼朦前、格式轉(zhuǎn)換、mix等操作鹃操。但注意事項也不少:

  1. AVAssetReader不可重復(fù)調(diào)用startReading韭寸,當(dāng)出現(xiàn)failcomplete狀態(tài)后也不能重復(fù)調(diào)用;
  2. AVAssetReader做解碼的時候荆隘,切換后臺/來電會失去GPU權(quán)限恩伺,造成解碼失敗,AVAssetReader也變成fail狀態(tài)椰拒。異常打斷結(jié)束后晶渠,需要重啟reader凰荚,并確定reader重啟成功,否則需要retry褒脯;
  3. AVAssetReader啟動后調(diào)用seek時便瑟,并不會很精準(zhǔn)seek到目標(biāo)點,一般會比指定的時間早幾幀(AVPlayer的精準(zhǔn)seek憨颠,也有同樣的問題)胳徽,需要記錄seek的目標(biāo)時間點,如果seek后讀取出的buffer攜帶的 ptsseek的目標(biāo)時間小爽彤,需要拋棄該數(shù)據(jù)养盗;
  4. AVAssetReaderOutput不可重復(fù)添加,也不可在AssetReader調(diào)用startReading后添加适篙;
  5. AVAssetReaderOutput不可在未添加前調(diào)用 copyNextSampleBuffer往核;
  6. AVAssetReader釋放資源時,需要調(diào)用cancelReading來釋放 AVAsset資源嚷节,否則會出現(xiàn)fetch不到該資源的問題聂儒;
  7. AVAssetReader對文件視頻首幀非關(guān)鍵幀的視頻會解碼失敗,這說明AVAssetReader對文件格式要求很嚴格硫痰,不夠魯棒衩婚;
  8. AVAssetReader不支持m3u8文件,回出現(xiàn)讀取不到軌道信息的情況效斑,如果需要解析HLS視頻非春,需要使用FFMpeg進行解封裝和VideoToolBox解碼;
  9. AVAssetReader內(nèi)部創(chuàng)建了解碼器和緩存列表缓屠,但解碼器數(shù)量是有限制的(同AVPlayerItem)奇昙。

當(dāng)然AVAssetReader 只做demux,不做解碼工作時可以避免上述一些問題敌完,但需要自行使用VideoToolBox進行硬解储耐,pixel format轉(zhuǎn)換也得單獨處理。

3.3 AudioQueue使用注意事項

AudioQueue可進行音頻播放滨溉,開播前會預(yù)緩存一定數(shù)量的buffer數(shù)據(jù)什湘。在allocate buffer時,需要設(shè)置buffer的大小业踏,該大小需要根據(jù)audio data format來設(shè)置禽炬,正常播放沒有問題,但播放速度非1.0的情況下勤家,buffer太小時或太大腹尖,都會有異常的問題,需要考慮的有mBytesPerFramemChannelsPerFrame以及mSampleRate热幔。

而解碼后得到的音頻frame buffer中采樣數(shù)并不固定乐设,當(dāng)多音頻播放時,需要考慮是否存在audio data format變化的問題绎巨。
當(dāng)然近尚,每次切換音頻,重啟AudioQueue也是一種方案场勤。

AudioQueue的數(shù)據(jù)獲取采用的是pull模式戈锻。在
AudioQueueOutputCallback的回調(diào)中,需要Enqueue待緩存的AudioQueueBufferRef和媳。
當(dāng)Enqueue的時候格遭,可能會觸發(fā)AudioQueueStop或者AudioQueueDispose,盡管inImmediate設(shè)置為true留瞳,也會造成假死一段時間拒迅,需要在 AudioQueueOutputCallback的回調(diào)函數(shù)中先檢查狀態(tài)是否需要停止,如果為正常狀態(tài)她倘,則Enqueue buffer璧微,否則flush掉當(dāng)前 AudioQueue的數(shù)據(jù)。

4. 結(jié)語

以上是iOS短視頻使用到的AVFoundation組件時遇到的問題硬梁,在 金山云多媒體SDK中硬編直接使用VideoToolBox做編碼前硫,避免了一些AVAssetWriter的問題,此處未做贅述荧止。
以上是遇到的一些問題开瞭,歡迎指正。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罩息,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子个扰,更是在濱河造成了極大的恐慌瓷炮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件递宅,死亡現(xiàn)場離奇詭異娘香,居然都是意外死亡,警方通過查閱死者的電腦和手機办龄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門烘绽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俐填,你說我怎么就攤上這事安接。” “怎么了英融?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵盏檐,是天一觀的道長歇式。 經(jīng)常有香客問我,道長胡野,這世上最難降的妖魔是什么材失? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮硫豆,結(jié)果婚禮上龙巨,老公的妹妹穿的比我還像新娘。我一直安慰自己熊响,他們只是感情好旨别,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耘眨,像睡著了一般昼榛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剔难,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天胆屿,我揣著相機與錄音,去河邊找鬼偶宫。 笑死非迹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纯趋。 我是一名探鬼主播憎兽,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吵冒!你這毒婦竟也來了纯命?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤痹栖,失蹤者是張志新(化名)和其女友劉穎亿汞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揪阿,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡疗我,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了南捂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吴裤。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溺健,靈堂內(nèi)的尸體忽然破棺而出麦牺,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布枕面,位于F島的核電站愿卒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏潮秘。R本人自食惡果不足惜琼开,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枕荞。 院中可真熱鬧柜候,春花似錦、人聲如沸躏精。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矗烛。三九已至辅柴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞭吃,已是汗流浹背碌嘀。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歪架,地道東北人股冗。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像和蚪,于是被迫代替她去往敵國和親止状。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

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