From baf7d5e72acff31dfc3c2128d158666fde96d9ca Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Fri, 18 Oct 2024 15:51:56 -0700 Subject: [PATCH] Make audio/video settings Hashable, Sendable, and Codable --- .../AudioOutputSettings.swift | 17 ++++++----------- .../SJSAssetExportSession/ExportSession.swift | 5 ++++- .../VideoOutputSettings.swift | 8 ++++---- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/Sources/SJSAssetExportSession/AudioOutputSettings.swift b/Sources/SJSAssetExportSession/AudioOutputSettings.swift index 7e9d863..f2f4764 100644 --- a/Sources/SJSAssetExportSession/AudioOutputSettings.swift +++ b/Sources/SJSAssetExportSession/AudioOutputSettings.swift @@ -5,12 +5,12 @@ // Created by Sami Samhuri on 2024-07-07. // -public import AVFoundation +import AVFoundation /// A convenient API for constructing audio settings dictionaries. /// -/// Construct this by starting with ``AudioOutputSettings/default`` or ``AudioOutputSettings/format(_:)`` and then chain calls to further customize it, if desired, using ``channels(_:)``, ``sampleRate(_:)``, and ``mix(_:)``. -public struct AudioOutputSettings { +/// Construct this by starting with ``AudioOutputSettings/default`` or ``AudioOutputSettings/format(_:)`` and then chain calls to further customize it, if desired, using ``channels(_:)``, and ``sampleRate(_:)``. +public struct AudioOutputSettings: Hashable, Sendable, Codable { /// Describes the output file format. public enum Format { /// Advanced Audio Codec. The audio format typically used for MPEG-4 audio. @@ -29,7 +29,6 @@ public struct AudioOutputSettings { let format: AudioFormatID let channels: Int let sampleRate: Int? - let mix: AVAudioMix? /// Specifies the AAC format with 2 channels at a 44.1 KHz sample rate. public static var `default`: AudioOutputSettings { @@ -38,19 +37,15 @@ public struct AudioOutputSettings { /// Specifies the given format with 2 channels. public static func format(_ format: Format) -> AudioOutputSettings { - .init(format: format.formatID, channels: 2, sampleRate: nil, mix: nil) + .init(format: format.formatID, channels: 2, sampleRate: nil) } public func channels(_ channels: Int) -> AudioOutputSettings { - .init(format: format, channels: channels, sampleRate: sampleRate, mix: mix) + .init(format: format, channels: channels, sampleRate: sampleRate) } public func sampleRate(_ sampleRate: Int?) -> AudioOutputSettings { - .init(format: format, channels: channels, sampleRate: sampleRate, mix: mix) - } - - public func mix(_ mix: sending AVAudioMix?) -> AudioOutputSettings { - .init(format: format, channels: channels, sampleRate: sampleRate, mix: mix) + .init(format: format, channels: channels, sampleRate: sampleRate) } public var settingsDictionary: [String: any Sendable] { diff --git a/Sources/SJSAssetExportSession/ExportSession.swift b/Sources/SJSAssetExportSession/ExportSession.swift index f844da2..d5177d7 100644 --- a/Sources/SJSAssetExportSession/ExportSession.swift +++ b/Sources/SJSAssetExportSession/ExportSession.swift @@ -30,6 +30,8 @@ public final class ExportSession: Sendable { - audio: Optional audio settings using ``AudioOutputSettings``. Defaults to ``AudioOutputSettings/default``. + - mix: An optional mix that can be used to manipulate the audio in some way. + - video: Video settings using ``VideoOutputSettings``. - outputURL: The file `URL` where the exported video will be written. @@ -44,6 +46,7 @@ public final class ExportSession: Sendable { metadata: sending [AVMetadataItem] = [], timeRange: CMTimeRange? = nil, audio: sending AudioOutputSettings = .default, + mix: sending AVAudioMix? = nil, video: sending VideoOutputSettings, to outputURL: URL, as fileType: AVFileType @@ -54,7 +57,7 @@ public final class ExportSession: Sendable { let sampleWriter = try await SampleWriter( asset: asset, audioOutputSettings: audio.settingsDictionary, - audioMix: audio.mix, + audioMix: mix, videoOutputSettings: video.settingsDictionary, videoComposition: videoComposition, timeRange: timeRange, diff --git a/Sources/SJSAssetExportSession/VideoOutputSettings.swift b/Sources/SJSAssetExportSession/VideoOutputSettings.swift index 079df0f..8e48163 100644 --- a/Sources/SJSAssetExportSession/VideoOutputSettings.swift +++ b/Sources/SJSAssetExportSession/VideoOutputSettings.swift @@ -12,9 +12,9 @@ import AVFoundation /// Construct this by starting with ``VideoOutputSettings/codec(_:size:)`` or ``VideoOutputSettings/codec(_:width:height:)`` and then chaining calls to further customize it, if desired, using ``fps(_:)``, ``bitrate(_:)``, and ``color(_:)``. /// /// Setting the fps and colour also needs support from the `AVVideoComposition` and these settings can be applied to them with ``VideoOutputSettings/apply(to:)``. -public struct VideoOutputSettings { +public struct VideoOutputSettings: Hashable, Sendable, Codable { /// Describes an H.264 encoding profile. - public enum H264Profile { + public enum H264Profile: Hashable, Sendable, Codable { case baselineAuto, baseline30, baseline31, baseline41 case mainAuto, main31, main32, main41 case highAuto, high40, high41 @@ -37,7 +37,7 @@ public struct VideoOutputSettings { } /// Specifies the output codec. - public enum Codec { + public enum Codec: Hashable, Sendable, Codable { /// H.264 using the associated encoding profile. case h264(H264Profile) /// HEVC / H.265 @@ -64,7 +64,7 @@ public struct VideoOutputSettings { } /// Specifies whether to use Standard Dynamic Range or High Dynamic Range colours. - public enum Color { + public enum Color: Hashable, Sendable, Codable { /// Standard dynamic range colours (BT.709 which roughly corresponds to SRGB) case sdr /// High dynamic range colours (BT.2020)