从M3U8流视频获取Swift ios 8中的定时元数据
发布时间:2020-12-14 02:23:37 所属栏目:百科 来源:网络整理
导读:我试图在 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/metad
我试图在
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.这是我的代码,以及帮助我??实现其功能的另一篇帖子的链接.
Timed Metadata with 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") } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |