dizquetv/src/ffmpegText.js
2020-05-15 12:38:37 -04:00

52 lines
1.7 KiB
JavaScript

const spawn = require('child_process').spawn
const events = require('events')
const fs = require('fs')
const path = require('path')
class FFMPEG_TEXT extends events.EventEmitter {
constructor (opts, title, subtitle) {
super()
this.args = [
'-threads', opts.threads,
'-f', 'lavfi',
'-re',
'-stream_loop', '-1',
'-i', `color=c=black:s=${opts.videoResolution}`,
'-f', 'lavfi',
'-i', 'anullsrc',
'-vf', `drawtext=fontfile=${process.env.DATABASE}/font.ttf:fontsize=30:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:text='${title}',drawtext=fontfile=${process.env.DATABASE}/font.ttf:fontsize=20:fontcolor=white:x=(w-text_w)/2:y=(h+text_h+20)/2:text='${subtitle}'`,
'-c:v', opts.videoEncoder,
'-c:a', opts.audioEncoder,
'-f', 'mpegts',
'pipe:1'
]
this.ffmpeg = spawn(opts.ffmpegPath, this.args)
this.ffmpeg.stdout.on('data', (chunk) => {
this.emit('data', chunk)
})
if (opts.logFfmpeg) {
this.ffmpeg.stderr.on('data', (chunk) => {
process.stderr.write(chunk)
})
}
this.ffmpeg.on('close', (code) => {
if (code === null)
this.emit('close', code)
else if (code === 0)
this.emit('close', code)
else if (code === 255)
this.emit('close', code)
else
this.emit('error', { code: code, cmd: `${opts.ffmpegPath} ${this.args.join(' ')}` })
})
}
kill() {
this.ffmpeg.kill()
}
}
module.exports = FFMPEG_TEXT