GPUImage初探

GPUImage作為一個(gè)很強(qiáng)大很強(qiáng)大很強(qiáng)大的圖形處理工具,可以處理圖片,視頻.超爽的.

廢話不多說,第一天大概我就用了一下濾鏡功能(這里補(bǔ)充一下,各種特效是可以混合使用的,夠你玩很久很久了)

1.首先我們需要GPUImageVideoCamera

最好不要在self.view上操作, 所以我們需要一個(gè)自己的GPUImageView來顯示(這里說下, 如果應(yīng)用不支持橫豎屏,但是進(jìn)入的時(shí)候必須橫屏,可以直接修改preview的transform給人一種橫屏的感覺,比你自己去調(diào)整系統(tǒng)的那個(gè)橫豎屏要方便的多)

我選擇先生成一個(gè)用以顯示預(yù)覽的界面

?self.preview = [[GPUImageView alloc] initWithFrame:self.view.bounds];

_videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPresetiFrame960x540 cameraPosition:AVCaptureDevicePositionBack];

_videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;

2.然后呢,你需要一個(gè)濾鏡, 注:濾鏡可以疊加

_filter = [[GPUImageTransformFilter alloc] init];

? ? NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];

? ? unlink([pathToMovie UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie

? ? NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];

3.最后呢需要一個(gè)GPUImageMovieWriter

_movieWriter ? ?_movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(540, 960)];

? ? _movieWriter.encodingLiveVideo = YES;

? ? [_filter addTarget:_movieWriter];

? ? [_videoCamera addTarget:_filter];

? ? _videoCamera.audioEncodingTarget = _movieWriter;

? ? GPUImageView *filterView = (GPUImageView *)self.preview;

? ? [_filter addTarget:filterView];

? ? [_videoCamera startCameraCapture];//此時(shí)你就可以在屏幕上看見攝像頭捕捉到的數(shù)據(jù)了

4,開始錄制

-(void)recordVideo:(UIButton*)button{

? ? if (!button.selected) {

? ? ? ? button.selected = YES;

? ? ? ? [self changeTheOrientaionOfWriter];

? ? ? ? [_movieWriter startRecording];

? ? ? ? _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerOfRecord) userInfo:nil repeats:YES];

? ? }else{

? ? ? ? [_filter removeTarget:_movieWriter];

? ? ? ? _videoCamera.audioEncodingTarget = nil;

? ? ? ? [_movieWriter finishRecording];

? ? ? ? [_timer invalidate];

? ? ? ? NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];

? ? ? ? [self encodeVideoOrientation:[NSURL fileURLWithPath:pathToMovie]];

? ?}

}

-(void)changeTheOrientaionOfWriter{

//? ? ? ? CGSize movieWriteSize = CGSizeMake(480, 640);

//? ? ? ? UIInterfaceOrientation orientation = UIInterfaceOrientationPortrait;

? ? ? ? CGAffineTransform transform = CGAffineTransformIdentity;

? ? ? ? switch (_orientationNew) {

? ? ? ? ? ? case UIDeviceOrientationLandscapeLeft:

? ? ? ? ? ? {

//? ? ? ? ? ? ? ? orientation = UIInterfaceOrientationLandscapeRight;

? ? ? ? ? ? ? ? transform = CGAffineTransformRotate(CGAffineTransformIdentity, -M_PI_2);

? ? ? ? ? ? }

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case UIDeviceOrientationLandscapeRight:

? ? ? ? ? ? {

? ? ? ? ? ? ? ? transform = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI_2);

//? ? ? ? ? ? ? ? orientation = UIInterfaceOrientationLandscapeLeft;


? ? ? ? ? ? }

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case UIDeviceOrientationPortrait:


? ? ? ? ? ? case UIDeviceOrientationPortraitUpsideDown:

? ? ? ? ? ? {


//? ? ? ? ? ? ? ? orientation = UIInterfaceOrientationPortrait;


? ? ? ? ? ? }

? ? ? ? ? ? ? ? break;

? ? ? ? ? ?default:

? ? ? ? ? ? ? ? break;

? ? ? ?}

?? ? ? ?_movieWriter.transform = transform;

}


壓縮視頻,本來有一個(gè)方向需要調(diào)整,GPUImage貌似不能和系統(tǒng)錄制的視頻一樣調(diào)整方向,就不多說了

