[英]Convert frames to NTSC Drop Frame Timecode
我正在尋找一個將幀中的整數值轉換為NTSC丟幀時間碼(hh:mm:ss.ff)的函數。
我正在使用Delphi,但可以使用任何語言。
謝謝
這個問題有一個眾所周知的經典解決方案 ......
(當然,如果你知道你的價值范圍有限,你可以使用較小的int類型)
const uint FRAMES_PER_10min = 10*60 * 30000/1001;
const uint FRAMES_PER_1min = 1*60 * 30000/1001;
const uint DISCREPANCY = (1*60 * 30) - FRAMES_PER_1min;
/** reverse the drop-frame calculation
* @param frameNr raw frame number in 30000/1001 = 29.97fps
* @return frame number using NTSC drop-frame encoding, nominally 30fps
*/
int64_t
calculate_drop_frame_number (int64_t frameNr)
{
// partition into 10 minute segments
lldiv_t tenMinFrames = lldiv (frameNr, FRAMES_PER_10min);
// ensure the drop-frame incidents happen at full minutes;
// at start of each 10-minute segment *no* drop incident happens,
// thus we need to correct discrepancy between nominal/real framerate once:
int64_t remainingMinutes = (tenMinFrames.rem - DISCREPANCY) / FRAMES_PER_1min;
int64_t dropIncidents = (10-1) * tenMinFrames.quot + remainingMinutes;
return frameNr + 2*dropIncidents;
} // perform "drop"
從生成的“drop”frameNumber,您可以照常計算組件,使用標稱的30fps幀速率...
frames = frameNumber % 30
seconds = (frameNumber / 30) % 60
等等...
function FramesToNTSCDropFrameCode(Frames:Integer;FramesPerSecond:Double):string;
var
iTH, iTM, iTS, iTF : word;
MinCount, MFrameCount : word;
begin
DivMod( Frames, Trunc(SecsPerMin * FramesPerSecond), MinCount, MFrameCount );
DivMod( MinCount, MinsPerHour, iTH, iTM );
DivMod( MFrameCount, Trunc(FramesPerSecond), ITS, ITF );
Result := Format('%.2d:%.2d:%.2d.%.2d',[iTH,iTM,iTS,iTF]);
end;
您需要從SysUtils單元復制DivMod例程,並在任何實現此功能的過程中包含sysUtils單元。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.