mirror of
https://github.com/samsonjs/SJSAssetExportSession.git
synced 2026-03-25 08:45:50 +00:00
50 lines
1.5 KiB
Swift
50 lines
1.5 KiB
Swift
//
|
|
// BaseTests.swift
|
|
// SJSAssetExportSession
|
|
//
|
|
// Created by Sami Samhuri on 2025-01-19.
|
|
//
|
|
|
|
import AVFoundation
|
|
import Foundation
|
|
import Testing
|
|
|
|
class BaseTests {
|
|
func resourceURL(named name: String) -> URL {
|
|
Bundle.module.resourceURL!.appending(component: name)
|
|
}
|
|
|
|
func makeAsset(url: URL) -> sending AVAsset {
|
|
AVURLAsset(url: url, options: [
|
|
AVURLAssetPreferPreciseDurationAndTimingKey: true,
|
|
])
|
|
}
|
|
|
|
func makeTemporaryURL(function: String = #function) -> AutoDestructingURL {
|
|
let timestamp = Int(Date.now.timeIntervalSince1970)
|
|
let f = function.replacing(/[\(\)]/, with: { _ in "" })
|
|
let filename = "\(Self.self)_\(f)_\(timestamp).mp4"
|
|
let url = URL.temporaryDirectory.appending(component: filename)
|
|
return AutoDestructingURL(url: url)
|
|
}
|
|
|
|
func makeVideoComposition(
|
|
assetURL: URL,
|
|
size: CGSize? = nil,
|
|
fps: Int? = nil
|
|
) async throws -> sending AVMutableVideoComposition {
|
|
let asset = makeAsset(url: assetURL)
|
|
let videoComposition = try await AVMutableVideoComposition.videoComposition(
|
|
withPropertiesOf: asset
|
|
)
|
|
if let size {
|
|
videoComposition.renderSize = size
|
|
}
|
|
if let fps {
|
|
let seconds = 1.0 / TimeInterval(fps)
|
|
videoComposition.sourceTrackIDForFrameTiming = kCMPersistentTrackID_Invalid
|
|
videoComposition.frameDuration = CMTime(seconds: seconds, preferredTimescale: 600)
|
|
}
|
|
return videoComposition
|
|
}
|
|
}
|