https://github.com/advplyr/hls-playlist-generator
Gets accurate HLS segment lengths for a video file by using key frames, then optionally generates an HLS .m3u8 playlist.
https://github.com/advplyr/hls-playlist-generator
Last synced: 5 months ago
JSON representation
Gets accurate HLS segment lengths for a video file by using key frames, then optionally generates an HLS .m3u8 playlist.
- Host: GitHub
- URL: https://github.com/advplyr/hls-playlist-generator
- Owner: advplyr
- Created: 2021-05-23T15:33:42.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2021-06-30T14:19:05.000Z (almost 4 years ago)
- Last Synced: 2025-01-11T04:55:40.183Z (5 months ago)
- Language: JavaScript
- Size: 93.8 KB
- Stars: 4
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# HLS Playlist Generator
Calculates HLS segment lengths using key frames and optionally generates m3u8 playlist.
### Background
When direct streaming a video via HLS, the segment lengths are determined by the keyframes.In order to generate an accurate playlist, hls-playlist-generator first extracts keyframes using `ffprobe`, `mp4box`, or `matroska` depending on the container, then selects correct segments lengths that `ffmpeg` would use based on target segment length.
.mp4 files will use `mp4box` to extract keyframes (takes < 1s)
.mkv files will use `matroska` to extract keyframes (takes < 1s)
all other containers will use `ffprobe` (takes 1 - 30s)(Thanks to [Ivshti/retrieve-keyframes](https://github.com/Ivshti/retrieve-keyframes) for the fast .mp4 and .mkv keyframe extraction)
## Requirements
[ffprobe](https://ffmpeg.org/ffprobe.html)
## Installation
```bash
npm install hls-playlist-generator
```
or for CLI
```bash
npm install -g hls-playlist-generator
```
or use CLI without installing via NPX
```bash
npx hls-playlist-generator 'path-to/media-file.mkv'
```## Usage
```es6
var hpg = require('hls-playlist-generator')// Write the .m3u8 playlist to the output file - Returns number of segments
hpg('./path-to/media-file.mkv', './path-to/playlist.m3u8')// Return an array of segment lengths with target length 6
hpg('./path-to/media-file.mkv', null, { segmentLength: 6 })// or target length defaults to 3
hpg('./path-to/media-file.mkv')// If generating multiple playlists for multiple qualities, keyframes only need to be fetched once, so you should use this method:
var segments = await hpg.segments('./path-to/media-file.mkv', { segmentLength: 3 })
// Last parameter specifies name of segments, i.e. "720p" will create 720p1.ts, 720p2.ts, 720p3.ts, ...
var v480p = hpg.generate(segments, './streams/480p.m3u8', '480p')
var v720p = hpg.generate(segments, './streams/720p.m3u8', '720p')
var v1080p = hpg.generate(segments, './streams/1080p.m3u8', '1080p')
await Promise.all([v480p, v720p, v1080p])// If you just want keyframes
var keyframes = await hpg.extract('./path-to/media.mkv')
```
## CLI Usage
```bash
# Write the .m3u8 playlist to the output file
hls-playlist-generator "C:/Path with spaces/movie.mkv" "./playlist.m3u8"# Return an array of segment lengths
hls-playlist-generator "C:/Path with spaces/movie.mkv"# or specify segment length
hls-playlist-generator "C:/Path with spaces/movie.mkv" --segment-length 6# Get all available options
hls-playlist-generator -h
```
## License
[MIT](https://choosealicense.com/licenses/mit/)