2015-03-27 15 views
5

Bu https://jmacmullin.wordpress.com/2010/11/03/adding-meta-data-to-video-in-ios/ numaralı belgeyi çoğaltmaya çalışıyorum. İşte Swift ios'ta Zamanlanmış Meta Verileri Alma 8 M3U8'den Video Akışı

http://cloudfields.net/blog/metadata-audiostream-mpmovieplayercontroller/

Video çalarken ... İşte

Objective C Timed Metadat in HLS stream

benzer bir şey için ek bir bağlantıdır ... eylem Jake'in kodunun bir video Zamanlanmış meta veriler, tıklandığında web görünümünde belirli bir youtube URL'sine yönlendirmek için bir düğmeyi güncellemelidir. Videom yaklaşık 15 dakika uzunluğunda ve 6 adet zamanlanmış meta veri URL'sine sahip.

Swift'de bunun nasıl gerçekleştirileceğine dair herhangi bir kod veya belge bulamıyorum. Jake'in Hedef C kodunu Bildirim çağrısı için değiştirmeyi başardım. Swift Kod

// Register for meta-data notifications 
NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; 
[center addObserver:self 
     selector:@selector(metadataUpdate:) 
      name:MPMoviePlayerTimedMetadataUpdatedNotification 
     object:nil]; 

 NSNotificationCenter.defaultCenter().addObserver(
      self, 
      selector: "metadataUpdated", 
      name: MPMoviePlayerTimedMetadataUpdatedNotification, 
      object: nil) 

Jake'in Fonksiyon

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 

Beni hayat için Swift

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") 
} 
} 

I meta açmak anlamaya olamaz olsa herhangi bir işlem yapılabilir kod içine. Meta verilerde taşınan URL'ye yönlendiren, ancak bir Dizeye dönüştürülemeyen bir düğme oluşturmam gerekiyor. Herhangi bir yardım büyük beğeni topluyor. İşte şimdiye kadar sahip olduğum şey.

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:", 

      name: MPMoviePlayerTimedMetadataUpdatedNotification, 

      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") 


} 


} 
+0

ben, sorun URL ayrıştırma veya bir dizeye URL dönüştürme yaşıyorsanız sizin sorunu anlamak emin değilim? – Vig

+0

Bir dizeye dönüştürmede sorun yaşıyorum. Sorduğunuz için teşekkürler. Sonuçlarımı göndermemi hatırladım. Teşekkürler! –

cevap

2

Bu yüzden çalışmaya başladım, ancak AVMlayer'ı tercih eden MPMovieController hendek sona erdi. İşte benim kodum ve işlevsel hale getirmeme yardımcı olan başka bir gönderiye bağlantı.

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, forKeyPath: "timedMetadata", options: nil, context: nil) 
    playerItem.addObserver(self, forKeyPath: "presentationSize", options: nil, 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,0,self.view.frame.size.width,self.view.frame.size.height) 
     playerLayer?.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height) 

     println("landscape") 
    } 

    if(UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation)) 
    { 
     self.navigationController?.navigationBarHidden = false 
     playerLayer!.frame = videoView.bounds 

     println("portraight") 
    } 

} 


} 
+0

Swift 3: 'avplayeritem.addObserver (self, forKeyPath:" timedMetadata ", seçenekler: [], context: nil)' ve 'func observeValue (forKeyPath keyPath: String ?, nesnenin: over? : [NSKeyValueChangeKey: Any] ?, bağlam: UnsafeMutableRawPointer?) {' – Jonny

+0

https://stackoverflow.com/questions/44535465/how-to-fetch-resolution-supported-by-video-m38u-file-url-in- hızlı –