npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

node-video-lib-pkg-compatible

v2.2.2

Published

Node.js Video Library / MP4 & FLV parser / MP4 builder / HLS muxer

Downloads

17

Readme

node-video-lib-pkg-compatible

This is the pkg compatible node-video-lib for those of you building executable node.js applications. Simply install it and run it as usual with pkg . and then executing the generated program.

Build Status npm Version Maintainability Test Coverage GitHub License Donate using PayPal Buy me a Coffee

Node.js Video Library / MP4 & FLV parser / MP4 builder / HLS muxer

Limitations

This library works only with MP4 and FLV video files encoded using H.264/H.265 video codecs and AAC audio codec.

Installation

$ npm install node-video-lib

Usage

Parse video file

const fs = require('fs');
const VideoLib = require('node-video-lib');

fs.open('/path/to/file', 'r', function(err, fd) {
    try {
        let movie = VideoLib.MovieParser.parse(fd);
        // Work with movie
        console.log('Duration:', movie.relativeDuration());
    } catch (ex) {
        console.error('Error:', ex);
    } finally {
        fs.closeSync(fd);
    }
});

Create MPEG-TS chunks

const fs = require('fs');
const VideoLib = require('node-video-lib');

fs.open('/path/to/file', 'r', function(err, fd) {
    try {
        let movie = VideoLib.MovieParser.parse(fd);
        let fragmentList = VideoLib.FragmentListBuilder.build(movie, 5);
        for (let i = 0; i < fragmentList.count(); i++) {
            let fragment = fragmentList.get(i);
            let sampleBuffers = VideoLib.FragmentReader.readSamples(fragment, fd);
            let buffer = VideoLib.HLSPacketizer.packetize(fragment, sampleBuffers);
            // Now buffer contains MPEG-TS chunk
        }
    } catch (ex) {
        console.error('Error:', ex);
    } finally {
        fs.closeSync(fd);
    }
});

Build MP4 file

const fs = require('fs');
const VideoLib = require('node-video-lib');

