Last active
December 10, 2018 15:41
-
-
Save bibscy/e5426dc137372cbe027ecf0c472f2708 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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