Swift Package Manager compatible Aespa. Ready-to-go package for easy and intuitive camera handling

从相机到相册。只需两行代码。

let aespaOption = AespaOption(albumName: "YOUR_ALBUM_NAME")
let aespaSession = Aespa.session(with: aespaOption)
// Done!

快速链接

目录


介绍

Aespa 是一个强大且直观的 Swift 包,用于视频和照片拍摄,专注于易于设置和使用。

它被设计成易于从初学者到中级开发人员使用。如果您是 iOS 视频录制的新手,或者您正在寻找简化现有相机设置的方法,那么 Aespa 可能是您项目的完美选择。

超级易于使用

简化繁琐的会话和相册配置

之前

graph LR
User --> RP["Permission Request"]
RP -- "Granted" --> AS["AVCaptureSession"]
AS -- "Connect" --> AI["AVCaptureVideoInput"]
AS -- "Connect" --> AIA["AVCaptureAudioInput"]
AS -- "Add" --> FO["AVCaptureFileOutput"]
FO --> PHCollectionListChangeRequest
加载中

Aespa

graph LR
   User --> Aespa --> Session & Album
加载中
提供基本的预设配置和自定义
graph TD
AS["AespaSession"]
AS --> RV["Recording a new video"]
AS --> Se["Change zoom, video quailty, camera position, ..."]
AS --> AV["Set options like stabilization, orientation ,..."]
AS --> D["Fetching asset files"]
加载中
全面的错误处理

不再需要 delegate

Combine 支持
graph LR;
    A[Session update] -->|Trigger| B[previewLayerPublisher, ...]
    B -->|React to Changes| C[Subscribers]

		E[Background Thread] --Async--> F["Configure session"] --Finish--> A
加载中

还有

功能特性

注意

您可以在这里访问我们的官方文档,以获取更全面和最新的说明

手动选项

通用 描述
zoom 修改缩放因子。
position 更改相机位置。
orientation 修改方向。
focus 改变自动对焦模式。
quality 调整录制会话的视频质量预设。
doctor 检查是否满足开始录制的必要条件。
previewLayerPublisher 负责向预览层发送更新。
视频 描述
startRecording 启动视频会话的录制。
stopRecording 终止当前的视频录制会话并尝试保存视频文件。
mute 静音音频输入。
unmute 恢复音频输入。
stabilization 改变稳定模式。
torch 调整闪光灯模式和级别。
customize 使用特定的调整配置自定义会话。
fetchVideoFiles 获取录制的视频文件列表。
videoFilePublisher 发出包含最新视频文件数据的 Result 对象。
照片 描述
capturePhoto 拍摄照片并返回结果图像文件。
flashMode 设置照片拍摄会话的闪光模式。
redEyeReduction 启用或禁用照片拍摄会话的红眼消除功能。
customize 使用特定的 AVCapturePhotoSettings 自定义照片拍摄会话。
fetchPhotoFiles 获取拍摄的照片文件列表。
photoFilePublisher 发出包含最新图像文件数据的 Result 对象。

InteractivePreview

主要功能之一,InteractivePreview 为那些不想进行复杂配置的人提供了预设会话。

特性 描述
双击切换相机 双击时在前置和后置摄像头之间切换。
捏合缩放 允许使用捏合手势放大或缩小预览。

安装

Swift Package Manager (SPM)

按照以下步骤使用 SPM 安装 Aespa

  1. 在 Xcode 13 或更高版本中,选择 File > Swift Packages > Add Package Dependency
  2. 在下一个屏幕上,在搜索栏中输入 Aespa 存储库的 URL,然后单击 Next
https://github.com/enebin/Aespa.git
  1. 对于 Version rule,选择 Up to Next Minor 并指定当前的 Aespa 版本,然后单击 Next
  2. 在最后一个屏幕上,选择 Aespa 库,然后单击 Finish

Aespa 现在应该已集成到您的项目中 🚀。

用法

注意

我们为 SwiftUI 应用程序提供了一个非常详细且随时可用的代码库,该代码库展示了该软件包的大部分功能。 您可以在这里访问它,演示应用程序

要求

入门指南

import Aespa
let option = AespaOption(albumName: "YOUR_ALBUM_NAME")
let aespaSession = Aespa.session(with: option)

实现示例

配置

// Common setting
aespaSession
    .common(.focus(mode: .continuousAutoFocus))
    .common(.changeMonitoring(enabled: true))
    .common(.orientation(orientation: .portrait))
    .common(.quality(preset: .high))
    .common(.custom(tuner: WideColorCameraTuner())) { result in
        if case .failure(let error) = result {
            print("Error: ", error)
        }
    }
// Photo-only setting
aespaSession
    .photo(.flashMode(mode: .on))
    .photo(.redEyeReduction(enabled: true))
// Video-only setting
aespaSession
    .video(.mute)
    .video(.stabilization(mode: .auto))

录制 & 拍摄

// Start recording
aespaSession.startRecording()
// Later... stop recording
aespaSession.stopRecording()
// Capture photo
aespaSession.capturePhoto()

获取结果

aespaSession.stopRecording { result in
    switch result {
    case .success(let file):
        print(file.path) // file://some/path
    case .failure(let error):
        print(error)
    }
}

// or...
Task {
    let files = await aespaSession.fetchVideoFiles(limit: 1)
}

// or you can use publisher
aespaSession.videoFilePublisher.sink { result in
    print(result)
}

SwiftUI 集成

Aespa 还提供了一种超级简单的方法,将视频拍摄功能集成到 SwiftUI 应用程序中。 AespaSession 包含一个辅助方法来创建 SwiftUI UIViewRepresentable,该方法提供视频拍摄的预览。

使用示例

import Aespa
import SwiftUI

struct VideoContentView: View {
    @StateObject private var viewModel = VideoContentViewModel()

    var body: some View {
        ZStack {
            viewModel.preview
                .frame(minWidth: 0,
                       maxWidth: .infinity,
                       minHeight: 0,
                       maxHeight: .infinity)
                .edgesIgnoringSafeArea(.all)
        }
    }
}

class VideoContentViewModel: ObservableObject {
    let aespaSession: AespaSession
    var preview: some View {
        aespaSession.interactivePreview()
    }

    init() {
        let option = AespaOption(albumName: "YOUR_ALBUM_NAME")
        self.aespaSession = Aespa.session(with: option)

        setUp()
    }

    func setUp() {
        aespaSession
            .common(.quality(preset: .high))

        // Other options
        // ...
    }
}

注意

UIKit 中,您可以通过 AespaSessionpreviewLayer 属性访问预览。 有关更多详细信息,请参阅 Apple 官方文档中的 AVCaptureVideoPreviewLayer

贡献

热烈欢迎对 Aespa 的贡献。如果您发现错误或有功能请求,请随时提交 pull request 或创建 issue。

许可协议

Aespa 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。