gpuimage 视频相关使用

基础的图片等使用方法先看一下官方的demo或者其他的教程。这里有的:本地视频添加滤镜(无声,跟官方demo一样,这个要注意释放,我这里没释放了),拍照摄像,本地视频带声预览(ง•̀ω•́)ง✧(感谢同事帮找的https://blog.csdn.net/u011270282/article/details/50354208,不过不支持同步录制)。

另外,预览状态切换滤镜和头像挂件这两个也实现过一下,我比较懒,可能有空会再加一下也可能就这样太监了。

demo地址:本文domo

如果需要边录边播的话,可能你会需要纠正一下视频播放速度:


{

// Do this outside of the video processing queue to not slow that down while waiting

CMTime currentSampleTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBufferRef);

CMTime differenceFromLastFrame = CMTimeSubtract(currentSampleTime, previousFrameTime);

NSLog(@"%lld  %d",currentSampleTime.value,currentSampleTime.timescale);

if( differenceFromLastFrame.value >0) {

CFAbsoluteTime currentActualTime = CFAbsoluteTimeGetCurrent();

CGFloat frameTimeDifference = CMTimeGetSeconds(differenceFromLastFrame);

CGFloat actualTimeDifference = currentActualTime - previousActualFrameTime;

if(frameTimeDifference > actualTimeDifference ){

CGFloat difTime = (frameTimeDifference - actualTimeDifference) - delayoOffsetTime;

if(difTime >0){

doubletime =1000000.0* difTime;

usleep(time);

}

delayoOffsetTime =  CFAbsoluteTimeGetCurrent() - currentActualTime - difTime;

if(delayoOffsetTime <0) {

delayoOffsetTime =0;

}

NSLog(@"date:%f  %f  dif:%f  difTime:%f",frameTimeDifference,actualTimeDifference,delayoOffsetTime,difTime);

}

previousFrameTime = currentSampleTime;

previousActualFrameTime = CFAbsoluteTimeGetCurrent();

}

}

替换此处


播放速度纠正

64宫格的图的获取方法:你ps上怎么处理其他图片,把gpu里lookup那张图片拿出来,一样的流程处理一遍,就好了。只处理颜色,不要处理模糊什么的。

64宫格

因为可能不会跟新了,附一下切换滤镜的关键方法



//https://blog.csdn.net/u013488791/article/details/69361818 

- (void)filterVideo:(NLGPUImageCustomFilter*)terminalFilter{

if (!gpuMovieFile) {

playerItem = [[AVPlayerItem alloc]initWithURL:videoUrl];

player = [AVPlayer playerWithPlayerItem:playerItem];

gpuMovieFile=  [[GPUImageMovie alloc] initWithPlayerItem:playerItem];

gpuMovieFile.delegate = self;

gpuMovieFile.runBenchmark = YES;

gpuMovieFile.playAtActualSpeed = YES;

}

AVAsset *asset = [AVAsset assetWithURL:videoUrl];

NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];

if([trackscount] >0) {

AVAssetTrack*videoTrack = [tracksobjectAtIndex:0];

CGAffineTransform t = videoTrack.preferredTransform;//这里的矩阵有旋转角度,转换一下即可

CGFloatwidth = videoTrack.naturalSize.width;

CGFloatheight = videoTrack.naturalSize.height;

// 对旋转90和旋转270的视频进行缩放,平移

if(t.a==0&&fabs(t.b) ==1.0&&fabs(t.c) ==1.0&& t.d==0){

t.b= t.b*width/height;

t.c= t.c*width/height;

t.tx=0;

t.ty=0;

gpuPlayView.transform = t;

}

}

if (CMTimeCompare(pausedTime, player.currentItem.asset.duration)&&isPlayingVideo) {

pausedTime = player.currentTime;

}else{

pausedTime = CMTimeMake(0, 600.0);

}

// 滤镜

if(![terminalFilter  isKindOfClass:[NLGPUImageCustomFilterclass]]) {

//没点滤镜(直接点击播放按钮)

if ([currentFilter isKindOfClass:[NLGPUImageCustomFilter class]]) {

//已选中过滤镜,直接使用

terminalFilter = [self getFilterByFilter:currentFilter];

}else{

//当前未选中过滤镜

terminalFilter = [[NLGPUImageNormalFilteralloc]init];

}

}else{

terminalFilter = [selfgetFilterByFilter:terminalFilter];

}

[gpuMovieFile cancelProcessing];

[gpuMovieFile removeAllTargets];

[gpuMovieFile addTarget:terminalFilter];

[terminalFilteraddTarget:gpuPlayView]; // gpuPlayView is my GPUImageView

[gpuMovieFile startProcessing];

// Seeking to the point where video was paused

if (CMTimeCompare(pausedTime, player.currentItem.asset.duration) == 0) {

[player play];

}else{

[player seekToTime:pausedTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];

[player play];

}

}


多层View录制方法,至于人脸跟踪,这里就不展开讲,苹果有自带的人脸跟踪(AVFoudation的,不要用coreImage,我看有些教程直接用coreimage当摄像头显示层来做人脸跟随,真是服气),另外商用的话,还是需要三方的人脸跟踪,苹果的有点慢。

需要学习的可以参考

https://www.jianshu.com/p/095107abc7ba

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 任世界荒芜,总有人,是你的信徒。 1. 你不知道 我写过最好的剧本 就是与你相遇 2. 沦陷在你手里 我逃不掉 也...
    独立日的折耳猫阅读 251评论 4 7
  • 鱼缸里面 养了三条鱼 一条大鱼 两条小鱼 两条金鱼 一条黑鱼 一条活泼 一条安静 一条不爱动 咋一看 还以为 鱼缸...
    天野丢阅读 329评论 1 4
  • 光阴运转的翅膀 不停地张收 那么多的时间 恍如流水一去不复还 从母体落地到如今 我发现—— 自己的黑发变白、脸上叠...
    舟夫阅读 388评论 3 5
  • 洗完澡收拾好一切,坐在床边的时候,耳边就想起了我怀念的这首歌。 拿起手边的电脑打开简书,敲下标题。一切如行云流水,...
    目木酱阅读 265评论 0 0