Node.js library for USB Video Class (UVC) devices (node-libuvc)

Low-level Node.js library for USB Video Class (UVC) devices, wrapping the cross-platform libuvc C library. Used to write software for webcams, camcorders, etcetera.

UVC-compliant devices include webcams, digital camcorders, transcoders, analog video converters and still-image cameras.

This is a experimental, proof-of-concept combining several technologies.

This proof-of-concept lead to the development of node-ffi-packager.


  • All functionality of libuvc available in Node.js.
  • Strictly follows the libuvc.h C header file.
  • Enables C-style programming.
    • This style is different from the usual conveniences of modern Javascript.
    • This low-level library was primarily created to enable building other libraries, where developer convenience can be a goal.



Use a package.json reference to your preferred semantic version node-libuvc git tag.

npm install --save github:joelpurra/node-libuvc#semver:^v1.0.0


See ./examples/ for ready-to-run code.

const libuvc = require("libuvc");
const ref = require("ref-napi");

// NOTE: C types in comments for reference.
const /* uvc_context_t * */ ctx = ref.alloc(libuvc.types.uvc_context_tPointer);
const /* uvc_device_t * */ dev = ref.alloc(libuvc.types.uvc_device_tPointer);
const /* uvc_device_handle_t * */ devh = ref.alloc(
const /* uvc_stream_ctrl_t */ ctrl = ref.alloc(libuvc.types.uvc_stream_ctrl_t);
let /* uvc_error_t */ res;

res = libuvc.functions.uvc_init(/* & */ ctx, null);
res = libuvc.functions.uvc_find_device(ctx.deref(), /* & */ dev, 0, 0, null);
res = libuvc.functions.uvc_open(dev.deref(), /* & */ devh);

// NOTE: use the UVC device here, for example setting controls and streaming image frames.



The package should be automatically built by npm install. You can also manually (re)build the package dependencies.

npm run --silent build


# Make sure git-flow is initialized.
git flow init -d

npm run --silent rebuild

npm run --silent test

See also


node-libuvc Copyright © 2020, 2021 Joel Purra. Released under GNU Lesser General Public License version 3.0 (LGPL-3.0). Your donations are appreciated!