SDWebImageAVIFCoder

Build Status Version License Platform SwiftPM compatible Carthage compatible

用途

这是一个 SDWebImage 编码器插件,用于增加 AV1 图像文件格式 (AVIF) 的支持。它基于开源的 libavif 编解码器构建。

此 AVIF 编码器插件支持 AVIF 静态/序列图像。包括 Alpha 通道,以及 10bit/12bit/16bit HDR 图像。(AVIF 序列动画从 v0.9.0 开始可用)。

现在也支持 AVIF 编码。它总是编码为 8 位深度图像。

请参阅演示以了解更多展示。

注意

AVIF 图像规范仍在发展中。当前的 AVIF 上游编解码器是一个简单的实现。对于大型图像,编码时间可能会很长。

由于我们依赖于外部编解码器 libavif,我们会定期更新依赖项并更新版本。请确保尽可能使用最新版本 :)

AV1 编解码器

libavif 是一个图像编解码器。但 AVIF 基于 AV1 视频标准。因此它需要一个 AV1 编解码器来支持。这种关系就像 HEIF (图像) 和 HEVC (视频) 编解码器一样。

您可以选择编解码器,并使用 libavif CocoaPods subspec 来选择您想要的编解码器。

aom

libavif 构建时支持 aom 编解码器。 aom 是标准草案实施期间的第一个 AV1 编解码器。 aom 支持解码和编码。

由于 subspec 依赖关系解析算法 的奇怪设计,我们不能默认使用 aom(否则所有 subspec 将始终链接 aom,这意味着不是可选的)。因此,libavif 构建时没有使用任何编解码器 (libavif/core)。您需要使用以下一个或多个来选择实际的 AV1 编解码器。

如果要使用 aom,请使用

pod 'libavif/liaom'

或者其他 AV1 编解码器,例如 dav1d

pod 'libavif/libdav1d'

dav1d(解码)

dav1d 是新一代 AV1 编解码器,专注于速度和正确性。

查看更多关于 为什么启动一个新项目而不是改进 aom 的解释

从 v0.3.0 开始,libavif 可以使用 dav1d 构建。对于 CocoaPods 用户,您可以简单地使用 subspec。目前不支持 Carthage 的可选 dav1d 编解码器。

libgav1(解码)

libgav1 是一个符合 Main profile (0) & High profile (1) 的 AV1 解码器。 有关 AV1 视频格式的更多信息,请访问 aomedia.org。

从 v0.8.3 开始,libavif 可以使用 libgav1 构建。 对于 CocoaPods 用户,您可以简单地使用 subspec。

rav1e (编码)

rav1e 是最快、最安全的 AV1 编码器。它使用 Rust 编程语言 来提供比 aom 更快、更安全的编解码器。 在目前的形式下,它最适合 libaom(参考编码器)速度太慢的情况。

查看更多关于 性能

从 v0.4.3 开始,libavif 可以使用 rav1e 构建。对于 CocoaPods 用户,您可以简单地使用 subspec。目前不支持 Carthage/SPM 的可选 rav1c 编解码器。

注意:CocoaPods 上的 librav1e 使用预构建的静态链接二进制文件。这意味着,它不能用于 CocoaPods 的动态链接。

要用于框架包格式(CocoaPods 默认使用 ar 存档格式),您应该这样写

use_frameworks! :linkage => :static

而不是这样

use_frameworks!
# use_frameworks! :linkage => :dynamic

注意:在 librav1e v0.6.1 之前,它只支持 iOS && macOS。 watchOS 和 tvOS 从 v0.6.2 开始通过最新的 Rust 工具链可用。 visionOS 的支持需要 Rust 社区的上游支持。 对于最新的集成,请检查或在 https://github.com/SDWebImage/librav1e-Xcode 中提出问题。

SVT-AV1 (编码)

SVT-AV1 是用于 AV1 的可扩展视频技术(SVT-AV1 编码器和解码器)是一个符合 AV1 标准的编码器/解码器库核心。

从 v0.8.3 开始,libavif 可以使用 STV-AV1 构建。 对于 CocoaPods 用户,您可以简单地使用 subspec。

在运行时选择编解码器

尽管 libavif 具有自动检测已安装的 AVIF 编解码器的功能,但例如,aom 支持解码和编码,但在编码方面比 rav1e 慢。

您可以强制使用 aom 进行解码,使用 rav1e 进行编码,如下所示

NSDictionary *decodeOptions = [SDImageCoderAVIFDecodeCodecChoice: @(AVIF_CODEC_CHOICE_AOM)];
NSDictionary *encodeOptions = [SDImageCoderAVIFEncodeCodecChoice: @(AVIF_CODEC_CHOICE_RAV1E)];

// Pass from UI level options
[imageView sd_setImageWithURL:url placeholderImage:nil options:0 context:@{SDWebImageContextImageDecodeOptions: decodeOptions, SDWebImageContextImageEncodeOptions: encodeOptions} progress:nil completed:nil];
let decodeOptions: [SDImageCoderOption: Any] = [.avifDecodeCodecChoice: AVIF_CODEC_CHOICE_AOM.rawValue]
let encodeOptions = [SDImageCoderOption: Any] = [.avifEncodeCodecChoice: AVIF_CODEC_CHOICE_RAV1E.rawValue]

