2011-11-22 374 views
1

我正在尋找最佳 C++中的源代碼/算法 將幀計數轉換爲時間碼hh:mm:ss:ff在給定的fps中,例如。 25fps的...將幀數轉換爲時間碼的最佳代碼/算法?

這個代碼是preety好 - http://www.andrewduncan.ws/Timecodes/Timecodes.html(頁面底部) ,但它是昂貴的 - 它包含4個MOD和6 DIV操作

我需要表現出每幀的時間碼,這樣計算此算法 可能需要一些時間。

我當然可以存儲評估時間碼以避免計算。

但是,這將是非常有益知道更好的算法...

在此先感謝 你 米

+9

4 mod和6 div對於每一幀都不是問題。期間 –

+0

,但mods和divs是最廣泛的操作,所以我認爲它可能需要在每秒25幀的回放過程中一些性能... –

+3

25 fps是每40毫秒1幀。在1 GHz處理器上這是40,000,000個時鐘週期(就像我手機中的那個)。除非您已經知道這是一個問題,否則不要擔心優化這些東西(因爲您已經運行它,速度太慢,並且配置文件告訴您這是您花費時間的地方)。 – nmichaels

回答

2

首先,這個問題可能會更好地轉換爲幾秒到幾小時,幾分鐘,幾秒之間的最佳代碼。此時,如果幀順序合適,則可以簡單地使用添加來增加以前的時間。

1

對某些預先計算的倒數進行乘法運算,可以有效地執行Mod和Div操作(達到一個小的常數值)。所以他們並不昂貴。

2

首先,我同意其他人的看法,您可能不需要優化它,除非您明確地看到問題。然而,因爲嘗試找到方法是有趣的,所以我會給你一些我第一眼看到的東西來減少分歧的次數。

seconds = framenumber div 30 
minutes = seconds div 60 
hours = minutes div 60 
frames = frameNumber mod 30 
seconds = seconds mod 60 
minutes = minutes mod 60 
hours = hours mod 24 

這是多行代碼,但數量較少分歧。基本上,因爲秒,分和小時都使用相同的數學計算,所以我使用下一個公式中的結果。

6

一般經驗法則:在包含視頻播放器的圖像處理系統中,您爲每像素運行一次的操作流汗血,然後您爲每個映像「補丁」運行一次的操作流汗(通常是一條線的像素),而且你不會爲每幀運行一次的東西出汗。

原因是每像素的東西將運行幾百倍,甚至幾千倍,每修補程序的東西,而每修補程序的東西將運行數百次,或數千次每幀的東西。

這意味着每像素的東西可能會像每幀的東西一樣頻繁地運行數百萬次。每個像素一條指令可能需要每幀數百萬條指令,並且每幀指令的數量相對於每像素指令計數而言,每幀指令有幾百條甚至幾千條指令會丟失。

換句話說,你可以支付mods和divs。儘管如此,運行自定義計數器而不是做mods和div可能是合理的。

+0

謝謝,我不知道這個'規則':) –