我试图在
swift中复制这个
https://jmacmullin.wordpress.com/2010/11/03/adding-meta-data-to-video-in-ios/.
这是杰克的代码在行动中的视频……
Objective C Timed Metadat in HLS stream
这是类似的东西的附加链接……
http://cloudfields.net/blog/metadata-audiostream-mpmovieplayercontroller/
当我的视频正在播放定时元数据时,应该更新按钮以在单击时重定向到webview中的特定youtube网址.我的视频大约15分钟,有6个定时元数据网址.
我无法在Swift中找到任何关于如何实现此目的的代码或文档.我已经设法将Jake的Objective C代码转换为他的Notification调用.
// Register for Meta-data notifications NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(MetadataUpdate:) name:MPMoviePlayerTimedMetadataUpdatedNotification object:nil];
到Swift Code
NSNotificationCenter.defaultCenter().addObserver( self,selector: "MetadataUpdated",name: MPMoviePlayerTimedMetadataUpdatedNotification,object: nil)
杰克的功能
Actor *actor = [[Actor alloc] init]; if ([player timedMetadata]!=nil && [[player timedMetadata] count] > 0) { for (MPTimedMetadata *Metadata in [player timedMetadata]) { if ([[Metadata.allMetadata valueForKey:@"key"] isEqualToString:@"TPE1"]) { [actor setName:[Metadata.allMetadata objectForKey:@"value"]]; } if ([[Metadata.allMetadata valueForKey:@"key"] isEqualToString:@"WXXX"]) { NSURL *url = [NSURL URLWithString:[Metadata.allMetadata objectForKey:@"value"]]; [actor setProfileURL:url]; } } } // display some UI element for the user to interact with
到斯威夫特
func MetadataUpdated (notification: NSNotification!) { if moviePlayer?.timedMetadata != nil && moviePlayer?.timedMetadata.count > 0 { for MPTimedMetadata in [moviePlayer?.timedMetadata] { if MPTimedMetadata?.description == ("TPE1") { let name = ("value") } if MPTimedMetadata?.description == ("WXXX") { var url = NSURL.observeValueForKeyPath("value") } } } println("Things are kind of working") } }
对于我的生活,虽然我无法弄清楚如何将元数据转换为任何可操作的代码.我真的需要创建一个重定向到元数据中携带的URL的按钮,但不能将其转换为String.任何帮助是极大的赞赏.这是我到目前为止所拥有的.
import UIKit import MediaPlayer class ViewController: UIViewController { var moviePlayer: MPMoviePlayerController? var youtube = "" override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view,typically from a nib. let url = NSURL(string: "http://path/to/video.m3u8") moviePlayer = MPMoviePlayerController(contentURL: url) if let player = moviePlayer { player.view.frame = CGRect(x: 0,y: 0,width: self.view.frame.size.width,height: self.view.frame.size.height) player.view.sizeToFit() player.scalingMode = MPMovieScalingMode.None player.movieSourceType = MPMovieSourceType.Streaming //player.repeatMode = MPMovieRepeatMode.One player.play() self.view.addSubview(player.view) NSNotificationCenter.defaultCenter().addObserver( self,selector: "MetadataUpdated:",object: nil) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func MetadataUpdated (notification: NSNotification!) { if moviePlayer?.timedMetadata != nil && moviePlayer?.timedMetadata.count > 0 { for MPTimedMetadata in [moviePlayer?.timedMetadata] { if MPTimedMetadata?.description == ("TPE1") { let name = ("value") } if MPTimedMetadata?.description == ("WXXX") { var url = NSURL.observeValueForKeyPath("value") } } } println("Things are kind of working") } }
所以我得到了这个工作,但最终沟渠MPMovieController选择AVPlayer.这是我的代码,以及帮助我实现其功能的另一篇帖子的链接.
import UIKit import MediaPlayer import AVFoundation var youtubeRequest: NSURLRequest! = nil var player : AVPlayer? = nil var url:NSString! class ViewController: UIViewController { var moviePlayer: MPMoviePlayerController? var movieItem: AVPlayerItem! var Player: AVPlayer! var playerLayer : AVPlayerLayer? = nil var asset : AVAsset? = nil var playerItem: AVPlayerItem! var youtubeRequest: NSURLRequest! = nil @IBOutlet var playButtonOutlet: UIBarButtonItem! @IBAction func playButtonAction(sender: AnyObject) {player?.play() playButtonOutlet.enabled = false } @IBOutlet var videoView: UIView! @IBAction func loadURL(sender: AnyObject) {player?.pause() playButtonOutlet.enabled = true } @IBOutlet var urlButton: UIButton! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view,typically from a nib. urlButton.enabled = false let videoURL = NSURL(string: "http://path/to/video.m3u8") playButtonOutlet.enabled = false movieItem = AVPlayerItem(URL: NSURL(string: "http://path/to/video.m3u8")) movieItem.addObserver(self,forKeyPath: "timedMetadata",options: nil,context: nil) Player = AVPlayer(playerItem: movieItem) var MetaArray: Array<Any> = [moviePlayer?.timedMetadata] asset = AVAsset.assetWithURL(videoURL) as? AVAsset playerItem = AVPlayerItem(asset: asset) playerItem = AVPlayerItem(URL: NSURL(string: "http://path/to/video.m3u8")) playerItem.addObserver(self,context: nil) playerItem.addObserver(self,forKeyPath: "presentationSize",context: nil) player = AVPlayer(playerItem: playerItem) playerLayer = AVPlayerLayer(player: player) playerLayer!.frame = videoView.bounds videoView.layer.addSublayer(self.playerLayer) player!.play() NSNotificationCenter.defaultCenter().addObserver( self,selector: "rotated",name: UIDeviceOrientationDidChangeNotification,object: nil) } override func observeValueForKeyPath(keyPath: String,ofObject object: AnyObject,change: [NSObject : AnyObject],context: UnsafeMutablePointer<Void>) -> Void { if keyPath != "timedMetadata" { return } var data: AVPlayerItem = object as AVPlayerItem var urlError = false for item in data.timedMetadata as [AVMetadataItem] { println(item.stringValue) var MetaArray: Array<Any> = [playerItem?.timedMetadata] println("Total objects in array \(MetaArray[0])") var data = item.stringValue url = NSString(string: data) as NSString! if url != nil { urlButton.enabled = true println("The url is \(url)") } else { urlError = true } var urlRedirect = NSURL(fileURLWithPath: "\(url)") println("The url is \(urlRedirect)") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func rotated() { if(UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation)) { self.navigationController?.navigationBarHidden = true playerLayer?.frame = CGRectMake(0,self.view.frame.size.width,self.view.frame.size.height) playerLayer?.frame = CGRectMake(0,self.view.frame.size.height) println("landscape") } if(UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation)) { self.navigationController?.navigationBarHidden = false playerLayer!.frame = videoView.bounds println("portraight") } } }