web-dev-qa-db-ja.com

Xcode 6-Swift-CMTimeをフロートとしてキャスト

var songs = MPMediaQuery()
var localSongs = songs.items
songList = NSMutableArray(array: localSongs)

tableView.reloadData()

var song = MPMediaItem(coder: songList[0] as NSCoder)

var currentItem = AVPlayerItem(URL: song.valueForProperty(MPMediaItemPropertyAssetURL) as NSURL)

player.replaceCurrentItemWithPlayerItem(currentItem)

player.play()

var songTitle: AnyObject! = song.valueForProperty(MPMediaItemPropertyTitle)

songName.text = songTitle as? String

sliderOutlet.value = Float(player.currentTime()) // <<-Error here

音楽プレーヤーを作成していて、曲の長さをスライダーで表示したいのですが、このエラーが発生します

指定された引数を受け入れる 'init'のオーバーロードが見つかりませんでした

問題はCMTimeをFloatに変換することだと思います。

11
Abdou23

CMTime構造であり、valuetimescaleおよびその他のフィールドが含まれているため、できません。浮動小数点値に「キャスト」するだけです。

幸いなことに、変換関数CMTimeGetSeconds()があります。

let cmTime = player.currentTime()
let floatTime = Float(CMTimeGetSeconds(player.currentTime()))

更新:現在Swift 3、player.currentTimeは、TimeIntervalのタイプエイリアスであるDoubleを返します。したがって、Floatへの変換は次のように簡略化されます。

let floatTime = Float(player.currentTime)
21
Martin R

CMTimeは構造体であり、値、タイムスケール、フラグ、およびエポックが含まれています。したがって、浮動小数点値に単に「キャスト」することはできません。

直接書き込むことで値を使用できます

sliderOutlet.value = Float(player.currentTime().value)

ただし、これはミリ秒単位のプレーヤーの値のみを提供します。秒単位で値を取得するには、次を使用します。

sliderOutlet.value = Float(CMTimeGetSeconds(player.currentTime()))

これは、スライダーの値を正しく設定する方法ではない可能性もあります。

0
Mr. JD Agrawal