{"_id":"@bobfrankston/vhscap","name":"@bobfrankston/vhscap","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.1":{"name":"@bobfrankston/vhscap","version":"0.1.1","description":"Capture VHS/composite video from a DirectShow device with ffmpeg, with a live preview window that never aborts the recording","type":"module","main":"vhscap.js","types":"vhscap.d.ts","bin":{"vhscap":"vhscap.js"},"scripts":{"build":"tsc"},"engines":{"node":">=25"},"os":["win32"],"keywords":["vhs","capture","directshow","dshow","ffmpeg","video"],"author":{"name":"Bob Frankston"},"license":"ISC","repository":{"type":"git","url":"git+ssh://git@github.com/BobFrankston/vhscap.git"},"devDependencies":{"@types/node":"^26.1.1"},"_id":"@bobfrankston/vhscap@0.1.1","bugs":{"url":"https://github.com/BobFrankston/vhscap/issues"},"homepage":"https://github.com/BobFrankston/vhscap#readme","_integrity":"sha512-VXKIchXSiBzP0Z04ldIvKQ6tQUs+kSiK1+dwM3UkcnrymSKyEFHraCfS2e+//OkpdIWIgdb9hpe3cwQaga0FZg==","_resolved":"Y:\\dev\\projects\\video\\vhscap\\bobfrankston-vhscap-0.1.1.tgz","_from":"file:bobfrankston-vhscap-0.1.1.tgz","_nodeVersion":"26.4.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-VXKIchXSiBzP0Z04ldIvKQ6tQUs+kSiK1+dwM3UkcnrymSKyEFHraCfS2e+//OkpdIWIgdb9hpe3cwQaga0FZg==","shasum":"f957b40a48b1291b7bcee7041d0141b8137ff2f3","tarball":"https://registry.npmjs.org/@bobfrankston/vhscap/-/vhscap-0.1.1.tgz","fileCount":4,"unpackedSize":15708,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDOpkO7hPuZEls1c4Cn1T7DKre3tF1vlA4vT/iEUo2BmQIgWkofsTSDIShQJULpnlUMXyKb3dUAVswc+nXQP5IZfX0="}]},"_npmUser":{"name":"bobfrankston","email":"npm@bob.ma"},"directories":{},"maintainers":[{"name":"bobfrankston","email":"npm@bob.ma"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vhscap_0.1.1_1784488622209_0.19180234516893102"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-19T19:17:02.015Z","0.1.1":"2026-07-19T19:17:02.338Z","modified":"2026-07-19T19:17:02.534Z"},"maintainers":[{"name":"bobfrankston","email":"npm@bob.ma"}],"description":"Capture VHS/composite video from a DirectShow device with ffmpeg, with a live preview window that never aborts the recording","homepage":"https://github.com/BobFrankston/vhscap#readme","keywords":["vhs","capture","directshow","dshow","ffmpeg","video"],"repository":{"type":"git","url":"git+ssh://git@github.com/BobFrankston/vhscap.git"},"author":{"name":"Bob Frankston"},"bugs":{"url":"https://github.com/BobFrankston/vhscap/issues"},"license":"ISC","readme":"# vhscap\n\nRecord from a DirectShow capture device (a generic USB VHS/composite dongle) with ffmpeg,\nshowing a live preview window while it records.\n\n## Install\n\n```\nnpm install -g @bobfrankston/vhscap\n```\n\nWindows-only (DirectShow). Requires ffmpeg + ffplay on PATH and Node 25+.\n\nThis ffmpeg build has no SDL output device, so ffmpeg can't open its own preview window.\nvhscap has ffmpeg write the recording file and pipe a second low-latency stream (intra-only\nmpeg2, no encoder lookahead lag) which the script forwards to an ffplay window. Because the\nscript does the forwarding, **closing the preview window does not stop the recording**.\n\n## Usage\n\n```\nvhscap -list                      list video/audio capture devices\nvhscap -modes [-video \"name\"]     list a device's supported resolutions/framerates\nvhscap [options]                  record — press q in the console to stop\n```\n\nOptions:\n\n| Flag | Meaning |\n|------|---------|\n| `-video \"name\"` | video device (auto-picked when only one real device exists; OBS Virtual Camera is ignored) |\n| `-audio \"name\"` | audio device, or `-audio none`. Default: the audio device on the **same physical USB device** as the video device (paired via Windows PnP vid/pid), falling back to name matching (e.g. `\"AV TO USB2.0\"` / `\"Line (AV TO USB2.0)\"`). If no single device pairs, vhscap lists them and asks for `-audio`. |\n| `-size WxH` | force capture resolution (default: device native) |\n| `-fps n` | force framerate (default: device native) |\n| `-out file` | output file (default `vhs-YYYYMMDD-HHMMSS.mkv`) |\n| `-crf n` | x264 quality, lower = better (default 18, visually lossless for VHS) |\n| `-nopreview` | record without the preview window |\n\nTypical session:\n\n```\nvhscap -list\nvhscap -modes -video \"USB Video\"\nvhscap -video \"USB Video\" -audio \"Line (USB Audio Device)\"\n```\n\n## Notes on VHS resolution\n\nThere is no 480x320 mode — NTSC composite capture is delivered at **720x480** (or 640x480)\nat 29.97 fps interlaced, and that's the native mode generic dongles expose. VHS tape itself\nonly resolves ~240 luma lines horizontally, but you still capture at 720x480 because that's\nwhat the digitizer emits; downscaling would discard information. Leave `-size` unset to get\nthe device's native mode; use `-modes` to see what the dongle actually offers.\n\nThe recording is kept as the dongle delivers it (interlaced). If you later want a\ndeinterlaced copy for viewing: `ffmpeg -i in.mkv -vf yadif out.mp4`.\n\n## Development\n\nSource is `vhscap.ts`, compiled in place by `tsc` (co-located `.js`/`.d.ts`/`.map`).\nPublish with `npmglobalize`.\n","readmeFilename":"README.md","_rev":"1-b6502198bfb9e8357429604ca1458db8"}