// Pass from UI level options
imageView.sd_setImage(with: url, placeholderImage: nil, options: [], context: [.imageDecodeOptions: decodeOptions, .imageEncodeOptions: encodeOptions], progress: nil, completed: nil)

要求

安装

CocoaPods

SDWebImageAVIFCoder 可通过 CocoaPods 获得。 要使用默认的 aom AV1 编解码器进行安装,只需将以下行添加到您的 Podfile 中

pod 'SDWebImageAVIFCoder'

注意:从版本 0.4.0 开始,如果您想使用 rav1e 或 dav1e 而不是 aom 来获得更快的 AV1 编解码器,请控制 libavif 的 subspec

pod 'SDWebImageAVIFCoder'
pod 'libavif', :subspecs => [
  'libdav1d',
  'librav1e'
]

或者,对于 libgav1 && SVT-AV1,使用

pod 'SDWebImageAVIFCoder'
pod 'libavif', :subspecs => [
  'libgva1',
  'SVT-AV1'
]

注意:从版本 0.2.0 开始,依赖项 libavif 和 libaom 使用可移植的 C 实现来在 Apple 平台上工作。 如果您需要使用 SIMD/AVX 和汇编优化的预构建库,请尝试 0.1.0 版本。

Carthage

SDWebImageAVIFCoder 可通过 Carthage 获得。

github "SDWebImage/SDWebImageAVIFCoder"

Carthage 不支持像 CocoaPods 的 subspec 那样的功能,它只支持 libaom 用于 AVIF 解码和编码。

Swift Package Manager (Xcode 11+)

SDWebImageAVIFCoder 可通过 Swift Package Manager 获得。

通过 SwiftPM 获得的框架只支持 libaom 用于 AVIF 解码和编码。

let package = Package(
    dependencies: [
        .package(url: "https://github.com/SDWebImage/SDWebImageAVIFCoder.git", from: "0.5")
    ]
)

用法

要使用 AVIF 编码器,您应该首先将 SDImageAVIFCoder.sharedCoder 添加到编码器管理器。 然后,您可以调用 View Category 方法来开始加载 AVIF 图像。

SDImageAVIFCoder *AVIFCoder = SDImageAVIFCoder.sharedCoder;
[[SDImageCodersManager sharedManager] addCoder:AVIFCoder];
UIImageView *imageView;
[imageView sd_setImageWithURL:url];
let AVIFCoder = SDImageAVIFCoder.shared
SDImageCodersManager.shared.addCoder(AVIFCoder)
let imageView: UIImageView
imageView.sd_setImage(with: url)

解码

// AVIF image decoding
NSData *avifData;
UIImage *image = [[SDImageAVIFCoder sharedCoder] decodedImageWithData:avifData options:nil];
// AVIF image decoding
let avifData: Data
let image = SDImageAVIFCoder.shared.decodedImage(with: data, options: nil)

缩略图解码 (0.10.0+)

// AVIF thumbnail image decoding
NSData *avifData;
CGSize thumbnailSize = CGSizeMake(300, 300);
UIImage *thumbnailImage = [[SDImageAVIFCoder sharedCoder] decodedImageWithData:avifData options:@{SDImageCoderDecodeThumbnailPixelSize : @(thumbnailSize)}];
// AVIF thumbnail image decoding
let avifData: Data
let thumbnailSize = CGSize(width: 300, height: 300)
let image = SDImageAVIFCoder.shared.decodedImage(with: data, options: [.decodeThumbnailPixelSize: thumbnailSize])

编码 (不支持动画)

// AVIF image encoding
UIImage *image;
NSData *avifData = [[SDImageAVIFCoder sharedCoder] encodedDataWithImage:image format:SDImageFormatAVIF options:nil];
// Encode Quality
NSData *lossyAVIFData = [[SDImageAVIFCoder sharedCoder] encodedDataWithImage:image format:SDImageFormatAVIF options:@{SDImageCoderEncodeCompressionQuality : @(0.1)}]; // [0, 1] compression quality
// AVIF image encoding
let image: UIImage
let avifData = SDImageAVIFCoder.shared.encodedData(with: image, format: .avif, options: nil)
// Encode Quality
let lossyAVIFData = SDImageAVIFCoder.shared.encodedData(with: image, format: .avif, options: [.encodeCompressionQuality: 0.1]) // [0, 1] compression quality

截图

图像来自 AV1 静态图像文件格式规范测试文件

AVIF 图像查看器

AVIF 是一种新的图像格式,缺乏相关的工具链,如浏览器或桌面查看器支持。

您可以尝试在 macOS 上使用 AVIFQuickLook QuickLook 插件在 Finder 中查看它。

您还可以尝试使用 avif.js 通过 Chrome 的 AV1 编解码器在线查看它。

测试

SDWebImageAVIFCoder 使用 GitHub Actions 进行测试。 每个合并请求都将运行测试用例,以确保 AVIF 解码/编码功能正常工作。

当前的测试用例使用 macOS 命令行工具,将 AVIF 样本解码结果与 ImageMagick 进行比较。

我们还有 XCTest 单元测试目标,您可以使用 Xcode 的 Test 操作来运行它。

作者

DreamPiggy, lizhuoli1126@126.com

贡献者

ledyba-z, ryo.hirafuji@gmail.com

许可证

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

感谢