499 lines
21 KiB
TypeScript
499 lines
21 KiB
TypeScript
/// <reference types="node" />
|
|
|
|
import * as events from "events";
|
|
import * as stream from "stream";
|
|
|
|
declare namespace Ffmpeg {
|
|
interface FfmpegCommandLogger {
|
|
error(...data: any[]): void;
|
|
warn(...data: any[]): void;
|
|
info(...data: any[]): void;
|
|
debug(...data: any[]): void;
|
|
}
|
|
|
|
interface FfmpegCommandOptions {
|
|
logger?: FfmpegCommandLogger | undefined;
|
|
niceness?: number | undefined;
|
|
priority?: number | undefined;
|
|
presets?: string | undefined;
|
|
preset?: string | undefined;
|
|
stdoutLines?: number | undefined;
|
|
timeout?: number | undefined;
|
|
source?: string | stream.Readable | undefined;
|
|
cwd?: string | undefined;
|
|
}
|
|
|
|
interface FilterSpecification {
|
|
filter: string;
|
|
inputs?: string | string[] | undefined;
|
|
outputs?: string | string[] | undefined;
|
|
options?: any | string | any[] | undefined;
|
|
}
|
|
|
|
type PresetFunction = (command: FfmpegCommand) => void;
|
|
|
|
interface Filter {
|
|
description: string;
|
|
input: string;
|
|
multipleInputs: boolean;
|
|
output: string;
|
|
multipleOutputs: boolean;
|
|
}
|
|
interface Filters {
|
|
[key: string]: Filter;
|
|
}
|
|
type FiltersCallback = (err: Error, filters: Filters) => void;
|
|
|
|
interface Codec {
|
|
type: string;
|
|
description: string;
|
|
canDecode: boolean;
|
|
canEncode: boolean;
|
|
drawHorizBand?: boolean | undefined;
|
|
directRendering?: boolean | undefined;
|
|
weirdFrameTruncation?: boolean | undefined;
|
|
intraFrameOnly?: boolean | undefined;
|
|
isLossy?: boolean | undefined;
|
|
isLossless?: boolean | undefined;
|
|
}
|
|
interface Codecs {
|
|
[key: string]: Codec;
|
|
}
|
|
type CodecsCallback = (err: Error, codecs: Codecs) => void;
|
|
|
|
interface Encoder {
|
|
type: string;
|
|
description: string;
|
|
frameMT: boolean;
|
|
sliceMT: boolean;
|
|
experimental: boolean;
|
|
drawHorizBand: boolean;
|
|
directRendering: boolean;
|
|
}
|
|
interface Encoders {
|
|
[key: string]: Encoder;
|
|
}
|
|
type EncodersCallback = (err: Error, encoders: Encoders) => void;
|
|
|
|
interface Format {
|
|
description: string;
|
|
canDemux: boolean;
|
|
canMux: boolean;
|
|
}
|
|
interface Formats {
|
|
[key: string]: Format;
|
|
}
|
|
type FormatsCallback = (err: Error, formats: Formats) => void;
|
|
|
|
interface FfprobeData {
|
|
streams: FfprobeStream[];
|
|
format: FfprobeFormat;
|
|
chapters: any[];
|
|
}
|
|
|
|
interface FfprobeStream {
|
|
[key: string]: any;
|
|
index: number;
|
|
codec_name?: string | undefined;
|
|
codec_long_name?: string | undefined;
|
|
profile?: number | undefined;
|
|
codec_type?: string | undefined;
|
|
codec_time_base?: string | undefined;
|
|
codec_tag_string?: string | undefined;
|
|
codec_tag?: string | undefined;
|
|
width?: number | undefined;
|
|
height?: number | undefined;
|
|
coded_width?: number | undefined;
|
|
coded_height?: number | undefined;
|
|
has_b_frames?: number | undefined;
|
|
sample_aspect_ratio?: string | undefined;
|
|
display_aspect_ratio?: string | undefined;
|
|
pix_fmt?: string | undefined;
|
|
level?: string | undefined;
|
|
color_range?: string | undefined;
|
|
color_space?: string | undefined;
|
|
color_transfer?: string | undefined;
|
|
color_primaries?: string | undefined;
|
|
chroma_location?: string | undefined;
|
|
field_order?: string | undefined;
|
|
timecode?: string | undefined;
|
|
refs?: number | undefined;
|
|
id?: string | undefined;
|
|
r_frame_rate?: string | undefined;
|
|
avg_frame_rate?: string | undefined;
|
|
time_base?: string | undefined;
|
|
start_pts?: number | undefined;
|
|
start_time?: number | undefined;
|
|
duration_ts?: string | undefined;
|
|
duration?: string | undefined;
|
|
bit_rate?: string | undefined;
|
|
max_bit_rate?: string | undefined;
|
|
bits_per_raw_sample?: string | undefined;
|
|
nb_frames?: string | undefined;
|
|
nb_read_frames?: string | undefined;
|
|
nb_read_packets?: string | undefined;
|
|
sample_fmt?: string | undefined;
|
|
sample_rate?: number | undefined;
|
|
channels?: number | undefined;
|
|
channel_layout?: string | undefined;
|
|
bits_per_sample?: number | undefined;
|
|
disposition?: FfprobeStreamDisposition | undefined;
|
|
rotation?: string | number | undefined;
|
|
}
|
|
|
|
interface FfprobeStreamDisposition {
|
|
[key: string]: any;
|
|
default?: number | undefined;
|
|
dub?: number | undefined;
|
|
original?: number | undefined;
|
|
comment?: number | undefined;
|
|
lyrics?: number | undefined;
|
|
karaoke?: number | undefined;
|
|
forced?: number | undefined;
|
|
hearing_impaired?: number | undefined;
|
|
visual_impaired?: number | undefined;
|
|
clean_effects?: number | undefined;
|
|
attached_pic?: number | undefined;
|
|
timed_thumbnails?: number | undefined;
|
|
}
|
|
|
|
interface FfprobeFormat {
|
|
[key: string]: any;
|
|
filename?: string | undefined;
|
|
nb_streams?: number | undefined;
|
|
nb_programs?: number | undefined;
|
|
format_name?: string | undefined;
|
|
format_long_name?: string | undefined;
|
|
start_time?: number | undefined;
|
|
duration?: number | undefined;
|
|
size?: number | undefined;
|
|
bit_rate?: number | undefined;
|
|
probe_score?: number | undefined;
|
|
tags?: Record<string, string | number> | undefined;
|
|
}
|
|
|
|
interface ScreenshotsConfig {
|
|
count?: number | undefined;
|
|
folder?: string | undefined;
|
|
filename?: string | undefined;
|
|
timemarks?: number[] | string[] | undefined;
|
|
timestamps?: number[] | string[] | undefined;
|
|
fastSeek?: boolean | undefined;
|
|
size?: string | undefined;
|
|
}
|
|
|
|
interface AudioVideoFilter {
|
|
filter: string;
|
|
options: string | string[] | {};
|
|
}
|
|
|
|
// static methods
|
|
function setFfmpegPath(path: string): FfmpegCommand;
|
|
function setFfprobePath(path: string): FfmpegCommand;
|
|
function setFlvtoolPath(path: string): FfmpegCommand;
|
|
function availableFilters(callback: FiltersCallback): void;
|
|
function getAvailableFilters(callback: FiltersCallback): void;
|
|
function availableCodecs(callback: CodecsCallback): void;
|
|
function getAvailableCodecs(callback: CodecsCallback): void;
|
|
function availableEncoders(callback: EncodersCallback): void;
|
|
function getAvailableEncoders(callback: EncodersCallback): void;
|
|
function availableFormats(callback: FormatsCallback): void;
|
|
function getAvailableFormats(callback: FormatsCallback): void;
|
|
|
|
class FfmpegCommand extends events.EventEmitter {
|
|
constructor(options?: FfmpegCommandOptions);
|
|
constructor(input?: string | stream.Readable, options?: FfmpegCommandOptions);
|
|
|
|
// options/inputs
|
|
mergeAdd(source: string | stream.Readable): FfmpegCommand;
|
|
addInput(source: string | stream.Readable): FfmpegCommand;
|
|
input(source: string | stream.Readable): FfmpegCommand;
|
|
withInputFormat(format: string): FfmpegCommand;
|
|
inputFormat(format: string): FfmpegCommand;
|
|
fromFormat(format: string): FfmpegCommand;
|
|
withInputFps(fps: number): FfmpegCommand;
|
|
withInputFPS(fps: number): FfmpegCommand;
|
|
withFpsInput(fps: number): FfmpegCommand;
|
|
withFPSInput(fps: number): FfmpegCommand;
|
|
inputFPS(fps: number): FfmpegCommand;
|
|
inputFps(fps: number): FfmpegCommand;
|
|
fpsInput(fps: number): FfmpegCommand;
|
|
FPSInput(fps: number): FfmpegCommand;
|
|
nativeFramerate(): FfmpegCommand;
|
|
withNativeFramerate(): FfmpegCommand;
|
|
native(): FfmpegCommand;
|
|
setStartTime(seek: string | number): FfmpegCommand;
|
|
seekInput(seek: string | number): FfmpegCommand;
|
|
loop(duration?: string | number): FfmpegCommand;
|
|
|
|
// options/audio
|
|
withNoAudio(): FfmpegCommand;
|
|
noAudio(): FfmpegCommand;
|
|
withAudioCodec(codec: string): FfmpegCommand;
|
|
audioCodec(codec: string): FfmpegCommand;
|
|
withAudioBitrate(bitrate: string | number): FfmpegCommand;
|
|
audioBitrate(bitrate: string | number): FfmpegCommand;
|
|
withAudioChannels(channels: number): FfmpegCommand;
|
|
audioChannels(channels: number): FfmpegCommand;
|
|
withAudioFrequency(freq: number): FfmpegCommand;
|
|
audioFrequency(freq: number): FfmpegCommand;
|
|
withAudioQuality(quality: number): FfmpegCommand;
|
|
audioQuality(quality: number): FfmpegCommand;
|
|
withAudioFilter(filters: string | string[] | AudioVideoFilter[]): FfmpegCommand;
|
|
withAudioFilters(filters: string | string[] | AudioVideoFilter[]): FfmpegCommand;
|
|
audioFilter(filters: string | string[] | AudioVideoFilter[]): FfmpegCommand;
|
|
audioFilters(filters: string | string[] | AudioVideoFilter[]): FfmpegCommand;
|
|
|
|
// options/video;
|
|
withNoVideo(): FfmpegCommand;
|
|
noVideo(): FfmpegCommand;
|
|
withVideoCodec(codec: string): FfmpegCommand;
|
|
videoCodec(codec: string): FfmpegCommand;
|
|
withVideoBitrate(bitrate: string | number, constant?: boolean): FfmpegCommand;
|
|
videoBitrate(bitrate: string | number, constant?: boolean): FfmpegCommand;
|
|
withVideoFilter(filters: string | string[] | AudioVideoFilter[]): FfmpegCommand;
|
|
withVideoFilters(filters: string | string[] | AudioVideoFilter[]): FfmpegCommand;
|
|
videoFilter(filters: string | string[] | AudioVideoFilter[]): FfmpegCommand;
|
|
videoFilters(filters: string | string[] | AudioVideoFilter[]): FfmpegCommand;
|
|
withOutputFps(fps: number): FfmpegCommand;
|
|
withOutputFPS(fps: number): FfmpegCommand;
|
|
withFpsOutput(fps: number): FfmpegCommand;
|
|
withFPSOutput(fps: number): FfmpegCommand;
|
|
withFps(fps: number): FfmpegCommand;
|
|
withFPS(fps: number): FfmpegCommand;
|
|
outputFPS(fps: number): FfmpegCommand;
|
|
outputFps(fps: number): FfmpegCommand;
|
|
fpsOutput(fps: number): FfmpegCommand;
|
|
FPSOutput(fps: number): FfmpegCommand;
|
|
fps(fps: number): FfmpegCommand;
|
|
FPS(fps: number): FfmpegCommand;
|
|
takeFrames(frames: number): FfmpegCommand;
|
|
withFrames(frames: number): FfmpegCommand;
|
|
frames(frames: number): FfmpegCommand;
|
|
|
|
// options/videosize
|
|
keepPixelAspect(): FfmpegCommand;
|
|
keepDisplayAspect(): FfmpegCommand;
|
|
keepDisplayAspectRatio(): FfmpegCommand;
|
|
keepDAR(): FfmpegCommand;
|
|
withSize(size: string): FfmpegCommand;
|
|
setSize(size: string): FfmpegCommand;
|
|
size(size: string): FfmpegCommand;
|
|
withAspect(aspect: string | number): FfmpegCommand;
|
|
withAspectRatio(aspect: string | number): FfmpegCommand;
|
|
setAspect(aspect: string | number): FfmpegCommand;
|
|
setAspectRatio(aspect: string | number): FfmpegCommand;
|
|
aspect(aspect: string | number): FfmpegCommand;
|
|
aspectRatio(aspect: string | number): FfmpegCommand;
|
|
applyAutopadding(pad?: boolean, color?: string): FfmpegCommand;
|
|
applyAutoPadding(pad?: boolean, color?: string): FfmpegCommand;
|
|
applyAutopad(pad?: boolean, color?: string): FfmpegCommand;
|
|
applyAutoPad(pad?: boolean, color?: string): FfmpegCommand;
|
|
withAutopadding(pad?: boolean, color?: string): FfmpegCommand;
|
|
withAutoPadding(pad?: boolean, color?: string): FfmpegCommand;
|
|
withAutopad(pad?: boolean, color?: string): FfmpegCommand;
|
|
withAutoPad(pad?: boolean, color?: string): FfmpegCommand;
|
|
autoPad(pad?: boolean, color?: string): FfmpegCommand;
|
|
autopad(pad?: boolean, color?: string): FfmpegCommand;
|
|
|
|
// options/output
|
|
addOutput(target: string | stream.Writable, pipeopts?: { end?: boolean | undefined }): FfmpegCommand;
|
|
output(target: string | stream.Writable, pipeopts?: { end?: boolean | undefined }): FfmpegCommand;
|
|
seekOutput(seek: string | number): FfmpegCommand;
|
|
seek(seek: string | number): FfmpegCommand;
|
|
withDuration(duration: string | number): FfmpegCommand;
|
|
setDuration(duration: string | number): FfmpegCommand;
|
|
duration(duration: string | number): FfmpegCommand;
|
|
toFormat(format: string): FfmpegCommand;
|
|
withOutputFormat(format: string): FfmpegCommand;
|
|
outputFormat(format: string): FfmpegCommand;
|
|
format(format: string): FfmpegCommand;
|
|
map(spec: string): FfmpegCommand;
|
|
updateFlvMetadata(): FfmpegCommand;
|
|
flvmeta(): FfmpegCommand;
|
|
|
|
// options/custom
|
|
addInputOption(options: string[]): FfmpegCommand;
|
|
addInputOption(...options: string[]): FfmpegCommand;
|
|
addInputOptions(options: string[]): FfmpegCommand;
|
|
addInputOptions(...options: string[]): FfmpegCommand;
|
|
withInputOption(options: string[]): FfmpegCommand;
|
|
withInputOption(...options: string[]): FfmpegCommand;
|
|
withInputOptions(options: string[]): FfmpegCommand;
|
|
withInputOptions(...options: string[]): FfmpegCommand;
|
|
inputOption(options: string[]): FfmpegCommand;
|
|
inputOption(...options: string[]): FfmpegCommand;
|
|
inputOptions(options: string[]): FfmpegCommand;
|
|
inputOptions(...options: string[]): FfmpegCommand;
|
|
addOutputOption(options: string[]): FfmpegCommand;
|
|
addOutputOption(...options: string[]): FfmpegCommand;
|
|
addOutputOptions(options: string[]): FfmpegCommand;
|
|
addOutputOptions(...options: string[]): FfmpegCommand;
|
|
addOption(options: string[]): FfmpegCommand;
|
|
addOption(...options: string[]): FfmpegCommand;
|
|
addOptions(options: string[]): FfmpegCommand;
|
|
addOptions(...options: string[]): FfmpegCommand;
|
|
withOutputOption(options: string[]): FfmpegCommand;
|
|
withOutputOption(...options: string[]): FfmpegCommand;
|
|
withOutputOptions(options: string[]): FfmpegCommand;
|
|
withOutputOptions(...options: string[]): FfmpegCommand;
|
|
withOption(options: string[]): FfmpegCommand;
|
|
withOption(...options: string[]): FfmpegCommand;
|
|
withOptions(options: string[]): FfmpegCommand;
|
|
withOptions(...options: string[]): FfmpegCommand;
|
|
outputOption(options: string[]): FfmpegCommand;
|
|
outputOption(...options: string[]): FfmpegCommand;
|
|
outputOptions(options: string[]): FfmpegCommand;
|
|
outputOptions(...options: string[]): FfmpegCommand;
|
|
filterGraph(
|
|
spec: string | FilterSpecification | Array<string | FilterSpecification>,
|
|
map?: string[] | string,
|
|
): FfmpegCommand;
|
|
complexFilter(
|
|
spec: string | FilterSpecification | Array<string | FilterSpecification>,
|
|
map?: string[] | string,
|
|
): FfmpegCommand;
|
|
|
|
// options/misc
|
|
usingPreset(preset: string | PresetFunction): FfmpegCommand;
|
|
preset(preset: string | PresetFunction): FfmpegCommand;
|
|
|
|
// processor
|
|
renice(niceness: number): FfmpegCommand;
|
|
kill(signal: string): FfmpegCommand;
|
|
_getArguments(): string[];
|
|
|
|
// capabilities
|
|
setFfmpegPath(path: string): FfmpegCommand;
|
|
setFfprobePath(path: string): FfmpegCommand;
|
|
setFlvtoolPath(path: string): FfmpegCommand;
|
|
availableFilters(callback: FiltersCallback): void;
|
|
getAvailableFilters(callback: FiltersCallback): void;
|
|
availableCodecs(callback: CodecsCallback): void;
|
|
getAvailableCodecs(callback: CodecsCallback): void;
|
|
availableEncoders(callback: EncodersCallback): void;
|
|
getAvailableEncoders(callback: EncodersCallback): void;
|
|
availableFormats(callback: FormatsCallback): void;
|
|
getAvailableFormats(callback: FormatsCallback): void;
|
|
|
|
// ffprobe
|
|
ffprobe(callback: (err: any, data: FfprobeData) => void): void;
|
|
ffprobe(index: number, callback: (err: any, data: FfprobeData) => void): void;
|
|
ffprobe(options: string[], callback: (err: any, data: FfprobeData) => void): void; // tslint:disable-line unified-signatures
|
|
ffprobe(index: number, options: string[], callback: (err: any, data: FfprobeData) => void): void;
|
|
|
|
// event listeners
|
|
/**
|
|
* Emitted just after ffmpeg has been spawned.
|
|
*
|
|
* @event FfmpegCommand#start
|
|
* @param {String} command ffmpeg command line
|
|
*/
|
|
on(event: "start", listener: (command: string) => void): this;
|
|
|
|
/**
|
|
* Emitted when ffmpeg reports progress information
|
|
*
|
|
* @event FfmpegCommand#progress
|
|
* @param {Object} progress progress object
|
|
* @param {Number} progress.frames number of frames transcoded
|
|
* @param {Number} progress.currentFps current processing speed in frames per second
|
|
* @param {Number} progress.currentKbps current output generation speed in kilobytes per second
|
|
* @param {Number} progress.targetSize current output file size
|
|
* @param {String} progress.timemark current video timemark
|
|
* @param {Number} [progress.percent] processing progress (may not be available depending on input)
|
|
*/
|
|
on(
|
|
event: "progress",
|
|
listener: (progress: {
|
|
frames: number;
|
|
currentFps: number;
|
|
currentKbps: number;
|
|
targetSize: number;
|
|
timemark: string;
|
|
percent?: number | undefined;
|
|
}) => void,
|
|
): this;
|
|
|
|
/**
|
|
* Emitted when ffmpeg outputs to stderr
|
|
*
|
|
* @event FfmpegCommand#stderr
|
|
* @param {String} line stderr output line
|
|
*/
|
|
on(event: "stderr", listener: (line: string) => void): this;
|
|
|
|
/**
|
|
* Emitted when ffmpeg reports input codec data
|
|
*
|
|
* @event FfmpegCommand#codecData
|
|
* @param {Object} codecData codec data object
|
|
* @param {String} codecData.format input format name
|
|
* @param {String} codecData.audio input audio codec name
|
|
* @param {String} codecData.audio_details input audio codec parameters
|
|
* @param {String} codecData.video input video codec name
|
|
* @param {String} codecData.video_details input video codec parameters
|
|
*/
|
|
on(
|
|
event: "codecData",
|
|
listener: (codecData: {
|
|
format: string;
|
|
audio: string;
|
|
audio_details: string;
|
|
video: string;
|
|
video_details: string;
|
|
}) => void,
|
|
): this;
|
|
|
|
/**
|
|
* Emitted when an error happens when preparing or running a command
|
|
*
|
|
* @event FfmpegCommand#error
|
|
* @param {Error} error error object, with optional properties 'inputStreamError' / 'outputStreamError' for errors on their respective streams
|
|
* @param {String|null} stdout ffmpeg stdout, unless outputting to a stream
|
|
* @param {String|null} stderr ffmpeg stderr
|
|
*/
|
|
on(event: "error", listener: (error: Error, stdout: string | null, stderr: string | null) => void): this;
|
|
|
|
/**
|
|
* Emitted when a command finishes processing
|
|
*
|
|
* @event FfmpegCommand#end
|
|
* @param {Array|String|null} [filenames|stdout] generated filenames when taking screenshots, ffmpeg stdout when not outputting to a stream, null otherwise
|
|
* @param {String|null} stderr ffmpeg stderr
|
|
*/
|
|
on(event: "end", listener: (filenames: string[] | string | null, stderr: string | null) => void): this;
|
|
|
|
// recipes
|
|
saveToFile(output: string): FfmpegCommand;
|
|
save(output: string): FfmpegCommand;
|
|
writeToStream(stream: stream.Writable, options?: { end?: boolean | undefined }): stream.Writable;
|
|
pipe(stream?: stream.Writable, options?: { end?: boolean | undefined }): stream.Writable | stream.PassThrough;
|
|
stream(stream: stream.Writable, options?: { end?: boolean | undefined }): stream.Writable;
|
|
takeScreenshots(config: number | ScreenshotsConfig, folder?: string): FfmpegCommand;
|
|
thumbnail(config: number | ScreenshotsConfig, folder?: string): FfmpegCommand;
|
|
thumbnails(config: number | ScreenshotsConfig, folder?: string): FfmpegCommand;
|
|
screenshot(config: number | ScreenshotsConfig, folder?: string): FfmpegCommand;
|
|
screenshots(config: number | ScreenshotsConfig, folder?: string): FfmpegCommand;
|
|
mergeToFile(target: string | stream.Writable, tmpFolder: string): FfmpegCommand;
|
|
concatenate(target: string | stream.Writable, options?: { end?: boolean | undefined }): FfmpegCommand;
|
|
concat(target: string | stream.Writable, options?: { end?: boolean | undefined }): FfmpegCommand;
|
|
clone(): FfmpegCommand;
|
|
run(): void;
|
|
}
|
|
|
|
function ffprobe(file: string, callback: (err: any, data: FfprobeData) => void): void;
|
|
function ffprobe(file: string, index: number, callback: (err: any, data: FfprobeData) => void): void;
|
|
function ffprobe(file: string, options: string[], callback: (err: any, data: FfprobeData) => void): void; // tslint:disable-line unified-signatures
|
|
function ffprobe(
|
|
file: string,
|
|
index: number,
|
|
options: string[],
|
|
callback: (err: any, data: FfprobeData) => void,
|
|
): void;
|
|
}
|
|
declare function Ffmpeg(options?: Ffmpeg.FfmpegCommandOptions): Ffmpeg.FfmpegCommand;
|
|
declare function Ffmpeg(input?: string | stream.Readable, options?: Ffmpeg.FfmpegCommandOptions): Ffmpeg.FfmpegCommand;
|
|
|
|
export = Ffmpeg;
|