Files
Woka_Native_iOS/WOKA/Karaoke/Controller/AVAssetMods.swift
Bilal 945ae7f45c - Fixed TC 16, TC 17
- added activity indicators for more vm with retry handling
- fixed a issue where karaoke user view was not reflecting when the player closed
2024-08-23 20:34:08 +05:30

160 lines
6.0 KiB
Swift

//
// AVAssetMods.swift
// WOKA
//
// Created by MacBook Pro on 09/07/24.
//
import Foundation
import AVKit
extension AVAsset {
// func writeAudioTrackToURL(_ url: URL, completion: @escaping (Bool, Error?, URL?) -> ()) {
// DispatchQueue.global(qos: .userInitiated).async { [weak self] in
// do {
// guard let audioAsset = try self?.audioAsset() else {
// completion(false, nil, nil)
// return
// }
// audioAsset.writeToURL(url, completion: completion)
// } catch let error as NSError {
// DispatchQueue.main.async {
// completion(false, error, nil)
// }
// }
// }
// }
//
// func writeToURL(_ url: URL, completion: @escaping (Bool, Error?, URL?) -> ()) {
// DispatchQueue.global(qos: .userInitiated).async {
// guard let exportSession = AVAssetExportSession(asset: self, presetName: AVAssetExportPresetAppleM4A) else {
// DispatchQueue.main.async {
// completion(false, nil, nil)
// }
// return
// }
//
// let audioMix = AVMutableAudioMix()
// var inputParameters = [AVMutableAudioMixInputParameters]()
// let volume: Float = 0.4
//
// for track in self.tracks(withMediaType: .audio) {
// let audioInputParams = AVMutableAudioMixInputParameters(track: track)
// audioInputParams.setVolume(volume, at: .zero)
// inputParameters.append(audioInputParams)
// }
//
// audioMix.inputParameters = inputParameters
// exportSession.audioMix = audioMix
// exportSession.outputFileType = .m4a
// exportSession.outputURL = url
//
// DispatchQueue.main.async {
// Utilities.startProgressHUD(msg: "Preparing")
// }
//
// exportSession.exportAsynchronously {
// DispatchQueue.main.async {
// switch exportSession.status {
// case .completed:
// Utilities.dismissProgressHUD()
// completion(true, nil, url)
// case .unknown, .waiting, .exporting, .failed, .cancelled:
// Utilities.dismissProgressHUD()
// completion(false, nil, nil)
// @unknown default:
// Utilities.dismissProgressHUD()
// completion(false, nil, nil)
// }
// }
// }
// }
// }
func writeAudioTrackToURL(_ url: URL, completion: @escaping (Bool, Error?, URL?) -> ()) {
do {
let audioAsset = try self.audioAsset()
audioAsset.writeToURL(url, completion: completion)
} catch (let error as NSError){
completion(false, error, nil)
}
}
func writeToURL(_ url: URL, completion: @escaping (Bool, Error?, URL?) -> ()) {
guard let exportSession = AVAssetExportSession(asset: self, presetName: AVAssetExportPresetAppleM4A) else {
completion(false, nil , nil)
return
}
// Utilities.startProgressHUD(msg: "Preparing")
// Create an AVMutableAudioMix to adjust the volume
let audioMix = AVMutableAudioMix()
var inputParameters = [AVMutableAudioMixInputParameters]()
// Decrease the volume by setting the volume to a value less than 1.0
let volume : Float = 0.4 // Adjust the volume level as needed (e.g., 0.5 for half volume)
// Create an AVMutableAudioMixInputParameters instance for each audio track
for track in self.tracks(withMediaType: .audio) {
let audioInputParams = AVMutableAudioMixInputParameters(track: track)
audioInputParams.setVolume(volume, at: .zero) // Set the volume for the audio track
inputParameters.append(audioInputParams)
}
// Assign the input parameters to the audio mix
audioMix.inputParameters = inputParameters
// Set the audio mix for the export session
exportSession.audioMix = audioMix
// Configure export session and start exporting
exportSession.outputFileType = .m4a
exportSession.outputURL = url
exportSession.exportAsynchronously {
switch exportSession.status {
case .completed:
Utilities.dismissProgressHUD()
completion(true, nil, url)
case .unknown, .waiting, .exporting, .failed, .cancelled:
Utilities.dismissProgressHUD()
completion(false, nil, nil)
@unknown default:
Utilities.dismissProgressHUD()
completion(false, nil, nil)
}
}
}
func audioAsset() throws -> AVAsset {
let composition = AVMutableComposition()
let audioTracks = tracks(withMediaType: .audio)
for track in audioTracks {
let compositionTrack = composition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid)
try compositionTrack?.insertTimeRange(track.timeRange, of: track, at: track.timeRange.start)
compositionTrack?.preferredTransform = track.preferredTransform
}
return composition
}
}
extension FileManager {
func clearTmpDirectory() {
do {
let tmpDirURL = FileManager.default.temporaryDirectory
let tmpDirectory = try contentsOfDirectory(atPath: tmpDirURL.path)
try tmpDirectory.forEach { file in
let fileUrl = tmpDirURL.appendingPathComponent(file)
try removeItem(atPath: fileUrl.path)
}
} catch {
//catch the error somehow
}
}
}