mirror of
https://github.com/samsonjs/SJSAssetExportSession.git
synced 2026-03-25 08:45:50 +00:00
Make audio/video settings Hashable, Sendable, and Codable
This commit is contained in:
parent
6a6938817b
commit
baf7d5e72a
3 changed files with 14 additions and 16 deletions
|
|
@ -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] {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue