-
Notifications
You must be signed in to change notification settings - Fork 6
/
hlsSession.js
75 lines (59 loc) · 1.84 KB
/
hlsSession.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
const Logger = require('./logger');
const EventsEmitter = require('events');
const mkdirp = require('mkdirp');
const FFMPEG = require('fluent-ffmpeg');
class HLSSession extends EventsEmitter {
constructor (name, input, options) {
super();
this.name = name;
this.input = input;
this.mediaPath = options.mediaPath;
this.transOptions = options.transOptions;
this.hlsOptions = options.hlsOptions;
this.hlsFileName = options.hlsFileName;
this.ffmpegLoggingLevel = options.ffmpegLoggingLevel;
this.ffmpeg = FFMPEG();
this.viewers = new Set();
this.lastRequestAt = null;
}
run () {
const outputPath = `${this.mediaPath}/${this.name}`;
const hlsFileName = this.hlsFileName || 'index.m3u8';
Logger.debug(`[INFO] Transmuxing HLS: ${this.input} => ${outputPath}`);
Logger.debug(`[INFO] HLS file name: ${hlsFileName}`);
mkdirp.sync(outputPath);
this.ffmpeg
.addInput(this.input)
.addOption(this.ffmpegLoggingLevel)
.addOption(this.transOptions)
.addOption('-f hls')
.addOption(this.hlsOptions)
.output(`${outputPath}/${hlsFileName}`);
this.ffmpeg.on('start', (command) =>
Logger.debug('[INFO] FFMPEG transcoding started with command: ' + command)
);
this.ffmpeg.on('stderr', (stdErrline) =>
Logger.error(stdErrline)
);
this.ffmpeg.on('error', (err, stdout, stderr) =>
Logger.error(err.message)
);
this.ffmpeg.on('end', (stdout, stderr) => {
this.emit('end', this.name);
Logger.debug('[INFO] Transcoding ended');
});
this.ffmpeg.run();
}
stop () {
this.ffmpeg.kill('SIGKILL');
this.viewers = new Set();
this.lastRequestAt = null;
}
addViewer (viewer) {
this.viewers.add(viewer);
}
updateLastRequestAt () {
this.lastRequestAt = Date.now();
}
}
module.exports = HLSSession;