summaryrefslogtreecommitdiff
path: root/ffmpegServer.js
blob: c4acb1bb4df7aee53a4188f8b266de01cd51b09d (plain)
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
const child_process = require('child_process');
const WebSocketServer = require('ws').Server;
const http = require('http');
const fs = require('fs');

var config = JSON.parse(fs.readFileSync("config.json", 'utf8'));

const server = http.createServer().listen(config.ffmpegServerPort, () => {
  console.log('Listening...');
});

const wss = new WebSocketServer({
	server: server
});


const rtmpUrl = config.rtmpUrl;

wss.on('connection', function connection(ws, req) {
	console.log('connection');

	let auth;

	if ( !(auth = req.url.match(/^\/auth\/(.*)$/)) ) {
		ws.terminate();
		return;
	}

	if(auth[1] !== config.auth){
		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',

	    //No browser currently supports encoding AAC, so we must transcode the audio to AAC here on the server.
	    '-acodec', 'aac',
	    
	    '-max_muxing_queue_size', '99999',
	    '-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();
	});

});