{"id":13455183,"url":"https://github.com/gkozlenko/node-video-lib","last_synced_at":"2026-01-03T11:25:48.968Z","repository":{"id":8827721,"uuid":"59880072","full_name":"gkozlenko/node-video-lib","owner":"gkozlenko","description":"Node.js Video Library / MP4 \u0026 FLV parser / MP4 builder / HLS muxer","archived":false,"fork":false,"pushed_at":"2024-04-28T14:25:42.000Z","size":50060,"stargazers_count":347,"open_issues_count":3,"forks_count":18,"subscribers_count":8,"default_branch":"master","last_synced_at":"2024-05-17T16:34:21.587Z","etag":null,"topics":["flv","h264","h265","hevc","hls","mp4","mpeg-ts","mpegts","ts-muxer","tsmuxer","video"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gkozlenko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"custom":["https://www.paypal.me/pipll","https://www.buymeacoffee.com/NIUeF95"]}},"created_at":"2016-05-28T06:08:56.000Z","updated_at":"2024-06-18T15:19:49.761Z","dependencies_parsed_at":"2023-07-16T13:54:17.360Z","dependency_job_id":"79245f9d-d922-44a1-9058-c548df8ce2c9","html_url":"https://github.com/gkozlenko/node-video-lib","commit_stats":{"total_commits":242,"total_committers":2,"mean_commits":121.0,"dds":"0.024793388429752095","last_synced_commit":"3519209fe0b3e2e2ab39182d77b939cb7d1bb40b"},"previous_names":["pipll/node-mp4-parser"],"tags_count":33,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gkozlenko%2Fnode-video-lib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gkozlenko%2Fnode-video-lib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gkozlenko%2Fnode-video-lib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gkozlenko%2Fnode-video-lib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gkozlenko","download_url":"https://codeload.github.com/gkozlenko/node-video-lib/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221947446,"owners_count":16906130,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flv","h264","h265","hevc","hls","mp4","mpeg-ts","mpegts","ts-muxer","tsmuxer","video"],"created_at":"2024-07-31T08:01:02.161Z","updated_at":"2026-01-03T11:25:48.915Z","avatar_url":"https://github.com/gkozlenko.png","language":"JavaScript","readme":"# node-video-lib\n\n[![build status](https://github.com/gkozlenko/node-video-lib/actions/workflows/node.js.yml/badge.svg)](https://github.com/gkozlenko/node-video-lib/actions/workflows/node.js.yml)\n[![test coverage](https://gkozlenko.github.io/node-video-lib/badges/coverage.svg)](https://github.com/gkozlenko/node-video-lib/actions/workflows/node.js.yml)\n[![npm version](https://img.shields.io/npm/v/node-video-lib.svg)](https://www.npmjs.com/package/node-video-lib)\n[![license](https://img.shields.io/github/license/gkozlenko/node-video-lib.svg)](https://github.com/gkozlenko/node-video-lib/blob/master/LICENSE)\n\nNode.js Video Library / MP4 \u0026 FLV parser / MP4 builder / HLS muxer\n\n## Limitations\n\n**This library works only with MP4 and FLV video files encoded using H.264/H.265 video codecs and AAC audio codec.**\n\n## Installation\n\n```bash\n$ npm install node-video-lib\n```\n\n## Usage\n\n### Parse video file\n\n```javascript\nconst fs = require('fs');\nconst VideoLib = require('node-video-lib');\n\nlet fd = fs.openSync('/path/to/file', 'r');\ntry {\n    let movie = VideoLib.MovieParser.parse(fd);\n    // Work with movie\n    console.log('Duration:', movie.relativeDuration());\n} catch (ex) {\n    console.error('Error:', ex);\n} finally {\n    fs.closeSync(fd);\n}\n```\n\n### Create MPEG-TS chunks\n\n```javascript\nconst fs = require('fs');\nconst VideoLib = require('node-video-lib');\n\nlet fd = fs.openSync('/path/to/file', 'r');\ntry {\n    let movie = VideoLib.MovieParser.parse(fd);\n    let fragmentList = VideoLib.FragmentListBuilder.build(movie, 5);\n    for (let i = 0; i \u003c fragmentList.count(); i++) {\n        let fragment = fragmentList.get(i);\n        let sampleBuffers = VideoLib.FragmentReader.readSamples(fragment, fd);\n        let buffer = VideoLib.HLSPacketizer.packetize(fragment, sampleBuffers);\n        // Now buffer contains MPEG-TS chunk\n    }\n} catch (ex) {\n    console.error('Error:', ex);\n} finally {\n    fs.closeSync(fd);\n}\n```\n\n### Build MP4 file\n\n```javascript\nconst fs = require('fs');\nconst VideoLib = require('node-video-lib');\n\nlet fd = fs.openSync('/path/to/file', 'r');\ntry {\n    let movie = VideoLib.MovieParser.parse(fd);\n    let fw = fs.openSync('/path/to/output.mp4', 'w');\n    try {\n        VideoLib.MP4Builder.build(movie, fd, fw);\n    } catch (ex) {\n        console.error('Error:', ex);\n    } finally {\n        fs.closeSync(fw);\n    }\n} catch (ex) {\n    console.error('Error:', ex);\n} finally {\n    fs.closeSync(fd);\n}\n```\n\n### Create index file\n\n```javascript\nconst fs = require('fs');\nconst VideoLib = require('node-video-lib');\n\nlet fd = fs.openSync('/path/to/file', 'r');\ntry {\n    let movie = VideoLib.MovieParser.parse(fd);\n    let fragmentList = VideoLib.FragmentListBuilder.build(movie, 5);\n    console.log('Duration:', fragmentList.relativeDuration());\n    let fdi = fs.openSync('/path/to/index.idx', 'w');\n    try {\n        VideoLib.FragmentListIndexer.index(fragmentList, fdi);\n    } catch (ex) {\n        console.error('Error:', ex);\n    } finally {\n        fs.closeSync(fdi);\n    }\n} catch (ex) {\n    console.error('Error:', ex);\n} finally {\n    fs.closeSync(fd);\n}\n```\n\n### Create MPEG-TS chunks using index file\n\n```javascript\nconst fs = require('fs');\nconst VideoLib = require('node-video-lib');\n\nlet fd = fs.openSync('/path/to/file', 'r');\nlet fdi = fs.openSync('/path/to/index.idx', 'r');\ntry {\n    let fragmentList = VideoLib.FragmentListIndexer.read(fdi);\n    console.log('Duration:', fragmentList.relativeDuration());\n    for (let i = 0; i \u003c fragmentList.count(); i++) {\n        let fragment = fragmentList.get(i);\n        let sampleBuffers = VideoLib.FragmentReader.readSamples(fragment, fd);\n        let buffer = VideoLib.HLSPacketizer.packetize(fragment, sampleBuffers);\n        // Now buffer contains MPEG-TS chunk\n    }\n} catch (ex) {\n    console.error('Error:', ex);\n} finally {\n    fs.closeSync(fd);\n    fs.closeSync(fdi);\n}\n```\n\n## Classes\n\n### MovieParser\n\nA tool for parsing video files (MP4 or FLV).\n\n```javascript\nconst MovieParser = require('node-video-lib').MovieParser\n```\n\nMethods:\n\n* **parse(source)** - Parse video file\n    * **source** *\\\u003cInteger\\\u003e*|[*\\\u003cBuffer\\\u003e*](https://nodejs.org/api/buffer.html) - Source (File descriptor or Buffer)\n    * Return: [*\\\u003cMovie\\\u003e*](#movie)\n\n### MP4Parser\n\nA tool for parsing MP4 video files.\n\n```javascript\nconst MP4Parser = require('node-video-lib').MP4Parser\n```\n\nMethods:\n\n* **parse(source)** - Parse MP4 file\n    * **source** *\\\u003cInteger\\\u003e*|[*\\\u003cBuffer\\\u003e*](https://nodejs.org/api/buffer.html) - Source (File descriptor or Buffer)\n    * Return: [*\\\u003cMovie\\\u003e*](#movie)\n* **check(buffer)** - Check MP4 header\n    * **buffer** [*\\\u003cBuffer\\\u003e*](https://nodejs.org/api/buffer.html) - File header (first 8 bytes)\n    * Return: *\\\u003cboolean\\\u003e*\n\n### FLVParser\n\nA tool for parsing FLV video files.\n\n```javascript\nconst FLVParser = require('node-video-lib').FLVParser\n```\n\nMethods:\n\n* **parse(source)** - Parse FLV file\n    * **source** *\\\u003cInteger\\\u003e*|[*\\\u003cBuffer\\\u003e*](https://nodejs.org/api/buffer.html) - Source (File descriptor or Buffer)\n    * Return: [*\\\u003cMovie\\\u003e*](#movie)\n* **check(buffer)** - Check FLV header\n    * **buffer** [*\\\u003cBuffer\\\u003e*](https://nodejs.org/api/buffer.html) - File header (first 8 bytes)\n    * Return: *\\\u003cboolean\\\u003e*\n\n### MP4Builder\n\nA tool for building MP4 video files.\n\n```javascript\nconst MP4Builder = require('node-video-lib').MP4Builder\n```\n\nMethods:\n\n* **build(movie, source, fd)** - Build MP4 file\n    * **movie** [*\\\u003cMovie\\\u003e*](#movie) - Movie\n    * **source** *\\\u003cInteger\\\u003e*|[*\\\u003cBuffer\\\u003e*](https://nodejs.org/api/buffer.html) - Source (File descriptor or Buffer)\n    * **fd** *\\\u003cInteger\\\u003e* - File descriptor\n\n### HLSPacketizer\n\nA tool for creating MPEG-TS chunks.\n\n```javascript\nconst HLSPacketizer = require('node-video-lib').HLSPacketizer\n```\n\nMethods:\n\n* **packetize(fragment, sampleBuffers)** - Create MPEG-TS chunk from movie fragment\n    * **fragment** [*\\\u003cFragment\\\u003e*](#fragment) - Movie fragment\n    * **sampleBuffers** *\\\u003cArray\\\u003e* - Array of buffers\n    * Return: [*\\\u003cBuffer\\\u003e*](https://nodejs.org/api/buffer.html)\n\n### FragmentListBuilder\n\nA tool for splitting the movie into a list of fragments.\n\n```javascript\nconst FragmentListBuilder = require('node-video-lib').FragmentListBuilder\n```\n\nMethods:\n\n* **build(movie, fragmentDuration)** - Split the movie to a list of fragments with an appropriate duration\n    * **movie** [*\\\u003cMovie\\\u003e*](#movie) - Movie\n    * **fragmentDuration** *\\\u003cInteger\\\u003e* - Fragment duration\n    * Return: [*\\\u003cFragmentList\\\u003e*](#fragmentlist)\n\n### FragmentListIndexer\n\nA tool to work with index files.\n\n```javascript\nconst FragmentListIndexer = require('node-video-lib').FragmentListIndexer\n```\n\nMethods:\n\n* **index(fragmentList, fd)** - Index fragment list\n    * **fragmentList** [*\\\u003cFragmentList\\\u003e*](#fragmentlist) - Fragment list\n    * **fd** *\\\u003cInteger\\\u003e* - File descriptor\n* **read(fd)** - Read fragment list from index\n    * **fd** *\\\u003cInteger\\\u003e* - File descriptor\n    * Return: [*\\\u003cFragmentList\\\u003e*](#fragmentlist)\n\n### FragmentReader\n\nA tool for reading samples data of the given movie fragment.\n\n```javascript\nconst FragmentReader = require('node-video-lib').FragmentReader\n```\n\nMethods:\n\n* **readSamples(fragment, source)** - Read samples data\n    * **fragment** [*\\\u003cFragment\\\u003e*](#fragment) - Movie fragment\n    * **source** *\\\u003cInteger\\\u003e*|[*\\\u003cBuffer\\\u003e*](https://nodejs.org/api/buffer.html) - Source (File descriptor or Buffer)\n    * Return: *\\\u003cArray\\\u003e* Array of buffers\n\n### Movie\n\nA movie class\n\n```javascript\nconst Movie = require('node-video-lib').Movie\n```\n\nProperties:\n\n* **duration** *\\\u003cInteger\\\u003e* - Movie duration\n* **timescale** *\\\u003cInteger\\\u003e* - Movie timescale\n* **tracks** *\\\u003cArray\\\u003e* - List of movie tracks\n\nMethods:\n\n* **relativeDuration()** - Movie duration in seconds\n    * Return: *\\\u003cNumber\\\u003e*\n* **resolution()** - Video resolution\n    * Return: *\\\u003cString\\\u003e*\n* **size()** - Samples size\n    * Return: *\\\u003cInteger\\\u003e*\n* **addTrack(track)** - Add a track to the tracks list\n    * **track** *\\\u003cTrack\\\u003e* - Track\n* **videoTrack()** - Get the first video track\n    * Return: *\\\u003cVideoTrack\\\u003e*\n* **audioTrack()** - Get the first audio track\n    * Return: *\\\u003cAudioTrack\\\u003e*\n* **samples()** - Get a list of movie samples ordered by relative timestamp\n    * Return: *\\\u003cArray\\\u003e*\n* **ensureDuration()** - Calculate and set duration based on the track durations (only if duration is zero)\n    * Return: *\\\u003cNumber\\\u003e*\n\n### FragmentList\n\nA list of movie fragments class.\n\n```javascript\nconst FragmentList = require('node-video-lib').FragmentList\n```\n\nProperties:\n\n* **fragmentDuration** *\\\u003cInteger\\\u003e* - Target fragment duration\n* **duration** *\\\u003cInteger\\\u003e* - Movie duration\n* **timescale** *\\\u003cInteger\\\u003e* - Movie timescale\n* **video** *\\\u003cObject\\\u003e* - Video info\n    * **timescale** *\\\u003cInteger\\\u003e* - Video timescale\n    * **codec** *\\\u003cString\\\u003e* - Codec string\n    * **extraData** [*\\\u003cBuffer\\\u003e*](https://nodejs.org/api/buffer.html) - Video codec information\n    * **size** *\\\u003cInteger\\\u003e* - Video samples size\n    * **width** *\\\u003cInteger\\\u003e* - Video width\n    * **height** *\\\u003cInteger\\\u003e* - Video height\n* **audio** *\\\u003cObject\\\u003e* - Audio info\n    * **timescale** *\\\u003cInteger\\\u003e* - Audio timescale\n    * **codec** *\\\u003cString\\\u003e* - Codec string\n    * **extraData** [*\\\u003cBuffer\\\u003e*](https://nodejs.org/api/buffer.html) - Audio codec information\n    * **size** *\\\u003cInteger\\\u003e* - Audio samples size\n\nMethods:\n\n* **relativeDuration()** - Movie duration in seconds\n    * Return: *\\\u003cNumber\\\u003e*\n* **count()** - Fragments count\n    * Return: *\\\u003cInteger\\\u003e*\n* **size()** - Samples size\n    * Return: *\\\u003cInteger\\\u003e*\n* **get(index)** - Get fragment by index\n    * Return: [*\\\u003cFragment\\\u003e*](#fragment)\n\n### Fragment\n\nA movie fragment class\n\n```javascript\nconst Fragment = require('node-video-lib').Fragment\n```\n\nProperties:\n\n* **timestamp** *\\\u003cInteger\\\u003e* - Fragment timestamp\n* **duration** *\\\u003cInteger\\\u003e* - Fragment duration\n* **timescale** *\\\u003cInteger\\\u003e* - Fragment timescale\n* **videoExtraData** [*\\\u003cBuffer\\\u003e*](https://nodejs.org/api/buffer.html) - Video codec information\n* **audioExtraData** [*\\\u003cBuffer\\\u003e*](https://nodejs.org/api/buffer.html) - Audio codec information\n* **samples** *\\\u003cArray\\\u003e* - List of fragment samples\n\nMethods:\n\n* **relativeTimestamp()** - Fragment timestamp in seconds\n    * Return: *\\\u003cNumber\\\u003e*\n* **relativeDuration()** - Fragment duration in seconds\n    * Return: *\\\u003cNumber\\\u003e*\n* **hasVideo()** - Fragment has a video track\n    * Return: *\\\u003cBoolean\\\u003e*\n* **hasAudio()** - Fragment has an audio track\n    * Return: *\\\u003cBoolean\\\u003e*\n\n### Track\n\nA general track class\n\n```javascript\nconst Track = require('node-video-lib').Track\n```\n\nProperties:\n\n* **duration** *\\\u003cInteger\\\u003e* - Track duration\n* **timescale** *\\\u003cInteger\\\u003e* - Track timescale\n* **codec** *\\\u003cString\\\u003e* - Codec string\n* **extraData** [*\\\u003cBuffer\\\u003e*](https://nodejs.org/api/buffer.html) - Codec information\n* **samples** *\\\u003cArray\\\u003e* - List of track samples\n\nMethods:\n\n* **relativeDuration()** - Track duration in seconds\n    * Return: *\\\u003cNumber\\\u003e*\n* **ensureDuration()** - Calculate and set duration based on the sample durations (only if duration is zero)\n    * Return: *\\\u003cNumber\\\u003e*\n* **size()** - Samples size\n    * Return: *\\\u003cInteger\\\u003e*\n\n### AudioTrack\n\nAn audio track class. Extends the general track class\n\n```javascript\nconst AudioTrack = require('node-video-lib').AudioTrack\n```\n\nProperties:\n\n* **channels** *\\\u003cInteger\\\u003e* - Number of audio channels\n* **sampleRate** *\\\u003cInteger\\\u003e* - Audio sample rate\n* **sampleSize** *\\\u003cInteger\\\u003e* - Audio sample size\n\n### VideoTrack\n\nA video track class. Extends the general track class\n\n```javascript\nconst VideoTrack = require('node-video-lib').VideoTrack\n```\n\nProperties:\n\n* **width** *\\\u003cInteger\\\u003e* - Video width\n* **height** *\\\u003cInteger\\\u003e* - Video height\n\nMethods:\n\n* **resolution()** - Video resolution\n    * Return: *\\\u003cString\\\u003e*\n\n### Sample\n\nA general video sample class\n\n```javascript\nconst Sample = require('node-video-lib').Sample\n```\n\nProperties:\n\n* **timestamp** *\\\u003cInteger\\\u003e* - Sample timestamp\n* **timescale** *\\\u003cInteger\\\u003e* - Sample timescale\n* **size** *\\\u003cInteger\\\u003e* - Sample size\n* **offset** *\\\u003cInteger\\\u003e* - Sample offset in the file\n\nMethods:\n\n* **relativeTimestamp()** - Sample timestamp in seconds\n    * Return: *\\\u003cNumber\\\u003e*\n\n### AudioSample\n\nAn audio sample class. Extends the general sample class\n\n```javascript\nconst AudioSample = require('node-video-lib').AudioSample\n```\n\n### VideoSample\n\nA video sample class. Extends the general sample class\n\n```javascript\nconst VideoSample = require('node-video-lib').VideoSample\n```\n\nProperties:\n\n* **compositionOffset** *\\\u003cInteger\\\u003e* - Composition offset\n* **keyframe** *\\\u003cBoolean\\\u003e* - Keyframe flag\n","funding_links":["https://www.paypal.me/pipll","https://www.buymeacoffee.com/NIUeF95"],"categories":["Packages","JavaScript","包","目录","HarmonyOS","Adaptive Streaming \u0026 Manifest Tools"],"sub_categories":["Miscellaneous","其他","Windows Manager","杂项","HLS Tools"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgkozlenko%2Fnode-video-lib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgkozlenko%2Fnode-video-lib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgkozlenko%2Fnode-video-lib/lists"}