-
Notifications
You must be signed in to change notification settings - Fork 102
TBC to Video Export Guide
Back Page RF Capture Decoding Guide
Forward Page Post Processing
As of tbc-tools v3.0.1 (2026) video and aligned audio export has been fully integrated into analyse.
This allows for a cross plafrom GUI based way to export tbc files with all visual/decoder adjustments carried directly to video.
- Run Auto Audio Align on Linear or HiFi-Decoded files. (this can then auto-load into your track 1 / track 2 export options)
- Adjust your active export area, if doing standard or horizontal area only if doing a Active + VBI or IMX style export or letterbox crop, you can do this multiple times to correct for different segments, and the export will be auto-padded to to selected resolution.
- Set your in (green) / out (red) points for video start and end, you can also set named chapter markers (blue).
- Select your level of dropout correction and metadata export then edit or archive ready codec, container and bit-depth of choose.
You can also export a AVC/HEVC or AV1 proxy or use your own manually defined FFmpeg profiles.
There is options for letterbox cropping, and anamorphic de-squeezing 4:3 footage back to 16:9.
If you run VBI processing, VITC timecode and Closed Captions if detected will be extracted and embedded into your file on export.
All adjustment values are also saved as FFmpeg custom fields so you may re-vist your export config at anytime even if the original working tbc metadata is lost.
This is the part when you take your luma & chroma data to the ld-chroma-decoder which combines it and then decodes it to a RGB or YUV stream with FFmpeg using the merge planes function, resulting in a final colour video stream that is encoded to FFV1 or to any other FFmpeg supported codec and container output format you wish to use.
You can add your own encoding profiles in the tbc-video-export.json file, which when present will be the profile options available to the export tool.
This process is handled in mostly an "hands off" way with tbc-video-export a simple to use, cross platform CLI tool with a graphical prompt for showing the processing.
Colour-Under formats VHS, Umatic, BetaMax, Video8, Hi8 etc are a .tbc/_chroma.tbc file (Y+C) set.
CVBS formats Composite, LaserDisc, SMPTE 1" Type C are 1 single .tbc file.
Always backup & keep your .log & .json files even if you delete your TBC files after you are happy with your export these still contain key metadata.
Ensure you have centered your image area with ld-analyse Active Video Start & Active Video Width
ld-analyse-re-framing-active-image-area.mp4
This adjusts the JSON or SQLite metadata for setting the active image area framing, adjusting to the left and right respectively, this allows for centring of the active image area with corect margis, this is cretical if VBI data is present, but it can also be used to force full frame with exporting NTSC.
You want 4 samples "pixels" of black on the left and right sides to allow for slight picture shifting, but make sure to go though the entire file to check if one segment is drastically diffrent, as you can adjust for that or make a targeted export later by noting the start frame and end frame numbers. xx
Ensure black/white levels are corrected, the image area around your active picture should be 100% black and the contrast should look correct across the frame, if you have colour-bars your can visually check also that nothing is clipping and all the details are still retrained in the whites.
--ire0_adjust for NTSC/PAL normally provides you a correct baseline starting point for black/white levels.

