iPhone 中的视频过滤速度很慢

2024-05-04

我正在尝试在 iPhone 中过滤视频。这是我的程序结构和源代码:

AppDelegate.h
AppDelegate.m
ViewController.h
ViewController.m

AppDelegate 文件与默认文件相同。这是我的视图控制器。

//ViewController.h

#import <UIKit/UIKit.h>
#import <GLKit/GLKit.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreMedia/CoreMedia.h>
#import <CoreVideo/CoreVideo.h>
#import <QuartzCore/QuartzCore.h>
#import <CoreImage/CoreImage.h>
#import <ImageIO/ImageIO.h>

@interface ViewController : GLKViewController <AVCaptureVideoDataOutputSampleBufferDelegate>{
    AVCaptureSession *avCaptureSession;
    CIContext *coreImageContext;
    CIImage *maskImage;
    CGSize screenSize;
    CGContextRef cgContext;
    GLuint _renderBuffer;
    float scale;
}

@property (strong, nonatomic) EAGLContext *context;

-(void)setupCGContext;

@end

// ViewController.m
#import "ViewController.h"

@implementation ViewController

@synthesize context;

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    if (!self.context) {
        NSLog(@"Failed to create ES context");
    }

    GLKView *view = (GLKView *)self.view;
    view.context = self.context;
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;

    coreImageContext = [CIContext contextWithEAGLContext:self.context];

    glGenRenderbuffers(1, &_renderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);

    NSError *error;
    AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
    AVCaptureVideoDataOutput *dataOutput = [[AVCaptureVideoDataOutput alloc] init];

    [dataOutput setAlwaysDiscardsLateVideoFrames:YES]; 
    [dataOutput setVideoSettings:[NSDictionary  dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] 
                                                              forKey:(id)kCVPixelBufferPixelFormatTypeKey]];
    [dataOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];

    avCaptureSession = [[AVCaptureSession alloc] init];
    [avCaptureSession beginConfiguration];
    [avCaptureSession setSessionPreset:AVCaptureSessionPreset1280x720];
    [avCaptureSession addInput:input];
    [avCaptureSession addOutput:dataOutput];
    [avCaptureSession commitConfiguration];
    [avCaptureSession startRunning];

    [self setupCGContext];
    CGImageRef cgImg = CGBitmapContextCreateImage(cgContext);
    maskImage = [CIImage imageWithCGImage:cgImg];
    CGImageRelease(cgImg);
}

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {

    CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer);
    CIImage *image = [CIImage imageWithCVPixelBuffer:pixelBuffer];
    image = [CIFilter   filterWithName:@"CISepiaTone" keysAndValues:kCIInputImageKey, 
                        image, @"inputIntensity", 
                        [NSNumber numberWithFloat:0.8], 
                        nil].outputImage;

    [coreImageContext drawImage:image atPoint:CGPointZero fromRect:[image extent] ];

    [self.context presentRenderbuffer:GL_RENDERBUFFER];
}

-(void)setupCGContext {
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    NSUInteger bytesPerPixel = 4;
    NSUInteger bytesPerRow = bytesPerPixel * screenSize.width;
    NSUInteger bitsPerComponent = 8;
    cgContext = CGBitmapContextCreate(NULL, screenSize.width, screenSize.height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);

    CGColorSpaceRelease(colorSpace);
}

棕褐色滤镜有效,但视频速度稍慢。当我不应用滤镜时,视频是正常的。关于如何改进视频并使其速度更快有什么想法吗?

Thanks.


正如我所描述的here https://stackoverflow.com/a/6628208/19679,Core Image 中的棕褐色滤镜不太能够实时运行,但其他滤镜可能可以。这取决于目标设备的硬件功能以及 iOS 版本(Core Image 的性能较过去几个 iOS 版本有了显着提高)。

但是,如果我可以再次插入我的开源框架,GPUImage https://github.com/BradLarson/GPUImage让您更快地完成这项工作。它可以在 iPhone 4 上在 2.5 毫秒内对 640x480 帧的视频应用棕褐色调滤镜,这对于来自该相机的 30 FPS 视频来说已经足够快了。

以下代码将对 iOS 设备上后置摄像头的视频进行实时过滤,并在纵向视图中显示该视频:

videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];

sepiaFilter = [[GPUImageSepiaFilter alloc] init];
GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight];

