Я пытаюсь записать множество аудио каналов, используя ffmpeg.Узел загружает файл конфигурации с потоковыми URL-адресами (списки воспроизведения HLS M3U8), анализирует его и запускает соответствующее количество экземпляров ffmpeg.Когда я иду, чтобы закрыть их, ничего не происходит, и мне приходится убивать их с помощью диспетчера задач, что приводит к повреждению файлов.Когда я отлаживаю и нажимаю control-c в течение минуты или двух после запуска программы, она работает без проблем.Когда мне нужно записать более 5-10 минут, что у меня возникли проблемы.
Я нашел этот связанный вопрос от 2013 года и адаптировал его для моей ситуации с несколькими потоками.
Процессы записи запускаются с помощью следующего кода (внутри обратного вызова http-запроса):
config.audio_config.forEach((channel,i)=>{
self.liveChannels++;
console.log(` ${channel.number}`);
self.Channels[i] = spawn('ffmpeg', ['-i', `${channel.base_url + channel.stream_ios}`, '-c:v', 'none', '-c:a', 'copy', `Output\\${config.folder}\\${channel.number}.m4a`]);
self.Channels[i].stdin.setEncoding('utf8');
self.Channels[i].chNum = channel.number;
self.Channels[i].on('exit',(code,sig)=>{
console.log(` Channel ${channel.number} recorder closed.`);
self.liveChannels--;
if(self.liveChannels === 0){
process.exit();
}
});
});
console.log('Press Ctl-C to start Shutdown');
Моя функция отключения (запускаемая SIGINT
для основного процесса):
function shutdown() {
self.Channels.forEach((chan)=>{
chan.stdin.write('q');
chan.stdin.end(); //I have tried both with and without this line and chan.stdin.end('q')
});
}
ОБНОВЛЕНИЕ: переключение на файл контейнера AAC (просто изменив расширение на выходе) устраняет необходимость в изящном выходе FFMPEG.Я все еще хотел бы знать, почему отправка 'q' в stdin только убивает процесс FFMPEG на первые ~ 10 минут.