The Reset buttons return the black or white level to their standard values. For NTSC video, there are two black level reset buttons, one for standard NTSC and one for the Japanese NTSC-J standard; if you selected the wrong NTSC variant when decoding the video, you can use this to switch between NTSC and NTSC-J.
Note
The difference between the white and black levels is used to adjust the scaling of colour information, so you should set the black/white levels correctly before adjusting the chroma gain.
Ensure you acutally save your updated information via File --> Save JSON or changes will not be carryed to the chroma-decoder
The chroma-decoder, chroma gain, chroma phase, and luma noise reduction adjustments are currently not tied to the metadata workflow. This means that when you make adjustments in ld-analyse visually, you must manually copy these config options over to your export command for them to take effect; otherwise, the defaults for the format type will be used.
How to manually copy config options:
- In ld-analyse, note the values you set for chroma gain, chroma phase, luma noise reduction, and chroma decoder.
- When running the export command, add these options as command-line arguments.
Example:
tbc-video-export input.tbc --chroma-gain 1.2 --chroma-phase 15 --luma-nr 3 --chroma-decoder pal2d
- Replace the example values above with the actual values you used in ld-analyse.
This ensures your export uses the same visual adjustments you made during analysis.
Due to audio being seprated from the video decoding process, there is corrently no off-set metadata intergrated, so assuming the audio capture comes from single source RF captures (video8/hi8/ntsc betamax) or from a misrc/clockgen workflow.
You normally will have hifi and or linear audio tracks, this will be processed via auto audio align and outher tools that read the standard video JSON metadata for off-sets and thus adjusting the audio files and keeping your audio in sync and ready to mux with your video file rather then correcting in an NLE (non-linear editor i.g DaVinchi Resolve for example) which takes much more time.
Tip
The output name and directory will be the same as the input unless manually defined by the user.
Linux & MacOS
tbc-video-export Input-Media.tbc
Windows
tbc-video-export.exe Input-Media.tbc
The export tool takes filename.tbc / filename_chroma.tbc and metadata from the .json and create video files automatically for PAL or NTSC it can also set inital timecode based off VITC data if it was read by ld-process-vbi beforehand.
The default output format is:
Aspect Ratio 4:3-
760x488 NTSCor928x576 PAL Interlaced Top Field First-
Video Codec: FFV1 10-bit 4:2:2(60-100 Mb/s) Audio Codec: FLAC
Ideal starting point for post-processing footage without VBI data, but will require de-interlacing for online use.
Defining input location and output location is useful if your data is not inside the same folder as the export tool.
For Linux/MacOS based systems this is like:
/home/harry/desktop/vhs-decode/Input.tbc
For Windows this looks like
"C:\Users\harry\Desktop\Decode\Input.tbc"
-
--skip,-sSkips number of frames-s 25for example skips 1 second of PAL video. -
--length,-lDefines length to export so-l 1500is 1 minute of PAL video at 25fps.
Tip
The audio should be run through alignment tools if from Clockgen/HiFi-Decode.
Linux & MacOS
tbc-video-export --audio-track Input_baseband.flac Input-Media.tbc
Windows
tbc-video-export.exe --audio-track Input_baseband.flac Input-Media.tbc
On tape Audio can be Mono, Stereo, Linear Timecode
You have upto 4 channels, 2 Linear & 2 HiFi FM on VHS/Betamax HiFi tapes, this is format and tape to tape dependent as Sony 8mm can have PCM digital for example but will mostly have Stereo MPX on its HiFi FM tracks.
LaserDisc has 2 Analog channels which one can be populated with AC-3 or DTS digital this can be 4.0 or 5.1 surround.
Your options are quite simple:
- Direct Mux
- Align with AAA
- Manually Align in an NLE (with reference capture)
Auto Audio Align
After decoding your Video RF and or HiFi FM audio you will want to sync your decoded audio data with your video file or Linear captures made by audio ADC's running off the same clock source like the Clockgen Mod or MISRC.
There is a few ways to do this, as it is only a simple process of reading the post decoded .JSON file for total duration and offsets from dropped fields/frames of information, but the standard workflow currently uses Rene Wolfs implementation for Windows, Linux and MacOS, however this may change to a more universal python replacement later as Mono is considered an extra dependency.
With a standard configuration you just need to alter the following:
-i baseband.wav
Input PCM or FLAC audio file.
--json capture.tbc.json
Input TBC JSON from decoded video RF.
baseband_aligned.flac
Output name at the end (also s16 will do 16-bit if s24 is replaced)
-
--stream-sample-rate-hz-
Input rate of your audio file in Hz i.e 46875 for clockgen baseband or 48000 for hifi-decode or 44100 for ld-decode.
--rf-video-sample-rate-hz
Capture rate of your base file this normally will be 40000000 (40Msps) or 20000000 (20Msps) & 16000000 (16Msps) for down-sampled captures.
[!TIP]
Below is premade commands for usage:
Linux & MacOS
"ffmpeg" -i baseband.wav -filter 'channelmap=map=FL-FL|FR-FR' -f s24le -ac 2 - | mono VhsDecodeAutoAudioAlign.exe stream-align --sample-size-bytes 6 --stream-sample-rate-hz 46875 --json capture.tbc.json --rf-video-sample-rate-hz 40000000 | ffmpeg -f s24le -ar 46875 -ac 2 -i - -af aresample=48000 -sample_fmt s32 baseband_aligned.flac
"ffmpeg" -i baseband.wav -filter_complex "[0:a]channelsplit=channel_layout=2.1:channels=FL[FL]" -map "[FL]" -f s24le -ac 1 - | mono VhsDecodeAutoAudioAlign.exe stream-align --sample-size-bytes 3 --stream-sample-rate-hz 46875 --json capture.tbc.json --rf-video-sample-rate-hz 40000000 | ffmpeg -f s24le -ar 46875 -ac 1 -i - -af aresample=48000 -sample_fmt s32 baseband_aligned.flac
Windows
ffmpeg.exe -i baseband.wav -filter_complex "channelmap=map=FL-FL|FR-FR" -f s24le -ac 2 - | VhsDecodeAutoAudioAlign.exe stream-align --sample-size-bytes 6 --stream-sample-rate-hz 46875 --json capture.tbc.json --rf-video-sample-rate-hz 40000000 | ffmpeg.exe -f s24le -ar 46875 -ac 2 -i - -af aresample=48000 -sample_fmt s32 baseband_aligned.flac
ffmpeg.exe -i baseband.wav -filter_complex "[0:a]channelsplit=channel_layout=2.1:channels=FL[FL]" -map "[FL]" -f s24le -ac 1 - | VhsDecodeAutoAudioAlign.exe stream-align --sample-size-bytes 3 --stream-sample-rate-hz 46875 --json capture.tbc.json --rf-video-sample-rate-hz 40000000 | ffmpeg.exe -f s24le -ar 46875 -ac 1 -i - -af aresample=48000 -sample_fmt s32 baseband_aligned.flac
Muxing Audio
To embed an audio file use --audio-track
Example:
--audio-track HiFi_24-bit_48khz.flac --audio-track Linear_24-bit_48khz.flac
To set the input file name, track name and language flags use --audio-track-advanced
Good to read: FFmpeg Audio Channel Mapping.
Language of the audio track i.g en, jpn, cn, de etc
[file_name, title, language, rate, format, channels, channel_layout, time_offset]
Example:
--audio-track-advanced '["tests/files/HiFi_24-bit_48khz.flac", "HiFi", "eng", "48000", "2", "00:00:00.000"]'
Example Basic
tbc-video-export --audio-track HiFi_24-bit_48khz.flac --audio-track Linear_24-bit_48khz.flac
Example Advanced
tbc-video-export Input.tbc --audio-track-advanced '["tests/files/HiFi_24-bit_48khz.flac", "HiFi", "eng"]' --audio-track-advanced '["tests/files/HiFi_24-bit_48khz.flac", "Linear", "eng"]' output-name
--process-efm Decodes 4.0 or 5.1 AC3 to file
--process-efm-dts Decodes 5.1 DTS to file.
Caution
Progressive video files will be 2x the size of interlaced files.
FFmpeg profile based de-interlacing can be done with bwdif & w3dif (see the tbc-video-export.json formatting for how to apply it to new profiles) for 50p/59.94p progressive files although QTGMC is recommended for the best results today.
We have implemented ProRes & PCM audio modes for better support in NLEs such as Davinchi Resolve.
Note
You can make/share you own FFmpeg profiles by editing the tbc-video-export.json as needed, however it may need to be edited every major update.
Define your profile with for example: --profile ffv1_8bit_pcm
Encoding Profile List
Standard Profiles:
| Profile Name | Codec | Compression Type | Bit-Depth | Chroma Sub-Sampling | Audio Format | Container | File Extension | Bitrate |
|---|---|---|---|---|---|---|---|---|
| ffv1 | FFV1 | Lossless Compressed | 10-bit | 4:2:2 | FLAC Audio | Matroska | .mkv | 60-100mbps |
| ffv1_8bit | FFV1 | Lossless Compressed | 8-bit | 4:2:2 | FLAC Audio | Matroska | .mkv | 40-60mbps |
| ffv1_pcm | FFV1 | Lossless Compressed | 10-bit | 4:2:2 | PCM Audio | Matroska | .mkv | 60-100mbps |
| ffv1_8bit_pcm | FFV1 | Lossless Compressed | 8-bit | 4:2:2 | PCM Audio | Matroska | .mkv | 40-60mbps |
Editing Profiles:
| Profile Name | Codec | Compression Type | Bit-Depth | Chroma Sub-Sampling | Audio Format | Container | File Extension | Bitrate |
|---|---|---|---|---|---|---|---|---|
| prores_hq_422 | ProRes HQ | Compressed | 10-bit | 4:2:2 | PCM Audio | QuickTime | .mov | 55-70mbps |
| prores_4444xq | ProRes 4444XQ | Compressed | 10-bit | 4:4:4 | PCM Audio | QuickTime | .mov | 80-110mbps |
| v210 | V210 | Uncompressed | 10-bit | 4:2:2 | PCM Audio | QuickTime | .mov | 200mbps |
| v410 | V410 | Uncompressed | 10-bit | 4:4:4 | PCM Audio | QuickTime | .mov | 400mbps |
Web Profiles:
| Profile Name | Codec | Compression Type | Bit-Depth | Chroma Sub-Sampling | Audio Format | Container | File Extension | Bitrate |
|---|---|---|---|---|---|---|---|---|
| x264_web | AVC/H.264 | Lossy | 8-bit | 4:2:0 | AAC Audio | MPEG4 | .mp4 | 8mbps |
| x265_web | HEVC/H.265 | Lossy | 8-bit | 4:2:0 | AAC Audio | MPEG4 | .mp4 | 8mbps |
Broadcast Profiles:
| Profile Name | Codec | Compression Type | Bit-Depth | Chroma Sub-Sampling | Audio Format | Container | File Extension | Bitrate |
|---|---|---|---|---|---|---|---|---|
| D10 PAL | MPEG2 | Lossy | 8-bit | 4:2:2 | PCM Audio | Material eXchange Format | .mxf | 50mbps |
| D10 NTSC | MPEG2 | Lossy | 8-bit | 4:2:2 | PCM Audio | Material eXchange Format | .mxf | 50mbps |
[!NOTE] The D10 or IMX50 standard is 720x512 NTSC & 720x608 PAL (SD + 32 lines for VBI area) standard for SD archive delivery and used by the BBC archive and many other broadcasters.
Warning
You probably missed the dropdown table tab directly above, this is very handy to read & reference!
Adjust values in ld-analyse to have your rough numbers
--chroma-gain Chroma Level (Gain) factor applied to chroma components. 0 to 2 (Default 1)
--chroma-phase Phase rotation applied to chroma components (degrees) -180 to 180 (Default 0)
--luma-nr Luma noise reduction level in dB. (decimal range) 0 to 10 (Default 0)
--transform-threshold Transform PAL chroma sensitivity (decimal range) 0 to 1 (Default 0.4)
Select Chroma decoder to use.
--chroma-decoder decoder
Defaults:
PAL:
-
PAL2D(default for PAL/PAL-M S-Video) -
transform3d(default for PAL/PAL-M CVBS)
NTSC:
-
ntsc2d(default for NTSC S-Video and CVBS) -
ntsc3d(default for NTSC CVBS LD)
Available Decoders:
Monochrome: mono
PAL: pal2d, transform2d, transform3d
NTSC: ntsc1d, ntsc2d, ntsc3d, ntsc3dnoadapt, nnTransfrom3D
--metadata key value
Add metadata to output file, you can use this option multiple times.
Tip
Example
--metadata Title VHS --metadata Year 2024
--metadata-file filename
Add metadata to output file from ffmetadata files. FFmpeg Docs for details.
Note
- When using
--export-metadatathe generated ffmetadata file is also used. - Files defined here are used before any generated metadata and take priority.
--export-metadata
Run ld-export-metadata before export. (default: no)
Note
The generated subtitles (closed captions) and ffmetadata will be used when encoding.
This is data such as Title, Year, Camara, Tape Tape and so on can be added to the final video files metadata.
Example:
--metadata [{"title": "Birthday 2008", "JVC-GX250": "LP"}, {"year": 2008}]
To add a custom or standard field to the metadata you can do as such for each article manually:
--metadata "Video System" "PAL" & -metadata title="my title"
Full Example:
tbc-video-export Munday-Walking-Around-Garden.tbc --metadata "Tape Format" "VHS-C" --metadata "Video System" "PAL" --metadata "Tape Mode" "SP" --metadata "Title" "Munday Walking Around Garden" --metadata "Date" "2009-07-24" --metadata "Capture Date" "2022-09-08"
Resulting Media Info Metadata Readout:
General
Unique ID : 189262425709654888565939284128344460936 (0x8E629E0783A839695528477CEDD64E88)
Complete name : Munday-Walking-Around-Garden.mkv
Format : Matroska
Format version : Version 4
File size : 386 MiB
Duration : 30 s 160 ms
Overall bit rate mode : Variable
Overall bit rate : 107 Mb/s
Frame rate : 25.000 FPS
Movie name : Munday Walking Around Garden
Writing application : Lavf60.3.100
Writing library : Lavf60.3.100
ErrorDetectionType : Per level 1
Attachments : Munday-Walking-Around-Garden.tbc.json
CAPTURE_DATE : 2022-09-08
DATE : 2009-07-24
TAPE_FORMAT : VHS-C
TAPE_MODE : SP
Time code of first frame : 00:00:00:00
Time code source : Matroska tags
VIDEO_SYSTEM : PAL
tbc-video-export input.tbc
Standard 4:3 760x488 NTSC & 928x576 PAL
Makes a Monochrome or Black & White Image using the Y channel or strips the colour carrier from a CVBS TBC.
16:9 Widescreen Letterbox Crop 928x432 PAL & 760x432 NTSC
These commands work well for 16:9 widescreen letterbox crop tapes rendering only the centre making a ideal image for scaling/de-interlacing to 720p 50/59.94p for progressive Blu-Ray mastering.
Note
This produces a full-vertical image frame allowing you to visually see VBI data, and syncs however, if your image is not centred properly this may crop the data so ensure you adjust the active area in-ld-analyse before exporting.
Scaled 720x608 PAL & 720x512 NTSC (IMX/D10)
| Incorrrectly Centered | Properly Centered |
|---|---|
![]() |
![]() |
Unscaled 928x608 PAL & 760x512 NTSC includes top and bottom sync, useful for cropping and conforming in post rather than in initial export.
Full 4fsc Signal Frame
Note
This has to be manually done via editing the .JSON files video area values, in a text editor, below are the fields you need to find and change to apply this effect.
-
625-line
"activeVideoStart":20,"activeVideoEnd":1120} -
525-line
"activeVideoStart":0,"activeVideoEnd":910}
1135x624 PAL |
910x528 NTSC |
|---|---|
![]() |
![]() |
This option passes the TBC files to FFmpeg directly and exports only luma information.
Composite (Live CVBS Source)
S-Video (Y with C Ignored) (VHS PAL SP Source)
0-255 PC Black Levels |
16-235 TV Black Levels |
|---|---|
![]() |
![]() |
We recommend Media Player Classic & VLC
Due to displays on TV and PC displays using different levels, you need to convert 16-235 to 0-255 this can be done via a simple shader filter in MPC for example.
Example Filter Settings:
The chroma-decoder can produce images that are not to correct black levels for PC use.
This can be corrected very primitively with initial export (no recommended if re-mastering in Resolve)
Example: --force-video-black-level 32
If a single value is defined such as 32 this will uniformly apply to R/G/B colour if 3 values are defined it will adjust each channel.
This should only be used for PC as it will break TV Legal levels of 16-255
Note
Most BetaMax media releases will have Colour Bars at the start for reference use, which with a vector scope you can set the gain/phase correctly.
Depending on the colour accuracy of your display these images can look bright white in the yellows this is called white level clipping you need to adjust your display.
The example here is 2 sRGB photos taken of 2 displays
| This one should be clean and even exposure | This one should look clipped in the right corner |
|---|---|
This is for altering the flagging data inside the mov, mp4 & mxf containers.
This is the reason why proper mastered media will only show above the active head switch area when displayed on a TV/System with standard video flag support.
AMCDX Video Patcher Live Link / Archive Link This tool is dead simple to use and allows you to correctly flag recordings colour/timecode information, this allows files to be hardware & industry standard software compatible.
Example of a blank and correctly flagged progressive exports for NTSC & PAL using ProRes HQ / V210.
| Blank: | PAL: | NTSC: |
|---|---|---|
![]() |
![]() |
![]() |
Firstly, the correct way to word a video involving the projects is to state it's a FM RF Capture decoded with xxx version of decode not "domesday method" etc as this causes conflation about the methodolgy and workflow involved.
That RF Capture is decoded with VHS-Decode, LD-Decode and or HiFi-Decode etc for example.
It's always best to separate current software generated video files, from the hardware capture projects reffering to it together as "FM RF Archival method" is the most accurate way to describe it.
RF captures are just the archive, not the decoded results as they can always be improved so never be considered a "final" so if possible It's recommended to always share source FLAC compressed RF on The Internet Archive if publishing any sort of decode related content.
To upload anything on YouTube in as close to orignal visual quality as possible you will need to upscale to the 2160p or "4k" bracket which is why we use 2880x2160 with 4:3 aspect ratio, encoded with HEVC 8-bit 4:2:0 at CBR 120mbps for example.
Using the "4K" bracket of YouTube avoids horrible black/dark colour bias compression macro block artifacts, this is due to forced re-compression, so it's best to start with lossless FFV1 10-bit export and then do your upscaling and deinterlacing via StaxRip or Hybrid or Vapoursynth directly.
Here is 2 very basic all FFmpeg based scripts using BWDIF, but QTGMC is normally better and IVTC for 24p wrapped media, and if using Vapoursynth Spline64 is always a good goto for upscaling.
PAL
ffmpeg -hwaccel auto -i "%~1" yuv422p10le -vf scale=2880:2176 -c:v ffv1 -aspect 4:3 -vf bwdif=1:-1:0 -c:a copy -color_range tv -color_primaries bt470bg -colorspace bt470bg -color_trc bt709 "%~n1_YT_4k_Scaled.mkv"
NTSC
ffmpeg -hwaccel auto -i "%~1" yuv422p10le -vf scale=2880:2176 -c:v ffv1 -aspect 4:3 -vf bwdif=1:-1:0 -c:a copy -color_range tv -color_primaries smpte170m -colorspace smpte170m -color_trc bt709 "%~n1_YT_4k_Scaled.mkv"
For use on Odysee or anything that supports direct streaming:
You can pick either x264_web or x265_web depending on how much system/client support of streaming you want.
tbc-video-export --profile x264_web input.tbc
Note
Odysee uses direct streaming, no on the fly transcode/re-encoding so care has to be taken to avoid client side playback issues, i.g non phone users.
- Hands off ld-tools interactions
- .tbc and extension-less file input
- S-Video & CVBS TBC file set input support
- Automatic PCM Muxing for LD-Decode
- Automatic Timecode setting from VITC metadata
- Audio Language & Track Name setting Support
- PCM Audio profiles for editing support
- Lossless compressed FFV1 Profiles
- ProRes HQ & 4444XQ Profiles
- V210 & V410 Uncompressed Profiles
- AVC/H.264 & HEVC/H.265 De-interlaced Web Profiles
-
Jitterbug / Video Dump Channel for making tbc-video-export!
-
Harry Munday for tbc-video-export's development direction, feature testing and its icon.
-
Wrapscallion (Ty)on the DD86 Discord for showingAMDCX Videop Patcherthis truly invaluable and easy-to-use cross-platform tool.
Next Page Post Processing
Sub-Page Jitterbugs TBC-Video-Export Releases Page
Back Page RF Capture Decoding Guide
- FAQ - Frequently Asked Questions
- Diagram Breakdowns
- Visual-Comparisons
- VCR Reports / RF Tap Examples
- Download & Contribute Data
- Speed Testing
- Capture Setup Guide
- MISRC
- CX Cards & CXADC
- CX Cards - Clockgen Mod
- DdD - Domesday Duplicator
- RTL-SDR
- Hardware Installation Guide
- Finding RF Tap Locations
- Amplifier Setup Guide
- The Tap List Example VCR's
- Visual VBI Data Guide
- Closed Captioning
- Teletext
- WSS Wide - Screen Signalling
- VITC Timecode
- VITS Signals
- XDS Data (PBS)
- Video ID IEC 61880
- Auto Audio Align
- Vapoursynth TBC Median Stacking Guide
- Ruxpin-Decode & TV Teddy Tapes
- Tony's GNU Radio For Dummies Guide
- Tony's GNU Radio Scripts
- DomesDay Duplicator Utilities
- ld-decode Utilities







