SCRecorder錄制視頻導(dǎo)出時(shí)間過(guò)長(zhǎng)的優(yōu)化

SCRecorder錄制視頻導(dǎo)出時(shí)間過(guò)長(zhǎng)的優(yōu)化

IOS視頻錄制 AVFoundation SCRecorder[1]

遇到問(wèn)題

在項(xiàng)目中需要錄制視頻,為圖方便使用SCRecorder第三方庫(kù)進(jìn)行開發(fā)驱富,誰(shuí)知遇到的坑還是挺多锚赤,在保存視頻的時(shí)候遇到導(dǎo)出視頻時(shí)間過(guò)長(zhǎng)的問(wèn)題,錄制完成后還需要導(dǎo)出視頻,估計(jì)在導(dǎo)出時(shí)做了視頻轉(zhuǎn)碼和壓縮等工作褐鸥,10分鐘視頻要等個(gè)1分鐘實(shí)在讓人抓狂线脚,代碼如下:

// Merge all the segments into one file using an AVAssetExportSession
[recordSession mergeSegmentsUsingPreset:AVAssetExportPresetHighestQuality completionHandler:^(NSURL *url, NSError *error) {
    if (error == nil) {
        // Easily save to camera roll
        [url saveToCameraRollWithCompletion:^(NSString *path, NSError *saveError) {

        }];
    } else {
        NSLog(@"Bad things happened: %@", error);
    }
}];

解決方案1——使用系統(tǒng)框架AVFoundation

放棄使用SCRecorder,使用IOS系統(tǒng)的AVFoundation叫榕,AVCaptureSession[2]和AVCaptureMovieFileOutput[3]可以很方便的錄制出MP4文件浑侥。這種方式在百度上很容易找到,這里不再詳述晰绎。

優(yōu)勢(shì):
高度訂制寓落,SCRecorder也是基于AVFoundation實(shí)現(xiàn)的。

劣勢(shì):
配置AVCaptureSession過(guò)于麻煩荞下,對(duì)于切換攝像頭和閃光燈開關(guān)等設(shè)置不太方便伶选。還有就是已經(jīng)入了SCRecorder的坑,改用AVFoundation來(lái)實(shí)現(xiàn)有點(diǎn)過(guò)于麻煩

解決方案2——啟用SCRecorder的fastRecordMethodEnabled屬性

在查看SCRecorder的文檔時(shí)發(fā)現(xiàn)一個(gè)fastRecordMethodEnabled屬性锄弱,文檔內(nèi)容如下:

Whether the fast recording method should be enabled.
Enabling this will disallow pretty much every features provided
by SCVideoConfiguration and SCAudioConfiguration. It will internally
uses a AVCaptureMovieFileOutput that provides no settings. If you have
some performance issue, you can try enabling this.
Default is NO.

(注:本人英文半瓶子水在這里就不翻譯了,自行度娘)

配置代碼:

SCRecorder *recorder = [SCRecorder recorder];
[recorder startRunning]
recorder.session = [SCRecordSession recordSession];

recorder.fastRecordMethodEnabled = YES;

[recorder record];

然后結(jié)束錄制后在SCRecorderDelegate的- (void)recorder:(SCRecorder *__nonnull)recorder didCompleteSession:(SCRecordSession *__nonnull)session;中就可以拿到錄制好的視頻了考蕾,session中有一個(gè)只讀的outputUrl屬性就是了

有一個(gè)缺點(diǎn)就是路徑還是TM不能自己指定,蛋疼会宪。
后來(lái)研究了下他的源代碼肖卧,可以看到SCRecorder.m里面的定義如下:

    AVCaptureVideoPreviewLayer *_previewLayer;
    AVCaptureSession *_captureSession;
    UIView *_previewView;
    AVCaptureVideoDataOutput *_videoOutput;
    AVCaptureMovieFileOutput *_movieOutput;
    AVCaptureAudioDataOutput *_audioOutput;
    AVCaptureStillImageOutput *_photoOutput;

可以看到里面有一個(gè)_movieOutput的屬性,只要拿到他我們就可以為所欲為啦:(OC動(dòng)態(tài)運(yùn)行機(jī)制閃亮登場(chǎng))

let movieFileOutput = recorder?.value(forKeyPath: "_movieOutput")

后續(xù)可以使用movieFileOutput來(lái)指定存儲(chǔ)路徑啦5Ф臁塞帐!
注:提取_movieOutput的方案沒(méi)有親身實(shí)踐過(guò)拦赠,不知道是否可行!

解決方案3——替換SCRecorder的AVCaptureMovieFileOutput

創(chuàng)建一個(gè)AVCaptureMovieFileOutput然后add到Recorder的AVCatureSession上經(jīng)行錄制,不需要再調(diào)用Recorder的record方法葵姥,但是需要調(diào)用Recorder的startRunning方法荷鼠。不然catureSession的值會(huì)是nil。
直接貼代碼

let movieOutput = AVCaptureMovieFileOutput()
recorder?.captureSession?.addOutput(movieOutput)

movieOutput.startRecording(toOutputFileURL: self.outputUrl, recordingDelegate: self)

so easy榔幸!

第一次寫技術(shù)文檔允乐,有什么疏漏或者不正確的地方還請(qǐng)指出,互相學(xué)習(xí)削咆。


2016年12月16日更新

目前本人已經(jīng)棄用SCRecoder牍疏,改用AVFoundation框架來(lái)實(shí)現(xiàn)錄制視頻功能,直接放出代碼:
github地址


  1. GitHub: SCRecorder ?

  2. Apple官方文檔:AVCaptureSession ?

  3. Apple官方文檔:MovieFileOutpu ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拨齐,一起剝皮案震驚了整個(gè)濱河市鳞陨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瞻惋,老刑警劉巖厦滤,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異歼狼,居然都是意外死亡掏导,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門蹂匹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)碘菜,“玉大人,你說(shuō)我怎么就攤上這事限寞∪绦ィ” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵履植,是天一觀的道長(zhǎng)计雌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)玫霎,這世上最難降的妖魔是什么凿滤? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮庶近,結(jié)果婚禮上翁脆,老公的妹妹穿的比我還像新娘。我一直安慰自己鼻种,他們只是感情好反番,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般罢缸。 火紅的嫁衣襯著肌膚如雪篙贸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天枫疆,我揣著相機(jī)與錄音爵川,去河邊找鬼。 笑死息楔,一個(gè)胖子當(dāng)著我的面吹牛寝贡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播值依,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兔甘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鳞滨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蟆淀,失蹤者是張志新(化名)和其女友劉穎拯啦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熔任,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褒链,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疑苔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甫匹。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惦费,靈堂內(nèi)的尸體忽然破棺而出兵迅,到底是詐尸還是另有隱情,我是刑警寧澤薪贫,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布恍箭,位于F島的核電站,受9級(jí)特大地震影響瞧省,放射性物質(zhì)發(fā)生泄漏扯夭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一鞍匾、第九天 我趴在偏房一處隱蔽的房頂上張望交洗。 院中可真熱鬧,春花似錦橡淑、人聲如沸构拳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)隐圾。三九已至伍掀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暇藏,已是汗流浹背蜜笤。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盐碱,地道東北人把兔。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瓮顽,于是被迫代替她去往敵國(guó)和親县好。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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