Skip to content

Instantly share code, notes, and snippets.

@bibscy
Last active December 10, 2018 15:41
Show Gist options
  • Save bibscy/e5426dc137372cbe027ecf0c472f2708 to your computer and use it in GitHub Desktop.
Save bibscy/e5426dc137372cbe027ecf0c472f2708 to your computer and use it in GitHub Desktop.
import UIKit
import MediaPlayer
import AVFoundation
class FirstViewController: UIViewController, MPMediaPickerControllerDelegate {
@IBAction func loadMusic(_ sender: Any) {
let mediaPicker: MPMediaPickerController = MPMediaPickerController.self(mediaTypes:MPMediaType.music)
mediaPicker.delegate = self
mediaPicker.allowsPickingMultipleItems = false
self.present(mediaPicker, animated: true, completion: nil)
}
// MPMediaPickerController Delegate methods
func mediaPickerDidCancel(_ mediaPicker: MPMediaPickerController) {
self.dismiss(animated: true, completion: nil)
}
func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
self.dismiss(animated: true, completion: nil)
guard let mediaItem = mediaItemCollection.items[0] as? MPMediaItem else {return}
let mediaItemURL = mediaItem.value(forProperty: MPMediaItemPropertyAssetURL) as! URL
let theAsset = AVAsset(url: mediaItemURL as URL)
if theAsset.hasProtectedContent {
print("theAsset hasProtectedContent")
return
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.playSound(url: mediaItemURL)
}
}//end didPickMediaItems
var player: AVAudioPlayer?
func playSound(url: URL) {
do {
try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try! AVAudioSession.sharedInstance().setActive(true)
player = try AVAudioPlayer(contentsOf: url)
player?.play()
self.addPeriodicTimeObserver()
} catch let error {
print(error.localizedDescription)
}
}
var otherPlayer: AVPlayer!
var timeObserverToken: Any?
func addPeriodicTimeObserver() {
// Invoke callback every half second
let interval = CMTime(seconds: 0.5,
preferredTimescale: CMTimeScale(NSEC_PER_SEC))
// Queue on which to invoke the callback
let mainQueue = DispatchQueue.main
// Add time observer
timeObserverToken =
otherPlayer.addPeriodicTimeObserver(forInterval: interval, queue: mainQueue) {
[weak self] time in
// update player transport UI
print("time is \(time)") //it is never called
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment