Python APIΒΆ
The vsanalog Python package provides a high-level, type-hinted interface to
the vsanalog VapourSynth plugin. It handles plugin loading automatically and
accepts Python-native types like Path and bool.
vsanalog.decode_4fsc_videoΒΆ
- vsanalog.decode_4fsc_video(composite_or_luma_source, chroma_or_pb_source=None, pr_source=None, *, decoder=None, reverse_fields=False, chroma_gain=1.0, chroma_phase=0.0, chroma_nr=0.0, luma_nr=0.0, phase_compensation=False, padding_multiple=8, dropout_correct=False, dropout_overcorrect=False, dropout_intra=False, dropout_composite_or_luma_extra_sources=None, dropout_chroma_extra_sources=None, fpsnum=None, fpsden=1)ΒΆ
Decode 4ππ π (four times subcarrier frequency) sampled analog video signals to a digital video clip. The signal data must be orthogonal video system lines with well-formed blanking and syncing structure at a stable time base, such as those produced by ld-decode and vhs-decode. These files normally have a
.tbcextension indicating they are time-base-corrected and must have a metadata sidecar file in JSON or SQLite format.For color decodes, returns a clip in
YUV444PSformat (32-bit float). For monochrome decodes, the clip is inGRAYSformat.- Parameters:
composite_or_luma_source (
str|Path) β Path to the composite or luma-only.tbcfile.chroma_or_pb_source (
str|Path| None) β Path to a separate chroma.tbcfile, for Y/C-separated sources such as S-Video or VHS color-under.pr_source (
str|Path| None) β Path to the Pr component.tbcfile (component video).decoder (
str| None) β Chroma decoder to use. One of"ntsc1d","ntsc2d","ntsc3d","ntsc3dnoadapt","pal2d","transform2d","transform3d", or"mono". When None, the decoder is chosen automatically based on the video system in the TBC metadata.reverse_fields (bool) β Swap field order.
chroma_gain (float) β Chroma gain multiplier for saturation adjustment.
chroma_phase (float) β Chroma phase adjustment in degrees.
chroma_nr (float) β Chroma noise-reduction level. Only applies to NTSC decoders.
luma_nr (float) β Luma noise-reduction level.
phase_compensation (bool) β Enable NTSC phase compensation.
padding_multiple (int) β Round output dimensions to a multiple of this value. Set to
0to disable padding.dropout_correct (bool) β Enable dropout correction using metadata-identified dropouts.
dropout_overcorrect (bool) β Extend dropout boundaries by +/-24 samples (for heavily damaged sources).
dropout_intra (bool) β Force intra-field-only dropout correction, avoiding inter-field borrowing artifacts on high-motion content.
dropout_composite_or_luma_extra_sources (
Sequence[str|Path] | None) β Additional composite or luma.tbcfiles for multi-source dropout correction.dropout_chroma_extra_sources (
Sequence[str|Path] | None) β Additional chroma.tbcfiles for multi-source dropout correction (for color-under formats).fpsnum (
int| None) β Override frame-rate numerator. When not specified, frame rate is auto-detected from metadata.fpsden (int) β Override frame-rate denominator (used with fpsnum).
- Return type:
VideoNode
Usage ExamplesΒΆ
Basic Composite DecodeΒΆ
from vsanalog import decode_4fsc_video
clip = decode_4fsc_video("/path/to/capture.tbc")
Y/C-Separated SourcesΒΆ
For S-Video or VHS color-under captures produced by vhs-decode:
clip = decode_4fsc_video("luma.tbc", "chroma.tbc")
Choosing a DecoderΒΆ
# Use the 3D adaptive comb filter for NTSC:
clip = decode_4fsc_video("capture.tbc", decoder="ntsc3d")
# Use the Transform PAL frequency-domain filter:
clip = decode_4fsc_video("capture.tbc", decoder="transform3d")
# Luma-only (monochrome) decode:
clip = decode_4fsc_video("capture.tbc", decoder="mono")
Dropout CorrectionΒΆ
# Basic dropout correction:
clip = decode_4fsc_video("capture.tbc", dropout_correct=True)
# Multi-source dropout correction with extra captures:
clip = decode_4fsc_video(
"capture1.tbc",
dropout_correct=True,
dropout_composite_or_luma_extra_sources=[
"capture2.tbc",
"capture3.tbc",
],
)
Working with the OutputΒΆ
The resulting YUV444PS format retains maximum quality from the decode but is
uncommon. You will often want to convert it for downstream filters:
import vapoursynth as vs
# R'G'B' for color/levels adjustment filters:
workable_clip = clip.resize.Point(format=vs.RGBS)
# For mvtools2 pipelines like QTGMC that require an integer format:
workable_clip = clip.resize.Point(format=vs.YUV444P16)
# Reducing chroma resolution closer to analog source aids some NR filters:
workable_clip = clip.resize.Spline36(format=vs.YUV422P16)