小编Tha*_*Guy的帖子

完整的视频屏幕捕获与视频背景和绘画叠加性能问题

很长一段时间stackoverflow读者,第一次海报.

我正在尝试创建一个名为CloudWriter的iPad应用.应用程序的概念是绘制您在云中看到的形状.下载应用程序后,在启动CloudWriter后,将向用户呈现实时视频背景(来自后置摄像头),其上面有一个OpenGL绘图层.用户可以打开应用程序,将iPad指向天空中的云,并绘制他们在显示屏上看到的内容.

该应用程序的一个主要特征是用户记录会话期间显示器上发生的事情的视频屏幕捕获.实时视频输入和"绘图"视图将成为平面(合并)视频.

关于当前如何工作的一些假设和背景信息.

  • 使用Apps AVCamCaptureManager,AVCam示例项目的一部分,作为许多相机相关代码的基础.
  • 使用AVCaptureSessionPresetMedium作为预设启动AVCamCapture会话.
  • 开始通过videoPreviewLayer将Camera Feed输出为背景.
  • 覆盖直播videoPreviewLayer,其视图允许使用openGL"绘制"(手指绘画样式)."绘图"视图背景是[UIColor clearColor].

在这一点上,想法是用户可以将iPad3相机指向天空中的某些云,并绘制他们看到的形状.此功能完美无瑕.当我尝试对用户会话进行"平面"视频屏幕捕获时,我开始遇到性能问题.由此产生的"平面"视频会使摄像机输入与用户绘图实时重叠.

类似于我们正在寻找的功能的应用程序的一个很好的例子是Board Cam,可在App Store中找到.

要启动此过程,视图中始终会显示"记录"按钮.当用户点击记录按钮时,期望是在再次点击记录按钮之前,会话将被记录为"平面"视频屏幕捕获.

当用户点击"记录"按钮时,代码中会发生以下情况

  • AVCaptureSessionPresetAVCaptureSessionPresetMedium更改为AVCaptureSessionPresetPhoto,允许访问

    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
    
    Run Code Online (Sandbox Code Playgroud)
  • isRecording值设置为YES.
  • didOutputSampleBuffer开始获取数据并从当前视频缓冲区数据创建图像.它通过调用来完成此操作

    - (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer
    
    Run Code Online (Sandbox Code Playgroud)
    • self.currentImage设置为this
  • 应用程序根视图控制器开始覆盖drawRect以创建展平图像,用作最终视频中的单个帧.

  • 该帧被写入平面视频

为了创建一个平面图像,用作单独的框架,在根ViewController的drawRect函数中,我们获取AVCamCaptureManager的didOutputSampleBuffer代码接收的最后一帧.那是在下面

- (void) drawRect:(CGRect)rect {


    NSDate* start = [NSDate date];
    CGContextRef context = [self createBitmapContextOfSize:self.frame.size];

    //not sure why this is necessary...image renders upside-down and mirrored
    CGAffineTransform …
Run Code Online (Sandbox Code Playgroud)

core-graphics avfoundation ipad ios

5
推荐指数
1
解决办法
2337
查看次数

标签 统计

avfoundation ×1

core-graphics ×1

ios ×1

ipad ×1