[videoCamera addTarget:rotationFilter];
[rotationFilter addTarget:sepiaFilter];
filterView = [[GPUImageView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:filterView];
[sepiaFilter addTarget:filterView];

[videoCamera startCameraCapture];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iPhone 中的视频过滤速度很慢 的相关文章

  • Swift 中通过不同类调用委托方法

    我正在获取 JSON 菜单 一旦 JSON 返回 我想运行 menuReady 来更新表的内容在 SomeTableViewController 类中 但下面的代码似乎不起作用 AIM Run 菜单就绪 JSON 返回后更新内容 PROBL
  • 我应该在哪个方法中设置 UITextField 的委托?

    在 viewDidLoad 或 init 方法中设置 UITextField 的委托是一个好习惯吗 我尝试在 init 方法中将委托设置为 self 但它没有调用相应的委托方法 当我将代码移动到 viewDidLoad 中时 它注册为将 s
  • 退出导航控制器

    我试图离开初始视图控制器 并进入空白视图控制器 这很好 但是这会使空白视图控制器也成为导航控制器的一部分 这不是我想要的 我想脱离视图控制器 在视图控制器中 我尝试退出 它会自行弹出 当我尝试视图中的方法时 将出现目标视图控制器 self
  • iPhone,如何隐藏标签栏按钮?

    如何隐藏单个标签栏按钮 我已经搜索过 但什么也没找到 只找到了完整的栏 我已经取得了一些进展 但仍然遇到问题 此代码位于我的应用程序委托中 带有选项卡栏的出口 我在其中调用它viewDidLoad选项卡栏中显示的第一个视图的视图 void
  • Obj-C / Swift 项目中的致命陷阱异常

    我开始将 Swift 代码集成到我的 Obj C 项目中 一切都进展顺利 但今天 当我更新到 Xcode 6 1 时 事情变得很糟糕 我从之前运行良好的 Swift 代码中收到了许多 陷阱 异常 第一次崩溃位于我的 UIFont 扩展中 这
  • CALayer 抗锯齿不如 UIView 抗锯齿

    我一直在尝试使用 CALayer 制作圆形绘图的动画 一切都运行良好 但问题是 绘制的圆不够抗锯齿 它的边界有点太粗糙 或者如果使用光栅化则模糊 抗锯齿已启用 还尝试过 边缘抗锯齿遮罩 kCALayerLeftEdge kCALayerRi
  • 如何使用 Objective-C 协议

    我需要将 Picker 选择的值继承到其他地方 我正在尝试下面的代码 但空值即将到来 请检查我哪里出错了 我必须继承在中传递的字符串值PickerView 请检查代码 选取器1 h import
  • SpriteKit 碰撞检测中 SKSpriteNode 之间的间隙

    我已经尝试解决这个问题很长一段时间了 我有一个具有简单平台物理原理的游戏 其中玩家跌倒在一个方块上 这可以阻止他跌倒 这是可行的 但是玩家停止的位置和实际对象 精灵节点的位置之间存在明显的差距 这是一个屏幕截图 它应该是不言自明的 clas
  • iOS崩溃核心位置CFBasicHashCreateCopy?

    我已经通过 Crashlytics 报告了这个问题 尽管我无法在本地复制它 所以除了下面的堆栈跟踪之外我没有什么可做的 不确定堆栈跟踪中是否引用了 CoreLocation与它有任何关系 但我不确定可能是什么原因 我的项目使用的是ARC 有
  • 使用 Unity 在 iOS 应用程序上发送电子邮件时出错

    我正在开展一个学校项目 我正在尝试记录从我统一制作的游戏中存储的数据 我的问题是我想通过电子邮件将数据发送到应用程序 一切正常 电子邮件与数据一起发送等 但是当我将应用程序构建到 iOS 设备时 它不会发送电子邮件 我在 Unity 中没有
  • 使用 xctool 运行单个 KIWI 规范

    有没有人能够成功地将 KW SPEC 变量传递给 xctool 我正在尝试使用以下命令来运行单个 KIWI 规范https github com kiwi bdd Kiwi wiki Kiwi FAQ q how do i run a si
  • 如何在 box2d 中停止作用在物体上的力

    我正在 iPhone 上使用 box2d 来创建游戏 我的身体受重力影响向下移动 而不是向右或向左移动 它会被另一个物体击中 然后向右或向左移动 然后我有一个重置按钮 可以将身体移回到起点 唯一的问题是它仍在向右或向左移动 如何抵消球已经行
  • 如何在 Swift 中调用 Objective-C 实例类型方法?

    我有一个 Objective C 类 如下所示 interface CustomObjectHavingData NSObject property nonatomic strong NSData objWithData instancet
  • CoreBluetooth:如何为许多特性(30 - 40)设计代码?

    我搜索了一下 发现这是一个可能重复的问题 同一设备的多个 CBPeripheral https stackoverflow com questions 10836703 multiple cbperipherals for same dev
  • iphone opencv - 模板匹配

    我已经在我的 iphone 项目中实现了这个 OpenCV 构建 http aptogo co uk 2011 09 opencv framework for ios http aptogo co uk 2011 09 opencv fra
  • 删除 UINavigationBar 下的 1px 边框 - 不起作用

    IBOutlet var navBar UINavigationBar self navBar setBackgroundImage UIImage forBarMetrics UIBarMetrics Default self navBa
  • APNS(Apple 推送通知服务器)的反馈服务

    我们正在使用Java作为推送通知提供商APNS I我能够将消息发送到APNS但我不知道如何获得该消息的反馈 请帮忙 反馈服务具有类似于用于发送推送通知的接口的二进制接口 您可以通过以下方式访问生产反馈服务feedback push appl
  • 每次 UIScrollView 释放时都会发生内存泄漏

    在我的应用程序中 我有一个滚动视图和四个表格视图 每次拖动然后释放时 我都会泄漏 48 字节 这确实很重要 正如您所看到的 两组泄漏都有相同的来源 有人见过这样的泄漏吗 Edit 1 当我单击泄漏旁边的箭头时 我会得到泄漏的以下信息 您所看
  • 观察 UIDatePicker 的变化

    我注意到没有委托来观察 UIDatePicker 中的变化 有没有一种方法可以在不确认任何内容的情况下检测选择器中何时进行更改 例如它旋转并落在新数字上的那一刻 我希望能够检测到这一点 我考虑过关键值观察 但我不认为有一个属性会立即改变 您
  • 一旦 webapp 添加到主屏幕,是否可以强制 iphone/ipod 更新 apple-touch-icon?

    我使用 safari 的所有推荐链接和元标记创建了一个网络应用程序 例如

随机推荐