Ruby: SMPTE Converter
If you need to do any sort of screen capturing using FFMPEG, you might need this one day.
# http://ifhere.org/ffmpeg
# Example
# SMPTECodes.standard= :pal #=> :pal
# SMPTECodes.fps #=> 25.0
# t = "95:33:24.92" #=> "95:33:24.92"
# t.to_frame #=> 8256118
# t.to_frame.to_smpte #=> "95:33:24.92"
# t == t.to_frame.to_smpte #=> true
# SMPTECodes.standard= :ntsc #=> :ntsc
# SMPTECodes.fps #=> 29.97002997003
# t = "95:33:24.70" #=> "95:33:24.70"
# t.to_frame #=> 10309831
# t.to_frame.to_smpte #=> "95:33:24.70"
# t == t.to_frame.to_smpte #=> true
class SMPTECodes
#http://en.wikipedia.org/wiki/SMPTE_timecode
@@standard = :ntsc
def self.standard
@@standard
end
# Set the frequency standard, ie :ntsc, :pal, :dv
def self.standard=(code)
@@standard = code
end
def self.fps
case self.standard
when :ntsc: 30/1.001
when :pal: 25.0
when :dv: 30.0
end
end
module String
# Converts an SMPTE code into a frame number based upon the current FPS
def to_frame
t = self.split(/:|\./).map {|i| i.to_i}
while t.length < 4 do
t.insert 0, 0
end
# hours(?):Miutes:seconds.frames
((t[0]*(60*60*SMPTECodes.fps)) +
(t[1]*(60*SMPTECodes.fps)) +
(t[2] * SMPTECodes.fps) +
( (t[3].to_f*(SMPTECodes.fps/100)).round)).round
end
end
module Numeric
# Converts an a frame number to an SMPTE string
def to_smpte
h, m = self.divmod(60 * 60* SMPTECodes.fps)
m, s = m.divmod(60* SMPTECodes.fps)
s, f = (s).divmod(SMPTECodes.fps)
f = (f.round*(100.0/SMPTECodes.fps))
if f >= 100
s = s+1;
f = 0;
end
"#{("%02d" % h.round)}:#{("%02d" % m.round)}:#{("%02d" % s.round)}.#{("%02d" % f.round)}"
end
end
end
# Mixin the modules
String.send :include, SMPTECodes::String
Numeric.send :include, SMPTECodes::Numeric