簡體   English   中英

如何在CMTimeMake的時標Int32中傳遞Float

[英]How to pass Float in CMTimeMake's timescale Int32

我正在CMTimeMake上工作,以便為視頻添加慢動作和快動作效果。 對於快速效果,我們必須按視頻比例除以,對於慢速效果,我們必須按視頻比例除以。

這里是:

let videoScaleFactor = Int64(2)

// Get the scaled video duration
let scaledVideoDuration = (mode == .Faster) ? CMTimeMake(videoAsset.duration.value / videoScaleFactor, videoAsset.duration.timescale) : CMTimeMake(videoAsset.duration.value * videoScaleFactor, videoAsset.duration.timescale)

現在,按照我的要求,有一個滑塊(0.1到2.0之間),用戶可以在其中為慢速和快速效果選擇特定的視頻比例值。 此值即將浮現。

我的問題是當我在上面的代碼中傳遞諸如0.8的Float值時,則:

讓videoScaleFactor = Int64(0.8)//返回我0

我該如何返回精確值0.8? 請建議我。

你寫了:

let videoScaleFactor = Int64(0.8) // this returns me 0

這很正常,因為根據定義,不能有十進制值。 因此0.8 => 0。

而是根據需要的精度使用Float (或Double )。

因此,讓我們嘗試一下:

let videoScaleFactor = Float(0.8)

// Get the scaled video duration
let scaledVideoDuration = (mode == .Faster) ? CMTimeMake(videoAsset.duration.value / videoScaleFactor, videoAsset.duration.timescale) : CMTimeMake(videoAsset.duration.value * videoScaleFactor, videoAsset.duration.timescale)

這引起了另一個問題:

二進制運算符'/'不能應用於類型'CMTimeValue'(aka'Int64')和'Float'的操作數

確實,在Swift中,您無法像這樣操縱各種類型的Int / Float等。

所以要解決它:

let videoScaleFactor = Float(0.8)

// Get the scaled video duration
let scaledVideoDuration = (mode == .Faster) ? CMTimeMake(Float(videoAsset.duration.value) / videoScaleFactor, videoAsset.duration.timescale) : CMTimeMake(Float(videoAsset.duration.value) * videoScaleFactor, videoAsset.duration.timescale)

現在您將Float與其他Float相乘/ Float

func CMTimeMake(_ value: Int64, _ timescale: Int32) -> CMTime

所以CMTimeMake(_:_:)等待一個Int64值,所以您會得到一個錯誤,因為Float(videoAsset.duration.value) / videoScaleFactor (對於第一個)正在返回Float而該方法需要一個Int64。

所以做

let videoScaleFactor = Float(0.8)

// Get the scaled video duration
let scaledVideoDuration = (mode == .Faster) ? CMTimeMake(Int64(Float(videoAsset.duration.value) / videoScaleFactor), videoAsset.duration.timescale) : CMTimeMake(Int64(Float(videoAsset.duration.value) * videoScaleFactor), videoAsset.duration.timescale)

現在應該可以了。

但是我不能離開那個代碼。 您的行很長,很難閱讀。 實際上,您只需修改CMTimeMake(_:_:)value參數。

讓我們分解:

let videoScaleFactor = Float(0.8)

// Get the scaled video duration
let scaledVideoDuration = CMTimeMake((mode == .Faster) ? Int64(Float(videoAsset.duration.value) / videoScaleFactor) : Int64(Float(videoAsset.duration.value) * videoScaleFactor), videoAsset.duration.timescale)

現在,這是個人的,我更喜歡(沒有多余的行,這沒錯):

let videoScaleFactor = Float(0.8) 
let value = (mode == .Faster) ? Float(videoAsset.duration.value) / videoScaleFactor : Float(videoAsset.duration.value) * videoScaleFactor 
let scaledVideoDuration = CMTimeMake(Int64(value), videoAsset.duration.timescale)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM