Zcooger, I found this video by random chance and noticed your comments about vhs-decode. Considering the apparent "anything on tape" scope of this project is anyone interested in implementing PXL-2000 support? It's a "toy" camera that records in a LBTV format onto audio cassettes at about 16.875 inches per second, with a theoretical video bandwidth of about 200KHz (9x the playback rate and bandwidth of 12KHz). His video demonstrates a played back section of a single frame (slowed down to what I assume is 44100Hz) and he calculated and showed various signal timing for sync, etc. That would be a just for kicks thing, as it has literally no application and source material available in 2021.
+ Reply to Thread
Results 751 to 768 of 768
I found another bug or error.
The vhs-decode stuck at frame 71 and the log file repeat the same message until I pressed CTRL+C "lddecode - DEBUG - VBI serration levels 3 - Sync tip: 3703.07 kHz, Blanking (ire0): 4000.73 kHz"
The command: "vhs-decode -p -t4 --10cxadc3 -cafc error.vhs error_out"
The test file: https://files.videohelp.com/u/264498/error.vhs
Update: The latest version from oyvindln git is working.
Is anyone aware of a software based digital audio to video conversion tool? Like something that would take a WAV or FLAC file and convert it to a video signal with digital "pixels" that would allow me to store digital audio on VHS for archival purposes.
Here's package that allows to convert between audio and video in PCM-F1/STC-007 format:
More information you can find on "Fagear Tech Corner" Discord server, #pcm_diy channel (mainly russian but they talk in english too).
Last edited by Titan_91; 1st Nov 2021 at 08:52.
Following this video guide, I finally got QTGMC working in Wine:
Now that I've tried it, the de-interlacing is fantastic but I don't like the noise reduction. It completely decimates any detail gains achieved using vhs-decode over a normal VCR/capture device workflow. Is there a preset that does not use noise reduction? If not, do I need to try SourceMatch to disable noise reduction and sharpness filters? Literally the only thing I want to do with QTGMC is de-interlacing.
[Attachment 61538 - Click to enlarge]
They are called "fish" or "comets" and are an artifact of analog satellite TV reception. They tend to occur in areas of high color saturation and on sharp transitions. Not so much in flat, pale areas. Especially when the weather was bad, this was a common sight in the 90's and early 2000's in Europe.
Since they are "baked in" into the VHS recording, they cannot be fixed by ld-decode. However I used to have reasonably good success masking them with an old AviSynth plugin called "DePulse".
Last edited by Skiller; 31st Oct 2021 at 20:17.
... analog satellite TV reception. They tend to occur in areas of high color saturation and on sharp transitions. Not so much in flat, pale areas. Especially when the weather was bad, this was a common sight in the 90's and early 2000's in Europe.
Here's the AviSynth+ script I settled on to avoid noise reduction:
FFMPEGSource2("vhs-decode.mkv") AssumeTFF() QTGMC(SourceMatch=1, Lossless=2, EdiThreads=4) Prefetch(14)
I did a successful decode of another tape where the signal ended and some white noise was captured at the end of the sample. Here is the terminal output. The white noise is present in the decode at the end of the tape, which is normal. The entire tape decoded fine with no issues or artifacts. Please note I adjusted formats.py to use a 1.5MHz lower cutoff frequency for the NTSC band pass filter.
/usr/lib/python3/dist-packages/numpy/core/fromnumeric.py:3256: RuntimeWarning: Mean of empty slice. return _methods._mean(a, axis=axis, dtype=dtype, /usr/lib/python3/dist-packages/numpy/core/_methods.py:161: RuntimeWarning: invalid value encountered in double_scalars ret = ret.dtype.type(ret / rcount) no valid lines found! Guessing or using values for previous field so result will probably be garbled! ERROR - please paste the following into a bug report: current sample: 57572109582.63985 arguments: Namespace(AGC=False, cafc=False, chroma_trap=False, cxadc=False, cxadc3=False, cxadc3_tenbit=False, cxadc_tenbit=False, debug=False, disable_comb=False, disable_dc_offset=False, disable_diff_demod=False, dod_hysteresis=1.25, dod_threshold_a=None, dod_threshold_p=None, dodod=False, high_boost=None, infile='newhope-windowdedication95.flac', inputfreq=None, length=99999999, level_adjust=0.1, nldeemp=False, noAGC=None, nodod=False, notch=None, notch_q=10.0, ntsc=True, ntscj=False, outfile='newhope-windowdedication95', pal=False, palm=False, recheck_phase=False, sharpness=0, start=0, start_fileloc=-1, sync_clip=False, tape_format='VHS', threads=15, track_phase=None, umatic=False) Exception: cannot convert float NaN to integer Traceback: File "./vhs-decode", line 258, in <module> f = vhsd.readfield() File "/media/user/vhs-decode/vhs-decode new/vhsdecode/process.py", line 750, in readfield f, offset = self.decodefield(initphase=initphase) File "/media/user/vhs-decode/vhs-decode new/lddecode/core.py", line 3466, in decodefield raise e File "/media/user/vhs-decode/vhs-decode new/lddecode/core.py", line 3462, in decodefield f.process() File "/media/user/vhs-decode/vhs-decode new/lddecode/core.py", line 3177, in process super(FieldNTSC, self).process() File "/media/user/vhs-decode/vhs-decode new/lddecode/core.py", line 1472, in process self.linelocs1, self.linebad, self.nextfieldoffset = self.compute_linelocs() File "/media/user/vhs-decode/vhs-decode new/vhsdecode/process.py", line 307, in compute_linelocs int(line0loc) : int(line0loc + (self.meanlinelen) * 4)
Will have a look at it, suspect it's just some function not accounting for no line starts being found in the noise part or something.
Last edited by oln; 8th Nov 2021 at 12:10.
Here's that last sample I did for a church. Turned out great only with a few frames of a darker image shown only at certain times (at 17:50 and 18:36 for example). The source is SP and recorded in 1995. Signal level on the tape is still good, dropout correction wasn't even needed. I no longer have the tape but kept the RF capture. Audio was captured traditionally using the VCR's standard RCA audio jacks.
Last edited by Titan_91; 8th Nov 2021 at 19:02.
There's a bit of an issue when trying to mux audio on a bad tape that causes dropouts in the decoding. I have a degrading tape recorded at EP speed with what appears to be a few seconds of video loss. I think this tape was dubbed with multiple camera sources, which could explain it. Since vhs-decode skips these frames, it causes an audio/video desync in my muxes at the point the frames were skipped. As fields are dropped here and there it causes gradual desync I can't correct for. The logs shows this at certain times:
Unable to determine start of field - dropping field
Last edited by Titan_91; 4th Dec 2021 at 21:28.
It's not an intentional change, would want it to still output something regardless. I suspect my last commit that fixed another issue causing an infinite loop may have broken it but not sure, does reverting the change on line 181 here (or going back to the previous commit if you feel comfortable with git) change the behavior back?
Your last sample looks nice, I'm noticing a slight bit of this bug on it, need to go over the line start detection code to see if it can be improved (I have spotted a similar effect a fair bit on e.g conventional captures done with no line-tbc, especially on dubbed ones.). I think this happens due to the "ghosting"/overshoot/undershoot from the bright spots at the right edge being long enough to affect the levels on the downward part of the horizontal synchronization pulse.
Last edited by oln; 5th Dec 2021 at 13:34.
In process.py, would I just need to delete...
if self.prevfield is not None: ldd.logger.info("lastline < proclines , skipping a tiny bit") return None, None, max(line0loc - (meanlinelen * 20), self.inlinelen)
return None, None, line0loc - (meanlinelen * 20)
I do believe the root cause is over/under shoot during dark to bright transitions as I have black fishes in this scene:
Also, wasn't sure if any automatic gain control code was causing the image to go dark during corrupted fields (is AGC still turned off by default)?
As with all my decodes I'm using a lower cutoff of 1.5MHz for the NTSC band pass filter to get a bit more bandwidth. Should I revert this adjustment back to the default setting for this bad tape? I wonder if it's contributing to the black fishes and ghosting. I would assume not, as the bright transitions are on the upper side of the signal, not the lower side. If I was going too low wouldn't I see a checkerboard pattern from the chroma signal in the luma channel?
Last edited by Titan_91; 5th Dec 2021 at 17:36.