Command line
Synopsis
webvtt segment PATH -o OUTPUT [-d NUMBER] [-m NUMBER] [--duration TIME]
[--overwrite]
webvtt shift PATH OFFSET [-o OUTPUT] [-s TIMESTAMP]
webvtt sync PATH (-p FROM TO -p FROM TO ... | --fps FROM TO) [-o OUTPUT]
webvtt -h
webvtt --version
Description
webvtt segments a WebVTT caption file for HTTP Live Streaming (HLS)
and shifts or synchronizes the timestamps of its captions.
segment splits the captions in PATH into segments of a target
duration. Each segment is written to OUTPUT as fileSequenceN.webvtt,
where N is the segment index starting at 0, along with a playlist named
prog_index.m3u8 that lists all the segments. An OUTPUT with the
playlist or segments of an earlier run is an error, unless --overwrite is
given.
A caption whose time span crosses a segment boundary is included in every
segment it overlaps, so players display it regardless of which segment they
load. Every segment also has the STYLE and REGION blocks of PATH,
which its captions use, and the captions keep their identifiers and cue
settings. Comments are not written to the segments.
Every segment starts with an X-TIMESTAMP-MAP header that maps the local
caption time 00:00:00.000 to an MPEG-TS presentation timestamp, so the
captions are kept in sync with the video stream.
shift moves the captions in PATH earlier or later by OFFSET
seconds. The offset is rounded to the nearest millisecond as written, with
halves rounded away from zero, so 1.0005 is 1001 milliseconds. A timestamp
that would fall before zero is set to 00:00:00.000, so a caption moved
entirely before the start is kept with 00:00:00.000 --> 00:00:00.000
timings. The shifted captions are written to standard output in UTF-8, or to
OUTPUT when given.
sync fixes captions that drift further out of sync along the video. With
-p, each point moves the time FROM in the captions to TO; times
between two points are moved along the line between them, and times before
the first or after the last point along the line of the outermost points.
With --fps, the timing is changed from one frame rate to another. Times
are rounded and set to zero like with shift, and the output is written
the same way.
The commands can also be run as python -m webvtt, as in
python -m webvtt shift captions.vtt 2.
segment, shift and sync read the captions from standard input
when PATH is -, decoded as UTF-8 as WebVTT requires, so they can be
used in pipes. A file named - can be read as ./-.
Commands
segmentSegment the WebVTT file at
PATH.shiftShift the timestamps of the WebVTT file at
PATH.syncSynchronize the timestamps of the WebVTT file at
PATH.
Options
-h,--helpShow the help message and exit. Also available for each command, as in
webvtt shift -h.--versionShow the version of webvtt-py and exit.
Segment options
-o OUTPUT,--output OUTPUTDirectory where the segments and playlist are written. It is created if it does not exist. Required.
-d NUMBER,--target-duration NUMBERTarget duration of each segment in seconds, a whole number above zero. Also used for the
#EXT-X-TARGETDURATIONvalue of the playlist and the#EXTINFof its segments, except the last with--duration. Default:10.-m NUMBER,--mpegts NUMBERMPEG-TS value written to the
X-TIMESTAMP-MAPheader of each segment, a whole number from 0 to 8589934591, as MPEG-TS timestamps have 33 bits. Default:900000(10 seconds at the 90 kHz MPEG-TS clock).--duration TIMELength of the media, as a timestamp such as
01:25.500or a number of seconds such as85.5. The playlist then covers all the media, with empty segments after the last caption, and the#EXTINFof its last segment ends with the media. A caption starting at or after it is an error. Without it, the playlist ends with the segment of the last caption, and every segment lasts the target duration.--overwriteReplace the playlist and segments of an earlier run in
OUTPUT, and delete the segments of that run that the new playlist does not have. Other files inOUTPUTare left alone. Without it, anOUTPUTwith aprog_index.m3u8orfileSequenceN.webvttfile is an error.
Shift options
OFFSETNumber of seconds to shift the captions by, such as
2or0.25. Negative values move the captions earlier, as in-1.5. Required.-o OUTPUT,--output OUTPUTFile where the shifted captions are written, keeping the encoding and Byte Order Mark of the input file. It can be the input file itself to shift it in place. A
.vttextension is added if it has no extension, and if it is a directory the file is written there with the input file name, which is an error when reading standard input. Default: standard output.-s TIMESTAMP,--start TIMESTAMPOnly shift the captions starting at or after
TIMESTAMP, in[hh:]mm:ss.mmmformat. Default: shift all the captions.
Sync options
-p FROM TO,--point FROM TOMove the time
FROMin the captions toTO. Each time is a timestamp in[hh:]mm:ss.mmmformat or a number of seconds. Give it two or more times, in any order. Two points cannot have the sameFROM, and theTOtimes must be in the same order as theFROMtimes.--fps FROM TOChange the timing from the frame rate
FROMthe captions are timed for to the frame rateTOof the video, such as25 23.976. A frame rate can also be a ratio, such as24000/1001for the exact NTSC rate. Times are multiplied byFROM / TO. Cannot be used with-p.-o OUTPUT,--output OUTPUTFile where the synchronized captions are written, as with
shift. Default: standard output.
Exit status
0The command completed successfully.
1The input could not be read or is not a valid WebVTT file, the captions could not be moved as asked, or the output could not be written. For
segment, it is also an error when the output directory has the files of an earlier run without--overwrite, or when a caption starts at or after--duration. An error message is printed to standard error, for example:webvtt: error: captions.vtt: not a valid WebVTT file
2Invalid command line arguments, such as an offset that is not a number, an invalid
--starttimestamp or sync points that cannot be used.
Examples
Given captions.vtt:
WEBVTT
00:00:01.000 --> 00:00:04.000
Hello and welcome.
00:00:06.000 --> 00:00:12.000
This caption spans two segments.
00:00:14.500 --> 00:00:18.000
Thanks for watching!
Segment it into 10-second segments:
$ webvtt segment captions.vtt --output out
$ ls out
fileSequence0.webvtt fileSequence1.webvtt prog_index.m3u8
out/prog_index.m3u8:
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:10.00000,
fileSequence0.webvtt
#EXTINF:10.00000,
fileSequence1.webvtt
#EXT-X-ENDLIST
out/fileSequence0.webvtt:
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:900000,LOCAL:00:00:00.000
00:00:01.000 --> 00:00:04.000
Hello and welcome.
00:00:06.000 --> 00:00:12.000
This caption spans two segments.
out/fileSequence1.webvtt:
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:900000,LOCAL:00:00:00.000
00:00:06.000 --> 00:00:12.000
This caption spans two segments.
00:00:14.500 --> 00:00:18.000
Thanks for watching!
Segment it again into out, with 6-second segments and a different
MPEG-TS value, replacing the earlier segments:
$ webvtt segment captions.vtt -o out
webvtt: error: out: has the files of an earlier segmentation, such as fileSequence0.webvtt; use --overwrite to replace them
$ webvtt segment captions.vtt -o out -d 6 -m 0 --overwrite
Show the captions 1.5 seconds earlier:
$ webvtt shift captions.vtt -1.5
WEBVTT
00:00:00.000 --> 00:00:02.500
Hello and welcome.
00:00:04.500 --> 00:00:10.500
This caption spans two segments.
00:00:13.000 --> 00:00:16.500
Thanks for watching!
Show the last caption 2 seconds later, updating the file in place:
$ webvtt shift captions.vtt 2 --start 00:14.500 -o captions.vtt
Keep the first caption in place and move the last one from 00:14.500 to 00:15.850, synchronizing the captions in between:
$ webvtt sync captions.vtt -p 00:01.000 00:01.000 -p 00:14.500 00:15.850
WEBVTT
00:00:01.000 --> 00:00:04.300
Hello and welcome.
00:00:06.500 --> 00:00:13.100
This caption spans two segments.
00:00:15.850 --> 00:00:19.700
Thanks for watching!
Fix captions timed for a 25 fps video played with a 23.976 fps one, updating the file in place:
$ webvtt sync captions.vtt --fps 25 23.976 -o captions.vtt
Shift and synchronize the captions in a pipe, reading them from standard input:
$ webvtt shift captions.vtt 2 | webvtt sync - --fps 25 23.976 > fixed.vtt
Synchronize the captions and segment them, without a file in between:
$ webvtt sync captions.vtt --fps 25 23.976 | webvtt segment - -o out
See also
The same segmentation, shifting and synchronizing are available from Python
with webvtt.segment(), WebVTT.shift(), WebVTT.sync() and
WebVTT.change_framerate().