Используя Node.js с 'fluent-ffmpeg', я могу конвертировать видеопоток из Live TV в mp4, чтобы он воспроизводился в HTML5 Video. Что у меня есть:
- входящее видео - это транспортный поток (Live TV), который я получаю по ссылке с моего сервера. в файл, скажем, in.ts , затем этот файл in.ts я передаю ffmpeg в качестве входного файла.
- эта схема работает, но я получил короткий выходной файл от ffmpeg (out.mp4), даже не смотря на то, что in.ts постоянно растет. FFmpeg конвертирует только тот размер файла, который был записан в тот момент, когда ffmpeg начинает работать.
Мне нужно как-то сказать FFmpeg, что входящий файл растет, и нужно дождаться новых данных для дальнейшей конвертации. .
Также любопытно, есть ли способ предоставить этот файл out.mp4, который должен постоянно расти до видеоплеера HTML5.
Вот код, который у меня сейчас есть:
let ffmpeg = require('fluent-ffmpeg');
let fs = require('fs');
let http = require('http');
let inStream = 'http://IP/stream/direct?channel=8724';
let inFileName = 'in.ts';
let inWriteStream = fs.createWriteStream(inFileName);
let isRun = false;
let request = http.get(inStream, (d) => {
d.on('data', (d) => {
inWriteStream.write(d);
console.log(getSize());
if (getSize() > 10 && !isRun) {
startDecode();
isRun = true;
}
});
})
.on('error', (e) => {
console.error(e);
});
function startDecode() {
var infs = fs.createReadStream(inFileName);
ffmpeg(infs)
.save('out.mp4');
console.log('Decoding....');
}
function getSize() {
let stats = fs.statSync(inFileName);
let fileSizeInBytes = stats.size;
let fileSizeInMegabytes = fileSizeInBytes / 1000000.0;
//size in Mb
return fileSizeInMegabytes;
}