-(void)encodeVideoOrientation:(NSURL*)anOutputFileURL{


? ? AVURLAsset * videoAsset = [[AVURLAsset alloc]initWithURL:anOutputFileURL options:nil];


? ? AVAssetExportSession * assetExport = [[AVAssetExportSession alloc] initWithAsset:videoAsset

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? presetName:AVAssetExportPresetMediumQuality];

? ? NSString* mp4Path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mp4"];

? ?NSFileManager* defaultFileManager = [NSFileManager defaultManager];

? ? if ([defaultFileManager fileExistsAtPath:mp4Path]) {

? ? ? ? [defaultFileManager removeItemAtPath:mp4Path error:nil];

? ? }


? ? assetExport.outputURL = [NSURL fileURLWithPath: mp4Path];

? ? assetExport.shouldOptimizeForNetworkUse = YES;

? ? assetExport.outputFileType = AVFileTypeMPEG4;

//? ? assetExport.videoComposition = [self getVideoComposition:videoAsset];

? ? [assetExport exportAsynchronouslyWithCompletionHandler:^{

? ? ? ? switch ([assetExport status]) {

? ? ? ? ? ? case AVAssetExportSessionStatusFailed:

? ? ? ? ? ? {

? ? ? ? ? ? ? ? NSLog(@"AVAssetExportSessionStatusFailed!");

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }


? ? ? ? ? ? case AVAssetExportSessionStatusCancelled:

? ? ? ? ? ? ? ? NSLog(@"Export canceled");

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case AVAssetExportSessionStatusCompleted:

? ? ? ? ? ? {

? ? ? ? ? ? ? ? NSLog(@"Successful!");

? ? ? ? ? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{

? ? ? ? ? ? ? ? ? ? LKPlayVideoViewController* vc = [[LKPlayVideoViewController alloc] init];

? ? ? ? ? ? ? ? ? ? vc.sendViewController = self.sendViewController;

? ? ? ? ? ? ? ? ? ? [self.navigationController pushViewController:vc animated:NO];

? ? ? ? ? ? ? ? });

? ? ? ? ? ? }

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? default:

? ? ? ? ? ? ? ? break;

? ? ? ? }

? ? }];

}


注:其實(shí)有個(gè)很關(guān)鍵的地方, 就是如果橫著錄視頻,我們需要調(diào)整輸出視頻的方向

_movieWriter.transform = transform; 修改這個(gè)就行了, 為此,我苦惱的很長時(shí)間

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阴孟,一起剝皮案震驚了整個(gè)濱河市驹碍,隨后出現(xiàn)的幾起案子骡尽,更是在濱河造成了極大的恐慌翔横,老刑警劉巖恃疯,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咐刨,死亡現(xiàn)場(chǎng)離奇詭異牙躺,居然都是意外死亡恋腕,警方通過查閱死者的電腦和手機(jī)腺办,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門焰手,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怀喉,你說我怎么就攤上這事书妻。” “怎么了躬拢?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵躲履,是天一觀的道長见间。 經(jīng)常有香客問我,道長工猜,這世上最難降的妖魔是什么米诉? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮篷帅,結(jié)果婚禮上史侣,老公的妹妹穿的比我還像新娘。我一直安慰自己犹褒,他們只是感情好抵窒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叠骑,像睡著了一般李皇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宙枷,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天掉房,我揣著相機(jī)與錄音,去河邊找鬼慰丛。 笑死卓囚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诅病。 我是一名探鬼主播哪亿,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贤笆!你這毒婦竟也來了蝇棉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤芥永,失蹤者是張志新(化名)和其女友劉穎篡殷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體埋涧,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡板辽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棘催。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劲弦。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖巧鸭,靈堂內(nèi)的尸體忽然破棺而出瓶您,到底是詐尸還是另有隱情,我是刑警寧澤纲仍,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布呀袱,位于F島的核電站,受9級(jí)特大地震影響郑叠,放射性物質(zhì)發(fā)生泄漏夜赵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一乡革、第九天 我趴在偏房一處隱蔽的房頂上張望寇僧。 院中可真熱鬧,春花似錦沸版、人聲如沸嘁傀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽细办。三九已至,卻和暖如春蕾殴,著一層夾襖步出監(jiān)牢的瞬間笑撞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工钓觉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茴肥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓荡灾,卻偏偏與公主長得像瓤狐,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子批幌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345