SFBAudioEngine

SFBAudioEngine 是一个强大的音频功能库,适用于 macOS、iOS 和 tvOS。SFBAudioEngine 支持

SFBAudioEngine 可以在 Swift 和 Objective-C 中使用。

格式支持

SFBAudioEngine 支持大多数音频格式。除了 Core Audio 支持的所有格式外,SFBAudioEngine 还支持

FLACOgg Opus 和 MP3 由 Core Audio 原生支持,但 SFBAudioEngine 为这些格式提供了自己的编码器和解码器。

快速开始

播放

播放音频文件非常简单,如下所示

import SFBAudioEngine
let player = AudioPlayer()
let url = URL(fileURLWithPath: "example.flac")
try? player.play(url)

注意

仅支持文件 URL。

元数据

读取音频属性和元数据同样简单

if let audioFile = try? AudioFile(readingPropertiesAndMetadataFrom: url) {
    let sampleRate = audioFile.properties.sampleRate
    let title = audioFile.metadata.title
}

转换

想要将 WAVE 文件转换为 FLAC 吗?

let inputURL = URL(fileURLWithPath: "music.wav")
let outputURL = URL(fileURLWithPath: "music.flac")
try AudioConverter.convert(inputURL, to: outputURL)

输出文件的格式是从文件扩展名推断出来的。

支持更复杂的转换,包括写入 Data 而不是文件

let output = OutputSource.makeForData()
let encoder = try AudioEncoder(outputSource: output, encoderName: .coreAudio)
encoder.settings = [
    .coreAudioFileTypeID: kAudioFileM4AType,
    .coreAudioFormatID: kAudioFormatMPEG4AAC,
    .coreAudioAudioConverterPropertySettings: [kAudioConverterCodecQuality: kAudioConverterQuality_High]
]
try AudioConverter.convert(inputURL, using: encoder)
// Encoder output is in `output.data`

要求

macOS 11.0+、iOS 15.0+ 或 tvOS 15.0+

安装

Swift Package Manager

在 Xcode 中添加对 https://github.com/sbooth/SFBAudioEngine 的包依赖。

手动或自定义构建

  1. 克隆 SFBAudioEngine 仓库。
  2. swift build.

解码

SFBAudioEngine 中的音频解码器大致分为两类:生成 PCM 输出的解码器和生成 DSD 输出的解码器。音频解码器从 SFBInputSource 读取数据,该 SFBInputSource 可能指向文件、缓冲区或数据。

SFBAudioEngine 中的所有音频解码器都实现了 SFBAudioDecoding 协议。生成 PCM 的解码器还实现了 SFBPCMDecoding,而 DSD 解码器实现了 SFBDSDDecoding

还提供了三个特殊的解码器子类,它们包装了底层的音频解码器实例:SFBLoopableRegionDecoderSFBDoPDecoderSFBDSDPCMDecoder。对于可搜索的输入,SFBLoopableRegionDecoder 允许任意循环和重复指定的 PCM 解码器段。SFBDoPDecoderSFBDSDPCMDecoder 包装 DSD 解码器,分别提供 DSD over PCM (DoP) 和 PCM 输出。

播放

SFBAudioPlayerNode

SFBAudioPlayerNodeAVAudioSourceNode 的一个子类,它在 AVAudioEngine 处理图中提供了丰富的播放功能。SFBAudioPlayerNode 支持无缝播放,并通过委托提供全面的状态通知。

SFBAudioPlayer

SFBAudioPlayer 包装一个由 SFBAudioPlayerNode 驱动的 AVAudioEngine 处理图。SFBAudioPlayer 提供完整的播放器功能,无需任何配置,但也可以自定义底层处理图,并通过委托提供丰富的状态通知。

编码

SFBAudioEngine 中的音频编码器处理输入数据并将其转换为输出格式。音频编码器将数据写入 SFBOutputSource,该 SFBOutputSource 可能指向文件、缓冲区或数据。

SFBAudioEngine 中的所有音频编码器都实现了 SFBAudioEncoding 协议。消耗 PCM 的编码器还实现了 SFBPCMEncoding。目前,SFBAudioEngine 中没有消耗 DSD 的编码器。

编码器不支持任意输入格式。编码器使用的处理格式是从所需格式与编码器的设置结合得出的。

转换

SFBAudioConverter 支持高级转换操作。音频转换器从解码器处理格式的音频解码器读取 PCM 音频,将该音频转换为中间 PCM 格式,然后将中间 PCM 音频写入音频编码器,该编码器执行到所需格式的最终转换。

解码器的处理格式和中间格式都必须是 PCM,但不必具有相同的采样率、位深度、通道数或通道布局。

属性和元数据

音频属性和元数据通过 SFBAudioFile 的实例访问。音频属性是只读的,而对于大多数格式,元数据是可写的。音频元数据可以从 SFBAudioFile 的实例获取,也可以直接实例化。

示例音频播放器

提供了两个版本的 SimplePlayer,一个用于 macOS,另一个用于 iOS,以说明 SFBAudioEngine 的用法。

macOS

macOS 版 SimplePlayer 是用 Swift 使用 AppKit 编写的,支持从播放列表无缝顺序播放项目。基本功能包含在一个文件中,PlayerWindowController.swift

iOS

iOS 版 SimplePlayer 是用 Swift 使用 SwiftUI 编写的,支持播放从列表中选择的单个项目。

许可证

SFBAudioEngine 在 MIT 许可证下发布。

为各种音频格式提供支持的开源项目受其自己的许可证的约束,这些许可证在使用 SFBAudioEngine 的默认构建配置时与 MIT 许可证兼容。

LGPL 注意事项

为了保持与 libsndfilempg123libtta-cpplame 和 Musepack 编码器使用的 LGPL 兼容,需要动态链接。