Можно ли удалить данные, прочитанные из читаемого потока?

У меня есть несколько процессов ffmpeg, работающих по порядку, и все они записываются в один поток (fs.createWriteStream).

Можно ли удалить из файла данные, прочитанные через fs.createReadStream?

Я хочу запускать скрипт 24/7 и хочу, чтобы поток действовал как буфер.

Заранее спасибо!


person Henry    schedule 17.02.2018    source источник
comment
Я не понимаю, чего вы хотите добиться. Вы хотите удалить данные в файл?   -  person TGrif    schedule 18.02.2018
comment
Я открываю поток с помощью fs.createWriteStream (file.mp3). Затем я передаю в него вывод некоторых экземпляров ffmpeg, и через некоторое время файл становится действительно большим, что я хочу предотвратить, удалив контент, который я уже прочитал из mp3-файла (это прямой аудиопоток) @TGrif   -  person Henry    schedule 18.02.2018
comment
Так почему бы вам не передавать данные напрямую без записи в файл?   -  person TGrif    schedule 18.02.2018
comment
Потому что я не вижу возможности добавлять входные данные в работающий экземпляр ffmpeg. Таким образом, я могу добавить звук во время работы потока.   -  person Henry    schedule 18.02.2018


Ответы (1)


На самом деле вы можете «добавлять данные» к работающему экземпляру ffmpeg или к любому другому доступному для записи потоку. Чтобы это стало возможным, вам нужно использовать эту опцию для трубы:

myFile.pipe(ffmpegRunner, {end: false});

Это укажет каналу не уведомлять ffmpeg о завершении файла. Затем вы можете переключать файлы после окончания первого:

myFile.on("end", () => {
    myFile.unpipe(ffmpegRunner);
    anotherFile.pipe(ffmpegRunner, {end: false});
});

Я думаю, вы можете сделать это даже до того, как поток закончится.

person Giulio Bambini    schedule 17.02.2018
comment
Для OP, если вы используете этот метод, файлы, которые вы передаете ffmpeg, должны быть либо необработанными потоками (например, .mp3), либо контейнерами без глобальных заголовков, например MPEG-TS. - person Gyan; 18.02.2018
comment
Поясню прямо: myFile — это поток, созданный с помощью fs.createWriteStream(), а ffmpegRunner — экземпляр ffmpeg? Потому что здесь там написано ffmpegRunner.pipe(stream, options)... - person Henry; 18.02.2018
comment
Также я использую .input(stream) для экземпляра, работающего 24/7, как я смогу переключать файлы при этом? - person Henry; 18.02.2018
comment
Мне удалось решить эту проблему, используя второй пример по ссылке, которую я разместил, просто нужно было кое-что повозиться... Все равно спасибо! :) - person Henry; 18.02.2018