Handle video subtitles in various text formats
Video files (avi mpeg etc) are sometimes accompanied with subtitles, which are currently very popular as text files. \*(C`Subtitles\*(C' provides means for simple loading, re-timing, and storing these subtitle files. A command-line tool subs for the same purpose and using \*(C`Subtitles\*(C' interface is included in the distribution.
The module supports \*(C`srt\*(C', \*(C`sub\*(C', \*(C`smi\*(C', and \*(C`mdvd\*(C' subtitle formats.
Time values are floats, in seconds with millisecond precision.
use Subtitles; my $sub = Subtitles->new(); open F, 'Ichi The Killer.sub' or die "Cannot read:$!"; die "Cannot load:$@\n" unless $sub-> load(\*F); close F; # back two minutes $sub-> shift( $sub-> parse_time('-02:00')); # re-frame from 25 fps $sub-> scale( 23.976 / 25 ); # or both $sub-> transform( -120, 0.96); $sub-> transform( -120, 0.96, 0, $sub-> length - 60); # split in 2 my ( $part1, $part2) = $sub-> split( $self-> length / 2); # join back with 5-second gap $part1-> join( $part2, 5); # save open F, "> out.sub" or die "Cannot write:$!\n"; $part1-> save( \*F); close F; # report print "sub is ", time2str( $sub-> length);
Returns array of installed codecs.
Combines four parameters into float time in seconds.
Splits time into four integers, - hours, minutes, seconds, and milliseconds. If time is less than zero, zero times are returned.
Splits time into five integers, - time sign, hours, minutes, seconds, and milliseconds.
Converts time to a human-readable string.
Removes all content
If \s-1STRING\s0 is not defined, returns currently associated codec. Otherwise, sets the new codec in association. The \s-1STRING\s0 is the codec's package name, such as \*(C`Subtitles::Codec::srt\*(C'.
Duplicates object instance in deep-copy fashion. If \s-1CLEAR\s0 flag is set, timeframes are not copied.
Adds content of object \s-1GUEST\s0 at the end of the list of subtitles with \s-1GAP\s0 in seconds.
Returns length of subtitle span.
Reads subtitle content into object. If successful, returns 1; otherwise undef is returned and $@ contains the error. By default, tries to deduce which codec to use; to point the selection explicitly \s-1CODEC\s0 string is to be used.
Returns number of subtitle cues.
Creates a new instance. To force a particular codec, supply \*(C`codec\*(C' string here.
Parses \s-1STRING\s0 which is either a \*(C`[[HH:]MM:]SS[,MSEC]\*(C' string or string in a format specific to a codec, for example, number of a frame.
Forces a particluar frame-per-second rate, if a codec can make use of it.
Writes content of instance into \s-1FH\s0 file handle, using the associated codec.
Changes time-scale. If A is 2, the subtitles go off 2 times slower, if 0.5 - two times faster, etc.
Shifts timings by B seconds. B can be negative.
Splits the content of the instance between two newly created instances of the same class, by \s-1TIME\s0, and returns these. The both resulting subtitles begin at time 0.
Applies linear transformation to the time-scale, such as \*(C`u = At + B\*(C' where \*(C`t\*(C' is the original time and \*(C`u\*(C' is the result. If \s-1FROM\s0 and \s-1TO\s0 brackets are set, the changes are applied only to the lines in the timeframe between these.
This is alpha code, more a proof-of-concept rather that anything else, so most surely bugs are lurking.
Anyway: not all subtitle types are recognized. The modules doesn't handle multi-language subtitles.
subs - command-line wrapper for this module
<http://dvd.box.sk/>, <http://subs.2ya.com>.
Dmitry Karasik, <[email protected]>.