더 많거나 적은 발사와 라이브 FFMPEG 세션을 닫는 문제에 대한 최종 솔루션을 사용하여 Node.js를 수 있습니다 :
이 코드가 "module.js"파일에 캡슐화되어
var spawn = require('child_process').spawn
, fs = require('fs');
function ffmpeg(cmd, opts, callback) {
var p;
//console.log(callback());
if(p == undefined) {
var p = spawn(cmd, opts);
p.stderr.on('data', function(data) {
/*p.stdin.setEncoding('utf8');
p.stdin.write('q');
process.exit()
*/
fs.readFile(__dirname + '/server-state.json', function(error, data) {
if(error) {
console.log(error);
} else {
content = JSON.parse(data);
console.log(content['State']);
if(content['State'] == 'false') {
p.stdin.setEncoding('utf8');
p.stdin.write('q');
process.exit()
}
}
});
});
return p;
}
}
ffmpeg_var = ffmpeg('C:\\Program Files (x86)\\ffmpeg\\bin\\ffmpeg.exe', ['-y', '-threads', '-0', '-re', '-rtbufsize', '204800000', '-probesize', '4096', '-vsync', '2', '-async', '30', '-f', 'dshow', '-s', '320x240', '-i', 'video=Integrated Webcam:audio=Microphone Array (IDT High Defi', '-c:a', 'libvo_aacenc', '-ab', '48000', '-ar', '22050', '-ac', '2', '-c:v', 'libx264', '-s', '400x300', '-g', '96', '-x264opts', 'bitrate=1200', '-preset', 'ultrafast', '-profile:v', 'baseline', '-pix_fmt', 'yuv420p', '-aspect', '4:3', '-f', 'mp4', __dirname + '/IntegrityTest.mp4'], function() {
});
즉 루트 application.js 파일의 child_process.fork()를 통해 인스턴스화됩니다. '상태'가 저장된 텍스트 파일을 읽습니다. 이 상태는 루트 어플리케이션의 쓰기/읽기 메소드를 통해 토글됩니다. on ('data') 이벤트에서 파일을 읽은 다음 상태가 false로 변경된 것을 감지하면 stdin에 'q'명령을 작성하여 FFMPEG를 종료합니다.
데이터베이스를 사용하여 대규모로 구현하는 경우를 제외하고는 코드를 작성하는 좀 더 우아한 방법에 대한 의견을 제시하는 것 이상입니다.
들어오는 스트림을 읽고이를 ffmpeg child_process에 직접 전달하는 대신 Adobe Media Server로 전달하는 일종의 중개 기능이 있어야한다고 말하고 있습니까? 그렇다면 중간 스트림을 종료 할 수 있다고 생각합니다. 그러나 24/7의 소스 프로세스를 그대로 두지 않습니까? – RickZ
사실 저는 귀하의 정확한 요구 사항을 알지 못해 정답을 진술하기가 조금 어렵습니다. 왜'.kill'을 사용하여 chlid 프로세스를 끝내지 않습니까? – topek
방금 시도했습니다. 'SIGHUP'이 Windows에서 지원되지 않는 것 같기 때문에 'SIGTERM'을 사용하여 종료되었습니다. 확실히 스트림을 끝내는 데 효과적이었습니다. 최종 목표는 궁극적으로 mp4 파일뿐만 아니라 다양한 비트 속도로 몇 가지 다른 스트림을 제공하기위한 것이므로 mp4가 잘린 지 여부를 확인해야합니다. 도움 주셔서 감사합니다. – RickZ