視頻編輯

視頻特效制作1

很多人覺得視頻這塊比較復(fù)雜,其實(shí)只是假象糠馆,視頻這塊不是復(fù)雜,而是套路多怎憋。

舉個(gè)例子,可能很多人想做個(gè)短視頻錄制又碌,能暫停錄制繼續(xù)錄制的那種九昧,興致勃勃的網(wǎng)上搜代碼,結(jié)果看到

CMFormatDescriptionRef fmt= CMSampleBufferGetFormatDescription(sampleBuffer);

這么一句毕匀,直接就跪了铸鹰。What the hell?

然后能抗住打擊的繼續(xù)往下看的人再看到這么一段皂岔。

if(CMSampleBufferDataIsReady(sampleBuffer)){if(_writer.status ==AVAssetWriterStatusUnknown)? ? {CMTimestartTime =CMSampleBufferGetPresentationTimeStamp(sampleBuffer);? ? ? ? [_writer startWriting];? ? ? ? [_writer startSessionAtSourceTime:startTime];? ? }if(_writer.status ==AVAssetWriterStatusFailed)? ? {NSLog(@"writer error %@", _writer.error.localizedDescription);returnNO;? ? }if(bVideo)? ? {if(_videoInput.readyForMoreMediaData ==YES)? ? ? ? {? ? ? ? ? ? [_videoInput appendSampleBuffer:sampleBuffer];returnYES;? ? ? ? }? ? }else{if(_audioInput.readyForMoreMediaData)? ? ? ? {? ? ? ? ? ? [_audioInput appendSampleBuffer:sampleBuffer];returnYES;? ? ? ? }? ? }}returnNO;

Command+W.(88)

上面的代碼主要意思是把CMSampleBuffer這個(gè)東西蹋笼,姑且叫圖像每一幀的基礎(chǔ)數(shù)據(jù),加入AvAssetWriter躁垛,然后AvAssetWriter以后可以把這一楨一幀的數(shù)據(jù)輸出成video剖毯。其實(shí)就是代碼看起來惡心一點(diǎn),但是流程一點(diǎn)不復(fù)雜教馆。但是今天不是講怎么錄制的逊谋,今天講視頻剪輯。(如果真的只是對(duì)短視頻錄制感興趣對(duì)視頻剪輯不感興趣的給你們推薦一個(gè)庫土铺,https://github.com/rFlex/SCRecorder)

有這方面需求的可以去搬運(yùn)胶滋。

今天不講技術(shù),主要講套路悲敷。套路如下

Putting It All Together: Combining Multiple Assets and Saving the Result to the Camera Roll

This brief code example illustrates how you can combine two video asset tracks and an audio asset track to create a single video file. It shows how to:

1.Create an AVMutableComposition object and add multiple AVMutableCompositionTrack objects

2.Add time ranges of AVAssetTrack objects to compatible composition tracks

3.Check the preferredTransform property of a video asset track to determine the video’s orientation

4.Use AVMutableVideoCompositionLayerInstruction objects to apply transforms to the video tracks within a composition

5.Set appropriate values for the renderSize and frameDuration properties of a video composition

Use a composition in conjunction with a video composition when exporting to a video file

6.Save a video file to the Camera Roll

這是我直接從官網(wǎng)拔下來的镀钓,基本上就是最正確的步驟了。我來解釋一下镀迂。

1.創(chuàng)建一個(gè)AVMutableComposition類,這個(gè)類是干嘛的呢唤蔗?如圖

Smaller icon

這個(gè)東西是用來添加AVMutableCompositionTrack的探遵,你可以把它想象成用來調(diào)度每個(gè)視頻次序,時(shí)間的這么一個(gè)調(diào)度器妓柜。

那么問題又來了箱季,AVMutableCompositionTrack這個(gè)玩意干嘛用的?

這個(gè)玩意其實(shí)是用來加載視頻的一個(gè)容器棍掐。

我來貼段代碼

mixComposition = [[AVMutableCompositionalloc] init];// create first trackAVMutableCompositionTrack*firstTrack =? ? [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideopreferredTrackID:kCMPersistentTrackID_Invalid];? ? [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration)? ? ? ? ? ? ? ? ? ? ? ? ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]? ? ? ? ? ? ? ? ? ? ? ? atTime:kCMTimeZero? ? ? ? ? ? ? ? ? ? ? ? ? error:nil];

第一句藏雏,初始化AVMutableComposition,相信這段都看得懂作煌,第二句掘殴,創(chuàng)建AVMutableCompositionTrack,這句有點(diǎn)奇怪粟誓,其實(shí)意思就是用mixComposition創(chuàng)建一個(gè)AVMutableCompositionTrack奏寨,而且這個(gè)東西是存video類型的,那當(dāng)然你可以把后面的參數(shù)改成addMutableTrackWithMediaType:AVMediaTypeAudio的鹰服,那就可以存音軌了病瞳。

然后呢揽咕,你想想,你要剪輯視頻套菜,你是不是得規(guī)定剪輯之后視頻的時(shí)長亲善,視頻的起始時(shí)間,沒問題吧逗柴。那么最后一句的insertTimeRange就是安排firstTrack的時(shí)長蛹头,那我們不縮短,就按照這個(gè)firstAsset的時(shí)長來嚎于,從kctimerzero(就是從0秒開始)掘而,到這個(gè)firstAsset.duration(就是這個(gè)視頻的總時(shí)長),firstAsset是個(gè)什么東西我后面說于购。ofTrack這個(gè)東西就是我們的視頻來源袍睡。

為什么要規(guī)定MediaType呢?因?yàn)槟闩牡囊欢我曨l肋僧,包括video和audio斑胜,也就是視頻和音頻啊,我們這段只要視頻就行了嫌吠,所以type是video止潘。

