iOS自定义相机界面,实现微信小视频UI效果

2023-11-21 22:50

本文主要是介绍iOS自定义相机界面,实现微信小视频UI效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在开发的时候,要实现微信小视频的效果只用系统框架中的picker是不行的,它是个navi 而我们需要一个view把它放到tableview后边

所以我们需要自定义一个摄像界面

下边的文章摘抄自http://course.gdou.com/blog/Blog.pzs/archive/2011/12/14/10882.html

看完了相信对你会有很大的帮助



在进行视频捕获时,有输入设备及输出设备,程序通过 AVCaptureSession 的一个实例来协调、组织数据在它们之间的流动。 

程序中至少需要:

● An instance of AVCaptureDevice to represent the input device, such as a camera or microphone

● An instance of a concrete subclass of AVCaptureInput to configure the ports from the input device

● An instance of a concrete subclass of AVCaptureOutput to manage the output to a movie file or still image

● An instance of AVCaptureSession to coordinate the data flow from the input to the output

由上图可以看出,一个AVCaptureSession 可以协调多个输入设备及输出设备。通过 AVCaptureSession 的 addInput、addOutput 方法可将输入、输出设备加入 AVCaptureSession 中。

capture input 及 capture out 之间的联系由 AVCaptureConnection 对象表示,capture input (AVCaptureInput) 有一个或多个输入端口(AVCaptureInputPort 实例) ,capture out(AVCaptureOutput 实例)可接收来自一个或多个输入源的数据。

当一个输入或一个输出被加入到  AVCaptureSession 中时,该 session 会“贪婪地” 在所有兼容的输入端口和输出之间建立连接(AVCaptureConnection),因此,一般不需要手工在输入、输出间建立连接。

输入设备:

AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput deviceInputWithDevice: 

                                     [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo] error:nil];

种类有:

AVMediaTypeVideo

AVMediaTypeAudio

输出设备有:

AVCaptureMovieFileOutput 输出到文件

AVCaptureVideoDataOutput 可用于处理被捕获的视频帧

AVCaptureAudioDataOutput 可用于处理被捕获的音频数据

AVCaptureStillImageOutput 可用于捕获带有元数据(MetaData)的静止图像

输出设备对象的创建:

AVCaptureMovieFileOutput  *captureOutput = [[AVCaptureMovieFileOutput allocinit;

一、捕获到视频文件

此时输出设备指定为:AVCaptureMovieFileOutput,其子类 AVCaptureFileOutput 的2个方法用于启动、停止编码输出:

- (void)startRecordingToOutputFileURL:(NSURL *)outputFileURL recordingDelegate:(id < AVCaptureFileOutputRecordingDelegate >)delegate

- (void)stopRecording

程序开始编码输出时,应先启动 AVCaptureSession,再用以上方法启动编码输出。整个步骤:

 创建输入、输出设备、AVCaptureSession对象:

  AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput  deviceInputWithDevice:[AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo]  error:nil];

  AVCaptureDeviceInput *microphone = [AVCaptureDeviceInput  deviceInputWithDevice:[AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeAudio]  error:nil];

  /*We setupt the output*/

  captureOutput = [[AVCaptureMovieFileOutput allocinit]; 

  self.captureSession = [[AVCaptureSession allocinit];

  加入输入、输出设备:

  [self.captureSession addInput:captureInput];

  [self.captureSession addInput:microphone];

  [self.captureSession addOutput:self.captureOutput];

  设置Session 属性:

  /*We use medium quality, ont the iPhone 4 this demo would be laging too much, the conversion in UIImage and CGImage demands too much ressources for a 720p resolution.*/

  [self.captureSession setSessionPreset:AVCaptureSessionPresetMedium];

  其他预置属性如下:

  

  不同设备的情况:

  

  开始编码,视频编码为H.264、音频编码为AAC

   [self performSelector:@selector(startRecording) withObject:nil afterDelay:10.0];

   [self.captureSession startRunning];

 

   - (void) startRecording

   {

       [captureOutput startRecordingToOutputFileURL:[self tempFileURLrecordingDelegate:self];

   }

处理编码过程中事件的类必须符合 VCaptureFileOutputRecordingDelegate 协议,并在以下2个方法中进行处理:

 

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray*)connections

{

    NSLog(@"start record video");

}

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error

{

    ALAssetsLibrary *library = [[ALAssetsLibrary allocinit];    

    // 将临时文件夹中的视频文件复制到 照片 文件夹中,以便存取
    [library 
writeVideoAtPathToSavedPhotosAlbum:outputFileURL

                                completionBlock:^(NSURL *assetURL, NSError *error) {

                                    if (error) {

                                        _myLabel.text=@"Error";

                                    }

                                    else

                                        _myLabel.text = [assetURL path];

                                }];

    [library release];}

通过 AVCaptureFileOutput  的 stopRecording 方法停止编码。

 

二、捕获用于处理视频帧

 

三、捕获为静止图像

此时输出设备对象为:AVCaptureStillImageOutput,session 的预置(preset)信息决定图像分辨率:

 

图像格式:

例:

AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];

NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];

[stillImageOutput setOutputSettings:outputSettings];

当需要捕获静止图像时,可向输出设备对象发送:captureStillImageAsynchronouslyFromConnection:completionHandler: 消息。第一个参数为欲进行图像捕获的连接对象(AVCaptureConnection),你必须找到具有视频采集输入端口(port)的连接:

AVCaptureConnection *videoConnection = nil;

for (AVCaptureConnection *connection in stillImageOutput.connections) {

     for (AVCaptureInputPort *port in [connection inputPorts]) {

          if ([[port mediaType] isEqual:AVMediaTypeVideo] ) {

               videoConnection = connection;

               break;

          }

     }

     if (videoConnection) { break; }

}

第二个参数是一个块(block),它有2个参数,第一个参数是包含图像数据的  CMSampleBuffer,可用于处理图像:

[[self stillImageOutputcaptureStillImageAsynchronouslyFromConnection:stillImageConnection

        completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {

               ALAssetsLibraryWriteImageCompletionBlock completionBlock = ^(NSURL *assetURL, NSError *error) {

                    if (error) {
                        // error handling

                    }

               }

        };

        if (imageDataSampleBuffer != NULL) {

              NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];

              ALAssetsLibrary *library = [[ALAssetsLibrary allocinit];  

              UIImage *image = [[UIImage allocinitWithData:imageData];

              // 将图像保存到“照片” 中
              [library writeImageToSavedPhotosAlbum:[image CGImage] orientation:(ALAssetOrientation)[image imageOrientation]

              completionBlock:completionBlock];

              [image release];

              [library release];

        }

        else

             completionBlock(nil, error);

        if ([[self delegaterespondsToSelector:@selector(captureManagerStillImageCaptured:)]) {

             [[self delegatecaptureManagerStillImageCaptured:self];

        }

}];

这篇关于iOS自定义相机界面,实现微信小视频UI效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/405663

相关文章

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug