I am attempting to convert the url that is in my audio player to an AVAsset so that I am able to manipulate the audio track to my liking. ( I just want to be able to trim the file). Unfortunately I am running into an issue where the asset is not correctly converting. When I print the duration of the audio url before I convert it, it will correctly print out the duration. Unfortunately when I convert it to the AVAsset, it says the duration is 0. What is going on? Any guidance would be much appreciated!
func trimmingFunc() {
try? audioPlayer = AVAudioPlayer(contentsOf: audioURL!)
passingTime = audioPlayer.duration
audioPlayer.delegate = self
let currentDuration = audioPlayer.duration
print(currentDuration) //correctly prints duration
let filePath = URL(fileURLWithPath: (("\(String(describing: audioPlayer.url!))")))
print(filePath) //correctly prints filePath
let currentAsset = AVAsset(url: filePath)
print(CMTimeGetSeconds(currentAsset.duration) //This is printing 0
}
Loading an AVAsset
is asynchronous operation. You should wait until it will be prepared. The most efficient way to "wait" is using KVO.
In your class, let it be ViewController
, make AVAsset
the member and call your trimmingFunc
somewhere:
class ViewController: UIViewController {
var currentAsset: AVAsset?
override func viewDidLoad() {
super.viewDidLoad()
self.trimmingFunc()
}
....
In your trimmingFunc
, subscribe for notifications of currentAsset
:
func trimmingFunc() {
let audioURL = URL.init(fileURLWithPath: Bundle.main.path(forResource: "Be That Man", ofType: "mp3")!)
print("audioURL=\(audioURL)")
currentAsset = AVAsset(url: audioURL)
let options = NSKeyValueObservingOptions([.new, .old, .initial, .prior])
currentAsset!.addObserver(self, forKeyPath: "duration", options: options, context: nil)
}
To receive that notifications, override function observeValue
of NSObject
:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print("\(keyPath): \(change?[.newKey])")
print(CMTimeGetSeconds(currentAsset!.duration)) //This is printing 0
}
So, if you had file "Be That Man.mp3" in resources, after few milliseconds you would see duration = 202.945306122449
Full code of ViewController is here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With