atTime:這個(gè)參數(shù)是干嘛的呢?就是規(guī)定我們這段視頻在合并之后放在第幾秒辫诅?那我們就放在第0秒好了凭戴。

那個(gè)firstAsset是什么,我再貼段代碼炕矮。

AVURLAsset *firstAsset;firstAsset = [AVAsset assetWithURL:videoURL];

videoURL,是你的相冊(cè)里面你拍的video的地址么夫,然后我們用AVURLAsset這個(gè)類取到video的信息。不懂得自行百度肤视。

然后第二個(gè)依樣畫葫蘆就行了档痪。不贅述(我提供的DEMO里有,你們自行下載)邢滑。

但是還有一個(gè)重要的點(diǎn)腐螟,比如你要合并視頻,那么第二個(gè)視頻要放在第一個(gè)視頻后面對(duì)吧困后,所以你第二個(gè)asset的atTime參數(shù)就不能設(shè)置為KCMTimeZero了乐纸,而是要firstAsset.duration了.那么你想讓第一個(gè)和第二個(gè)同時(shí)播,那自然可以摇予,兩個(gè)的insertTime都是kcmtimezero就行了锯仪。

然后重頭戲來了。就是這個(gè)叫做AVMutableVideoCompositionLayerInstruction的東西趾盐,它的主要作用是用來規(guī)定video的樣式庶喜,比如說小腊,你合并兩個(gè)視頻,第一個(gè)怎么放久窟?轉(zhuǎn)九十度放呢秩冈,還是邊放邊旋轉(zhuǎn)呢?還是邊放邊改變透明度斥扛?都是由這個(gè)掌控的入问。

就好比我上面說的,你想讓第一個(gè)視頻和第二個(gè)視頻同時(shí)放稀颁,那么一個(gè)肯定會(huì)壓住另一個(gè)芬失,你合并之后看到的還是一個(gè)視頻,那么你其實(shí)可以改變一個(gè)視頻的LayerInstruction的opacity匾灶,讓她變成0.5棱烂,那么不就可以同時(shí)看見兩個(gè)了么,跟雙重曝光似得阶女。

貼段代碼颊糜。之前微博上有人問我怎么改透明度的問題,這里給出解答秃踩。

// 第二個(gè)視頻的架構(gòu)層AVMutableVideoCompositionLayerInstruction *secondlayerInstruction = [AVMutableVideoCompositionLayerInstructionvideoCompositionLayerInstructionWithAssetTrack:secondTrack];? ? [secondlayerInstructionsetOpacityRampFromStartOpacity:0.7toEndOpacity:0.2timeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration)];? ? [secondlayerInstructionsetTransform:CGAffineTransformIdentityatTime:kCMTimeZero];

最后就是設(shè)置最終配置了衬鱼。貼代碼就好了,都是套路憔杨,看懂了鸟赫,記住了自然就會(huì)了。

// 這個(gè)地方你把數(shù)組順序倒一下消别,視頻上下位置也跟著變了抛蚤。mainInstruction.layerInstructions = [NSArrayarrayWithObjects:secondlayerInstruction,firstlayerInstruction,nil];? ? mainComposition = [AVMutableVideoCompositionvideoComposition];? ? mainComposition.instructions = [NSArrayarrayWithObjects:mainInstruction,nil];? ? mainComposition.frameDuration =CMTimeMake(1,30);? ? mainComposition.renderSize =CGSizeMake(320,240);

然后用AVAssetExportSession導(dǎo)出就行了。

最后附上我的DEMO地址妖啥。有興趣的可以學(xué)習(xí)。我的DEMO里付了一個(gè)mp4格式的視頻对碌,你們使用的時(shí)候只需要導(dǎo)入一個(gè)自己拍的視頻合并完之后會(huì)自動(dòng)導(dǎo)入系統(tǒng)相冊(cè)荆虱,你們可以比較兩個(gè)視頻然后看看導(dǎo)出的結(jié)果。

https://github.com/pingguo-zangqilong/VideoDemo

如果你認(rèn)為這篇文章不錯(cuò)朽们,也有閑錢怀读,那你可以用支付寶掃描下方二維碼隨便捐助一點(diǎn),以慰勞作者的辛苦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末骑脱,一起剝皮案震驚了整個(gè)濱河市菜枷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叁丧,老刑警劉巖啤誊,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岳瞭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蚊锹,警方通過查閱死者的電腦和手機(jī)瞳筏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牡昆,“玉大人姚炕,你說我怎么就攤上這事《妫” “怎么了柱宦?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長播瞳。 經(jīng)常有香客問我掸刊,道長,這世上最難降的妖魔是什么狐史? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任痒给,我火速辦了婚禮,結(jié)果婚禮上骏全,老公的妹妹穿的比我還像新娘苍柏。我一直安慰自己,他們只是感情好姜贡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布试吁。 她就那樣靜靜地躺著,像睡著了一般楼咳。 火紅的嫁衣襯著肌膚如雪熄捍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天母怜,我揣著相機(jī)與錄音余耽,去河邊找鬼。 笑死苹熏,一個(gè)胖子當(dāng)著我的面吹牛碟贾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轨域,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼袱耽,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼混滔!你這毒婦竟也來了澄峰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤颖医,失蹤者是張志新(化名)和其女友劉穎枉长,沒想到半個(gè)月后冀续,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琼讽,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年沥阳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跨琳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桐罕,死狀恐怖脉让,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情功炮,我是刑警寧澤溅潜,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站薪伏,受9級(jí)特大地震影響滚澜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嫁怀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一设捐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧塘淑,春花似錦萝招、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捌治,卻和暖如春岗钩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肖油。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工兼吓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人森枪。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓视搏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疲恢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凶朗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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