从M3U8流媒体视频中获取Swift ios 8中的定时元数据 [英] Getting Timed Metadata in Swift ios 8 From M3U8 Streaming Video
问题描述
我正在尝试复制此 https://jmacmullin.wordpress.com/2010/11/03/adding-meta-data-to-video-in-ios/ 。
以下是Jake代码的实际视频......
Here is a video of Jake's code in action...
以下是类似内容的附加链接...
Here is an additional link to something similar...
http://cloudfields.net/blog/metadata-audiostream-mpmovieplayercontroller/
当我的视频正在播放时,元数据应该会更新按钮,以便在点击时重定向到网页浏览中的特定YouTube视频网址。我的视频大约15分钟,有6个定时元数据网址。
When my video is playing timed metadata should update a button to redirect to a specific youtube url in a webview when clicked. My video is roughly 15 min long and has 6 timed metadata urls.
我无法在Swift中找到任何关于如何实现此目的的代码或文档。我设法将Jake的Objective C代码转换为他的Notification调用。
I can't find any code or documentation anywhere on how to achieve this in Swift. I've managed to convert Jake's Objective C code for his Notification call.
// Register for meta-data notifications
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(metadataUpdate:)
name:MPMoviePlayerTimedMetadataUpdatedNotification
object:nil];
到Swift代码
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
到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")
}
}
对于我的生活虽然我无法弄清楚如何将元数据转化为任何可操作的码。我真的需要创建一个重定向到元数据中携带的URL的按钮,但不能将其转换为String。任何帮助是极大的赞赏。以下是我到目前为止的情况。
For the life of me though I cant figure out how to turn the metadata into any actionable code. I really need to create a button that redirects to the URL carried in the metadata, but can't convert it to a String. Any help is greatly appreciated. Here is what i have so far.
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")
}
}
推荐答案
所以我让这个工作,但最终ditch MPMovieController选择AVPlayer。这是我的代码,以及帮助我使其正常运行的其他帖子的链接。
So I got this to work, but ended up ditch MPMovieController opting for AVPlayer. Here is my code, and the link to another post that helped me get it functional.
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")
}
}
}
这篇关于从M3U8流媒体视频中获取Swift ios 8中的定时元数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!