-
Notifications
You must be signed in to change notification settings - Fork 134
/
ffmpegServer.js
96 lines (72 loc) · 2.58 KB
/
ffmpegServer.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
const child_process = require('child_process');
const WebSocketServer = require('ws').Server;
const http = require('http');
const fs = require('fs');
const { ffmpegServerPort, rtmpUrl, auth: authConfig } = require('./env');
const server = http.createServer().listen(ffmpegServerPort, () => {
console.log('Listening...');
});
const wss = new WebSocketServer({
server: server
});
wss.on('connection', function connection(ws, req) {
console.log('connection');
let auth;
if ( !(auth = req.url.match(/^\/auth\/(.*)$/)) ) {
ws.terminate();
return;
}
if(auth[1] !== authConfig){
ws.terminate();
return;
}
const ffmpeg = child_process.spawn('ffmpeg', [
// FFmpeg will read input video from STDIN
'-i', '-',
// If we're encoding H.264 in-browser, we can set the video codec to 'copy'
// so that we don't waste any CPU and quality with unnecessary transcoding.
'-vcodec', 'copy',
// use if you need for smooth youtube publishing. Note: will use more CPU
//'-vcodec', 'libx264',
//'-x264-params', 'keyint=120:scenecut=0',
//No browser currently supports encoding AAC, so we must transcode the audio to AAC here on the server.
'-acodec', 'aac',
// remove background noise. You can adjust this values according to your need
'-af', 'highpass=f=200, lowpass=f=3000',
// This option sets the size of this buffer, in packets, for the matching output stream
'-max_muxing_queue_size', '99999',
// better to use veryfast or fast
'-preset', 'veryfast',
//'-vf', 'mpdecimate', '-vsync', 'vfr',
//'-vf', 'mpdecimate,setpts=N/FRAME_RATE/TB',
// FLV is the container format used in conjunction with RTMP
'-f', 'flv',
// The output RTMP URL.
// For debugging, you could set this to a filename like 'test.flv', and play
// the resulting file with VLC.
rtmpUrl
])
// If FFmpeg stops for any reason, close the WebSocket connection.
ffmpeg.on('close', (code, signal) => {
console.log('FFmpeg child process closed, code ' + code + ', signal ' + signal);
//console.log("reconnecting...")
ws.send("ffmpegClosed")
ws.terminate();
});
ffmpeg.stdin.on('error', (e) => {
console.log('FFmpeg STDIN Error', e);
});
ffmpeg.stderr.on('data', (data) => {
console.log('FFmpeg STDERR:', data.toString());
});
// When data comes in from the WebSocket, write it to FFmpeg's STDIN.
ws.on('message', (msg) => {
console.log('DATA', msg);
ffmpeg.stdin.write(msg);
});
// If the client disconnects, stop FFmpeg.
ws.on('close', (e) => {
ffmpeg.kill('SIGINT');
ws.terminate();
});
});