mirror of
https://github.com/samsonjs/SJSAssetExportSession.git
synced 2026-03-25 08:45:50 +00:00
142 lines
5.3 KiB
Swift
142 lines
5.3 KiB
Swift
//
|
|
// ReadmeExamples.swift
|
|
// SJSAssetExportSessionTests
|
|
//
|
|
// Created by Sami Samhuri on 2024-08-18.
|
|
//
|
|
|
|
import AVFoundation
|
|
import SJSAssetExportSession
|
|
|
|
private func readmeNiceExample() async throws {
|
|
let sourceURL = URL.documentsDirectory.appending(component: "some-video.mov")
|
|
let sourceAsset = AVURLAsset(url: sourceURL, options: [
|
|
AVURLAssetPreferPreciseDurationAndTimingKey: true,
|
|
])
|
|
let destinationURL = URL.temporaryDirectory.appending(component: "shiny-new-video.mp4")
|
|
let exporter = ExportSession()
|
|
Task {
|
|
for await progress in exporter.progressStream {
|
|
print("Export progress: \(progress)")
|
|
}
|
|
}
|
|
|
|
try await exporter.export(
|
|
asset: sourceAsset,
|
|
video: .codec(.h264, width: 1280, height: 720),
|
|
to: destinationURL,
|
|
as: .mp4
|
|
)
|
|
}
|
|
|
|
private func readmeCompleteNiceExample() async throws {
|
|
let sourceURL = URL.documentsDirectory.appending(component: "some-video.mov")
|
|
let sourceAsset = AVURLAsset(url: sourceURL, options: [
|
|
AVURLAssetPreferPreciseDurationAndTimingKey: true,
|
|
])
|
|
let destinationURL = URL.temporaryDirectory.appending(component: "shiny-new-video.mp4")
|
|
let exporter = ExportSession()
|
|
Task {
|
|
for await progress in exporter.progressStream {
|
|
print("Export progress: \(progress)")
|
|
}
|
|
}
|
|
|
|
let locationMetadata = AVMutableMetadataItem()
|
|
locationMetadata.key = AVMetadataKey.commonKeyLocation.rawValue as NSString
|
|
locationMetadata.keySpace = .common
|
|
locationMetadata.value = "+48.50176+123.34368/" as NSString
|
|
try await exporter.export(
|
|
asset: sourceAsset,
|
|
optimizeForNetworkUse: true,
|
|
metadata: [locationMetadata],
|
|
timeRange: CMTimeRange(start: .zero, duration: .seconds(1)),
|
|
audio: .format(.mp3).channels(1).sampleRate(22_050),
|
|
video: .codec(.h264, width: 1280, height: 720)
|
|
.fps(24)
|
|
.bitrate(1_000_000)
|
|
.color(.sdr),
|
|
to: destinationURL,
|
|
as: .mp4
|
|
)
|
|
}
|
|
|
|
private func readmeFlexibleExample() async throws {
|
|
let sourceURL = URL.documentsDirectory.appending(component: "some-video.mov")
|
|
let sourceAsset = AVURLAsset(url: sourceURL, options: [
|
|
AVURLAssetPreferPreciseDurationAndTimingKey: true,
|
|
])
|
|
let destinationURL = URL.temporaryDirectory.appending(component: "shiny-new-video.mp4")
|
|
let exporter = ExportSession()
|
|
Task {
|
|
for await progress in exporter.progressStream {
|
|
print("Export progress: \(progress)")
|
|
}
|
|
}
|
|
|
|
let locationMetadata = AVMutableMetadataItem()
|
|
locationMetadata.key = AVMetadataKey.commonKeyLocation.rawValue as NSString
|
|
locationMetadata.keySpace = .common
|
|
locationMetadata.value = "+48.50176+123.34368/" as NSString
|
|
|
|
let videoComposition = try await AVMutableVideoComposition.videoComposition(withPropertiesOf: sourceAsset)
|
|
videoComposition.renderSize = CGSize(width: 1280, height: 720)
|
|
videoComposition.sourceTrackIDForFrameTiming = kCMPersistentTrackID_Invalid
|
|
videoComposition.frameDuration = CMTime(value: 600 / 24, timescale: 600) // 24 fps
|
|
videoComposition.colorPrimaries = AVVideoColorPrimaries_ITU_R_709_2
|
|
videoComposition.colorTransferFunction = AVVideoTransferFunction_ITU_R_709_2
|
|
videoComposition.colorYCbCrMatrix = AVVideoYCbCrMatrix_ITU_R_709_2
|
|
try await exporter.export(
|
|
asset: sourceAsset,
|
|
optimizeForNetworkUse: true,
|
|
metadata: [locationMetadata],
|
|
timeRange: CMTimeRange(start: .zero, duration: .seconds(1)),
|
|
audioOutputSettings: [
|
|
AVFormatIDKey: kAudioFormatMPEGLayer3,
|
|
AVNumberOfChannelsKey: NSNumber(value: 1),
|
|
AVSampleRateKey: NSNumber(value: 22_050),
|
|
],
|
|
videoOutputSettings: [
|
|
AVVideoCodecKey: AVVideoCodecType.h264.rawValue,
|
|
AVVideoCompressionPropertiesKey: [
|
|
AVVideoProfileLevelKey: AVVideoProfileLevelH264HighAutoLevel,
|
|
AVVideoAverageBitRateKey: NSNumber(value: 1_000_000),
|
|
] as [String: any Sendable],
|
|
AVVideoColorPropertiesKey: [
|
|
AVVideoColorPrimariesKey: AVVideoColorPrimaries_ITU_R_709_2,
|
|
AVVideoTransferFunctionKey: AVVideoTransferFunction_ITU_R_709_2,
|
|
AVVideoYCbCrMatrixKey: AVVideoYCbCrMatrix_ITU_R_709_2,
|
|
],
|
|
],
|
|
composition: videoComposition,
|
|
to: destinationURL,
|
|
as: .mp4
|
|
)
|
|
}
|
|
|
|
private func readmeMixAndMatchExample() async throws {
|
|
let sourceURL = URL.documentsDirectory.appending(component: "some-video.mov")
|
|
let sourceAsset = AVURLAsset(url: sourceURL, options: [
|
|
AVURLAssetPreferPreciseDurationAndTimingKey: true,
|
|
])
|
|
let destinationURL = URL.temporaryDirectory.appending(component: "shiny-new-video.mp4")
|
|
let exporter = ExportSession()
|
|
Task {
|
|
for await progress in exporter.progressStream {
|
|
print("Export progress: \(progress)")
|
|
}
|
|
}
|
|
|
|
var audioSettings = AudioOutputSettings.default.settingsDictionary
|
|
audioSettings[AVVideoAverageBitRateKey] = 65_536
|
|
let videoSettings = VideoOutputSettings
|
|
.codec(.hevc, width: 1280, height: 720)
|
|
.settingsDictionary
|
|
try await exporter.export(
|
|
asset: sourceAsset,
|
|
audioOutputSettings: audioSettings,
|
|
videoOutputSettings: videoSettings,
|
|
to: destinationURL,
|
|
as: .mp4
|
|
)
|
|
}
|