fs.open('/path/to/file', 'r', function(err, fd) {
    try {
        let movie = VideoLib.MovieParser.parse(fd);
        fs.open('/path/to/output.mp4', 'w', function(err, fw) {
            try {
                VideoLib.MP4Builder.build(movie, fd, fw);
            } catch (ex) {
                console.error('Error:', ex);
            } finally {
                fs.closeSync(fw);
            }
        }
    } catch (ex) {
        console.error('Error:', ex);
    } finally {
        fs.closeSync(fd);
    }
});

Create index file

const fs = require('fs');
const VideoLib = require('node-video-lib');

fs.open('/path/to/file', 'r', function(err, fd) {
    try {
        let movie = VideoLib.MovieParser.parse(fd);
        let fragmentList = VideoLib.FragmentListBuilder.build(movie, 5);
        console.log('Duration:', fragmentList.relativeDuration());
        fs.open('/path/to/index.idx', 'w', function(err, fdi) {
            try {
                VideoLib.FragmentListIndexer.index(fragmentList, fdi);
            } catch (ex) {
                console.error('Error:', ex);
            } finally {
                fs.closeSync(fdi);
            }
        });
    } catch (ex) {
        console.error('Error:', ex);
    } finally {
        fs.closeSync(fd);
    }
});

Create MPEG-TS chunks using index file

const fs = require('fs');
const VideoLib = require('node-video-lib');

fs.open('/path/to/file', 'r', function(err, fd) {
    fs.open('/path/to/index.idx', 'r', function(err, fdi) {
        try {
            let fragmentList = VideoLib.FragmentListIndexer.read(fdi);
            console.log('Duration:', fragmentList.relativeDuration());
            for (let i = 0; i < fragmentList.count(); i++) {
                let fragment = fragmentList.get(i);
                let sampleBuffers = VideoLib.FragmentReader.readSamples(fragment, fd);
                let buffer = VideoLib.HLSPacketizer.packetize(fragment, sampleBuffers);
                // Now buffer contains MPEG-TS chunk
            }
        } catch (ex) {
            console.error('Error:', ex);
        } finally {
            fs.closeSync(fd);
            fs.closeSync(fdi);
        }
    });
});

Classes

MovieParser

A tool for parsing video files (MP4 or FLV).

const MovieParser = require('node-video-lib').MovieParser

Methods:

  • parse(source) - Parse video file
    • source <Integer>|<Buffer> - Source (File descriptor or Buffer)
    • Return: <Movie>

MP4Parser

A tool for parsing MP4 video files.

const MP4Parser = require('node-video-lib').MP4Parser

Methods:

  • parse(source) - Parse MP4 file
    • source <Integer>|<Buffer> - Source (File descriptor or Buffer)
    • Return: <Movie>
  • check(buffer) - Check MP4 header
    • buffer <Buffer> - File header (first 8 bytes)
    • Return: <boolean>

FLVParser

A tool for parsing FLV video files.

const FLVParser = require('node-video-lib').FLVParser

Methods:

  • parse(source) - Parse FLV file
    • source <Integer>|<Buffer> - Source (File descriptor or Buffer)
    • Return: <Movie>
  • check(buffer) - Check FLV header
    • buffer <Buffer> - File header (first 8 bytes)
    • Return: <boolean>

MP4Builder

A tool for building MP4 video files.

const MP4Builder = require('node-video-lib').MP4Builder

Methods:

  • build(movie, source, fd) - Build MP4 file
    • movie <Movie> - Movie
    • source <Integer>|<Buffer> - Source (File descriptor or Buffer)
    • fd <Integer> - File descriptor

HLSPacketizer

A tool for creating MPEG-TS chunks.

const HLSPacketizer = require('node-video-lib').HLSPacketizer

Methods:

  • packetize(fragment, sampleBuffers) - Create MPEG-TS chunk from movie fragment
    • fragment <Fragment> - Movie fragment
    • sampleBuffers <Array> - Array of buffers
    • Return: <Buffer>

FragmentListBuilder

A tool for splitting the movie into a list of fragments.

const FragmentListBuilder = require('node-video-lib').FragmentListBuilder

Methods:

  • build(movie, fragmentDuration) - Split the movie to a list of fragments with an appropriate duration

FragmentListIndexer

A tool to work with index files.

const FragmentListIndexer = require('node-video-lib').FragmentListIndexer

Methods:

  • index(fragmentList, fd) - Index fragment list
    • fragmentList <FragmentList> - Fragment list
    • fd <Integer> - File descriptor
  • read(fd) - Read fragment list from index

FragmentReader

A tool for reading samples data of the given movie fragment.

const FragmentReader = require('node-video-lib').FragmentReader

Methods:

  • readSamples(fragment, source) - Read samples data
    • fragment <Fragment> - Movie fragment
    • source <Integer>|<Buffer> - Source (File descriptor or Buffer)
    • Return: <Array> Array of buffers

Movie

A movie class

const Movie = require('node-video-lib').Movie

Properties:

  • duration <Integer> - Movie duration
  • timescale <Integer> - Movie timescale
  • tracks <Array> - List of movie tracks

Methods:

  • relativeDuration() - Movie duration in seconds
    • Return: <Number>
  • resolution() - Video resolution
    • Return: <String>
  • size() - Samples size
    • Return: <Integer>
  • addTrack(track) - Add a track to the tracks list
    • track <Track> - Track
  • videoTrack() - Get the first video track
    • Return: <VideoTrack>
  • audioTrack() - Get the first audio track
    • Return: <AudioTrack>
  • samples() - Get a list of movie samples ordered by relative timestamp
    • Return: <Array>
  • ensureDuration() - Calculate and set duration based on the track durations (only if duration is zero)
    • Return: <Number>

FragmentList

A list of movie fragments class.

const FragmentList = require('node-video-lib').FragmentList

Properties:

  • fragmentDuration <Integer> - Target fragment duration
  • duration <Integer> - Movie duration
  • timescale <Integer> - Movie timescale
  • video <Object> - Video info
    • timescale <Integer> - Video timescale
    • codec <String> - Codec string
    • extraData <Buffer> - Video codec information
    • size <Integer> - Video samples size
    • width <Integer> - Video width
    • height <Integer> - Video height
  • audio <Object> - Audio info
    • timescale <Integer> - Audio timescale
    • codec <String> - Codec string
    • extraData <Buffer> - Audio codec information
    • size <Integer> - Audio samples size

Methods:

  • relativeDuration() - Movie duration in seconds
    • Return: <Number>
  • count() - Fragments count
    • Return: <Integer>
  • size() - Samples size
    • Return: <Integer>
  • get(index) - Get fragment by index

Fragment

A movie fragment class

const Fragment = require('node-video-lib').Fragment

Properties:

  • timestamp <Integer> - Fragment timestamp
  • duration <Integer> - Fragment duration
  • timescale <Integer> - Fragment timescale
  • videoExtraData <Buffer> - Video codec information
  • audioExtraData <Buffer> - Audio codec information
  • samples <Array> - List of fragment samples

Methods:

  • relativeTimestamp() - Fragment timestamp in seconds
    • Return: <Number>
  • relativeDuration() - Fragment duration in seconds
    • Return: <Number>
  • hasVideo() - Fragment has a video track
    • Return: <Boolean>
  • hasAudio() - Fragment has an audio track
    • Return: <Boolean>

Track

A general track class

const Track = require('node-video-lib').Track

Properties:

  • duration <Integer> - Track duration
  • timescale <Integer> - Track timescale
  • codec <String> - Codec string
  • extraData <Buffer> - Codec information
  • samples <Array> - List of track samples

Methods:

  • relativeDuration() - Track duration in seconds
    • Return: <Number>
  • ensureDuration() - Calculate and set duration based on the sample durations (only if duration is zero)
    • Return: <Number>
  • size() - Samples size
    • Return: <Integer>

AudioTrack

An audio track class. Extends the general track class

const AudioTrack = require('node-video-lib').AudioTrack

Properties:

  • channels <Integer> - Number of audio channels
  • sampleRate <Integer> - Audio sample rate
  • sampleSize <Integer> - Audio sample size

VideoTrack

A video track class. Extends the general track class

const VideoTrack = require('node-video-lib').VideoTrack

Properties:

  • width <Integer> - Video width
  • height <Integer> - Video height

Methods:

  • resolution() - Video resolution
    • Return: <String>

Sample

A general video sample class

const Sample = require('node-video-lib').Sample

Properties:

  • timestamp <Integer> - Sample timestamp
  • timescale <Integer> - Sample timescale
  • size <Integer> - Sample size
  • offset <Integer> - Sample offset in the file

Methods:

  • relativeTimestamp() - Sample timestamp in seconds
    • Return: <Number>

AudioSample

An audio sample class. Extends the general sample class

const AudioSample = require('node-video-lib').AudioSample

VideoSample

A video sample class. Extends the general sample class

const VideoSample = require('node-video-lib').VideoSample

Properties:

  • compositionOffset <Integer> - Composition offset
  • keyframe <Boolean> - Keyframe flag