在此之前需要了解視頻的組成
視頻是由多張圖片不間斷連續(xù)播放形成的,所有的視頻擴(kuò)展屬性其實(shí)都是對(duì)圖片間隔,壓縮比,寬高比進(jìn)行調(diào)整,當(dāng)然除了圖片自身的像素點(diǎn)處理,這里需要對(duì)openGL了解透徹(https://www.shangmayuan.com/a/db8f23382bf6427da7ca0218.html)。
編碼格式:一個(gè)視頻文件本身,通常由音頻和視頻兩部分組成,常見(jiàn)的視頻編碼格式有Xvid,AVC/H.264,MPEG1,MPEG2 等,常見(jiàn)的音頻編碼有MP3、AAC等。
視頻碼率:是指視頻文件在單位時(shí)間內(nèi)使用的數(shù)據(jù)流量,也叫碼流率。碼率越大,說(shuō)明單位時(shí)間內(nèi)取樣率越大,數(shù)據(jù)流精度就越高,這樣表現(xiàn)出來(lái)的的效果就是:視頻畫(huà)面更清晰畫(huà)質(zhì)更高。
視頻幀率:通常說(shuō)一個(gè)視頻的25幀,指的就是這個(gè)視頻幀率,即1秒中會(huì)顯示25幀;視頻幀率影響的是畫(huà)面流暢感,也就是說(shuō)視頻幀率超高,表現(xiàn)出來(lái)的效果就是:畫(huà)面越顯得流暢。你也可以這樣理解,假設(shè)1秒只顯1幀,那么一段視頻看起來(lái),就是有很明顯的卡頓感,不流暢不連慣。當(dāng)然視頻幀率越高,意味著畫(huà)面越多,也就相應(yīng)的,這個(gè)視頻文件的大小也會(huì)隨之增加,占用存儲(chǔ)空間也就增大了。
視頻分辨率:分辨率就是我們常說(shuō)的600x400分辨率、1920x1080分辨率,分辨率影響視頻圖像的大小,與視頻圖像大小成正比:視頻分辨率越高,圖像越大,對(duì)應(yīng)的視頻文件本身大小也會(huì)越大。
正文:
在任何的圖片視頻中都含有透明軌道 : Alpha通道,代表數(shù)字圖像中像素點(diǎn)的透明信息。白色的Alpha像素用以定義不透明的彩色像素,而黑色的Alpha定以透明像素,黑白之間的灰階則是彩色圖片中的半透明部分。
所以任何基于在圖片視頻上層添加的效果,就需要有透明軌道的視頻,比如合并雪花,燈光,爆破。。。
實(shí)驗(yàn)用AVFoundation即使原視頻包含透明軌道,在合成視頻后透明軌道消失了,需要后續(xù)花時(shí)間研究。
這里我用的是GPUImage 這個(gè)工具,可以講雪花無(wú)縫隙的結(jié)合起來(lái)。
_movieFile = [[GPUImageMovie alloc] initWithURL:url];
_movieFile.runBenchmark = YES;
_movieFile.playAtActualSpeed = NO;
_movieFile2 = [[GPUImageMovie alloc] initWithURL:url2];
_movieFile2.runBenchmark = YES;
_movieFile2.playAtActualSpeed = NO;
_filter = [[GPUImageScreenBlendFilter alloc] init];
// filter = [[GPUImageUnsharpMaskFilter alloc] init];
[_movieFile addTarget:self.filter];
[_movieFile2 addTarget:self.filter];
// Only rotate the video for display, leave orientation the same for recording
// In addition to displaying to the screen, write out a processed version of the movie to disk
NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/last.mov"];
unlink([pathToMovie UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie
NSLog(@"file = %@",pathToMovie);
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
self.movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(640.0, 360.0)];
[self.filter addTarget:self.movieWriter];
// Configure this for video from the movie file, where we want to preserve all video frames and audio samples
self.movieWriter.shouldPassthroughAudio = YES;
//movieFile.audioEncodingTarget = self.movieWriter;
[_movieFile enableSynchronizedEncodingUsingMovieWriter:self.movieWriter];
[self.movieWriter startRecording];
[_movieFile startProcessing];
[_movieFile2 startProcessing];
__block mlkiMovie * sself = self;
[self.movieWriter setCompletionBlock:^{
[sself.filter removeTarget:sself.movieWriter];
[sself.movieFile endProcessing];
[sself.movieFile2 endProcessing];
[sself.movieWriter finishRecording];
NSLog(@"ok");
}];