Изящно закрывая дочерние процессы FFMPEG от узла - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь записать множество аудио каналов, используя 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 минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...