ffmpeg-progress-wrapper
Version:
A simple wrapper that helps with determinng the progress of the ffmpeg conversion
150 lines (128 loc) • 4.2 kB
Markdown
# FFMPEG Progress Wrapper
_Wraps your ffmpeg raw command line with a nice progress interface_
___
### Installation
`$ npm install ffmpeg-progress-wrapper`
`$ yarn ffmpeg-progress-wrapper`
### Use cases
- Provides a progress status for your video without you having to guess the frame count
- Provides duration and bitrate of the file
___
### Usage
#### Constructor
```typescript
import {FFMpegProgress} from 'ffmpeg-progress-wrapper';
new FFMpegProgress(args, options);
```
- args: `string[]` - List of string arguments
- options?: `object` - optional
- cmd?: `string` - path to ffmpeg (defaults to ffmpeg from PATH)
- cwd?: `string` - working dir (defaults to current working dir)
- env?: `ProcessEnv` - environment vars (defaults to process.env)
- duration?: `number` - output duration in seconds (default is determined from file)
useful when using complex filters and the input time differs from output
- hideFFConfig?: `boolean` - hide ffmpeg config from stderr (default false)
- maxMemory?:` number` - max amount of bytes allowed by the process to use before killing for OOM (default unset)
#### `FFMpegProgress.on('progress')`
- progressData: `object`
- eta: `number | null` - time left to process in seconds
- speed: `number | null` - processed output time / real time (2x - twice realtime, 0.5x - half realtime)
- fps: `number | null`
- time: `number | null` - current output time in seconds
- frame: `number | null` - current output frame
- progress: `number | null` - progress percentage (from 0 to 1)
- drop: `number` - dropped frames
- dup: `number` - duplicated frames
- quality: `number[][]` - stream quality per frame, per stream
- psnr: `{ y: number | null, u: number | null, v: number | null, all: number | null }[][]` - stream psnr per file, per stream, per channel (enabled via `-psnr` ffmpeg arg)
- size: `number | null` - output file size
- bitrate: `number | null` - output file bitrate in bytes
#### `FFMpegProgress.on('raw')` - Fires whenever ffmpeg outputs text - very volatile
- raw: `string`
#### `FFMpegProgress.on('details')` - Fires once per command, at the beginning
- details: `object`
- duration: `number` - video duration in seconds
- bitrate: `number` - video bitrate in bytes
- start: `number` - video\'s first frame time in seconds
___
### Example
```javascript
const {FFMpegProgress} = require('ffmpeg-progress-wrapper');
// or
import {FFMpegProgress} from 'ffmpeg-progress-wrapper';
(async () => {
const process = new FFMpegProgress(['-i', 'test.mov' ,'test output.mp4']);
process.on('raw', console.log);
process.once('details', (details) => console.log(JSON.stringify(details));
process.on('progress', (progress) => console.log(JSON.stringify(progress));
process.once('end', console.log.bind(console, 'Conversion finished and exited with code'));
process.done(console.log);
await process.onDone();
})();
/**
{
duration: 216,
bitrate: 36864,
start: 0,
resolution: { width: 320, height: 240 },
fps: 25
}
{
drop: 0,
dup: 0,
frame: 1366,
time: 52.480078,
speed: 105,
fps: 0,
eta: 1.5573325904761905,
progress: 0.24296332407407406,
quality: [ [ 28 ] ],
psnr: [ [ { y: NaN, u: NaN, v: NaN, all: NaN } ] ],
size: 36,
bitrate: 0
}
{
drop: 0,
dup: 0,
frame: 2700,
time: 105.840078,
speed: 106,
fps: 2696.44,
eta: 1.0392445471698113,
progress: 0.4900003611111111,
quality: [ [ 28 ] ],
psnr: [ [ { y: NaN, u: NaN, v: NaN, all: NaN } ] ],
size: 262180,
bitrate: 20275.2
}
{
drop: 0,
dup: 0,
frame: 4138,
time: 163.360078,
speed: 109,
fps: 2756.01,
eta: 0.4829350642201836,
progress: 0.7562966574074074,
quality: [ [ 28 ] ],
psnr: [ [ { y: NaN, u: NaN, v: NaN, all: NaN } ] ],
size: 524324,
bitrate: 26316.8
}
{
drop: 0,
dup: 0,
frame: 5423,
time: 216.800078,
speed: 110,
fps: 2747.61,
eta: 0,
progress: 1.0037040648148148,
quality: [ [ -1 ] ],
psnr: [ [ { y: Infinity, u: Infinity, v: Infinity, all: Infinity } ] ],
size: 977469,
bitrate: 36966.4
}
Conversion finished and exited with code 0 null
*/
```