https://github.com/bitfocus/libltc-wrapper
libltc wrapper for node.js
https://github.com/bitfocus/libltc-wrapper
Last synced: about 2 months ago
JSON representation
libltc wrapper for node.js
- Host: GitHub
- URL: https://github.com/bitfocus/libltc-wrapper
- Owner: bitfocus
- Created: 2022-06-13T20:45:14.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2022-09-20T06:11:43.000Z (over 2 years ago)
- Last Synced: 2025-04-15T22:19:02.201Z (about 2 months ago)
- Language: C
- Size: 226 KB
- Stars: 9
- Watchers: 5
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# libltc wrapper

This module gives you access to the [libltc](https://x42.github.io/libltc/) library from node.js.
# Bits per sample
Internally libltc uses 8 bit unsigned audio data, but the decoder supports reading uint16, sint16 and float too. The encoder however only supports uint8.
# Installation
The following architectures are supported:
* linux-x64
* linux-armhf
* linux-arm64
* macos-x64
* macos-arm64 (M1)
* windows-x64Add the module to your project:
```bash
npm i libltc-wrapper
# or
yarn add libltc-wrapper
```# State
* Successfully encodes and decodes LTC audio
* Tested successfully on Macbook Pro M1 (arm64) and Ubuntu 20.04 (x64)# Examples
## Decoding
```javascript
const { LTCDecoder } = require('libltc-wrapper');
const decoder = new LTCDecoder(48000, 25, "u8"); // 48khz, 25 fps, unsigned 8 bit// Write audio buffer to the decoder
decoder.write(audioframes);// Check if there is any ltc frames ready
let frame = decoder.read();if (frame !== undefined) {
// found a valid frame
console.log("Frame: ", frame);
}
```## Encoding
```javascript
const { LTCEncoder, LTC_USE_DATE } = require('libltc-wrapper');const encoder = new LTCEncoder(48000, 25, LTC_USE_DATE); // 48khz, 25 fps, LTC_USE_DATE flag
let time = new Date();encoder.setTimecode({
hours: time.getHours(),
minutes: time.getMinutes(),
seconds: time.getSeconds(),
frame: time.getMilliseconds() / (1000 / 25),
days: time.getDate(),
months: time.getMonth() + 1,
years: time.getFullYear() % 100,
timezone: "+0000"
})
// Every frame (25 times per second) increase the current frame
encoder.incrementTimecode();// Get 1 frame worth of LTC audio (48khz 25fps would be 40ms audio)
encoder.encodeFrame();
let buffer = encoder.getBuffer();
```# Class methods
## LTCDecoder instance methods
### constructor(sampleRate: number, framerate: number, audioFormat: string)
Samplerate in hz, for example 48000. Framerate should be less than or equal to 30 fps. Audioformat must be one of `u8` for unsigned 8 bit, `u16` for unsigned 16 bit, `s16` for signed 16 bit, or `float` for 32 bit float.
### write(buffer: Buffer)
Write audio data to the decoder, should be full frames, but any number of frames. They will be buffered up until it finds a LTC frame
### read()
Reads the next frame from the decoder queue. If there are no frames in the queue it returns undefined. When a valid frame is found, it returns a LTCFrame object.
## LTCEncoder instance methods
### constructor(sampleRate: number, framerate: number, flags?: number);
Samplerate in hz, for example 48000. Framerate should be less than or equal to 30. Flags should be one, or a combination of the following flags: `LTC_USE_DATE`, `LTC_TC_CLOCK`, `LTC_BGF_DONT_TOUCH`, `LTC_NO_PARITY`. See the librtc documentation for more information about the flags. The default flag is `LTC_USE_DATE`.
### setVolume(dBFS: number)
Set the volume of the generated LTC signal, in dBFs
### setFilter(riseTime: number)
Set encoder signal rise-time / signal filtering, in uS. Default is 40.
### setTimecode(timecode: LTCTimecode)
Set encoder timecode, expects a LTCTimecode object. You only need to specify non-zero parameters. The default is 0 for any omitted object parameters.
### getTimecode()
Get the current encoder timecode. Returns a LTCTimecode object with the current position.
### encodeFrame()
Write the next frame to the audio buffer. Fetch the buffer using `getBuffer()`.
### incrementTimecode()
Increment the current timecode by one frame.
### decrementTimecode()
Decrement the timecode by one frame
### getBuffer()
Returns the audio buffer for the current frame. The size of this buffer would be sample_rate / fps. So at 48000 khz, 25fps, that would be 1920 bytes of unsigned 8 bit audio.
# License
This node module is licensed under the MIT license. And [libltc](https://x42.github.io/libltc/) is licensed under the GNU LGPL 3 license, but is included in this project in binary form and dynamically linked. So this module _should_ in theory be safe to use in any open source or closed source commercial products. I am not a lawyer. This must not be construed as legal advice. Read more here http://answers.google.com/answers/threadview/id/439136.html