Как конвертировать видео * .ts в * .mp4 на лету и воспроизводить его в Интернете (node.js) - PullRequest
0 голосов
/ 17 октября 2019

Используя 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;
}

1 Ответ

1 голос
/ 17 октября 2019

Стандартные файлы mp4 нельзя использовать для живого видео. Файлы MP4 используют структуру, которая кодирует все размеры кадров в одном месте в конце (или начале) файла. Следовательно, mp4 не может быть воспроизведен до тех пор, пока он не будет завершен, и эта информация записана. Существует такая вещь, как «фрагментированный mp4», который делает маленькие mp4s, которые можно воспроизводить вплотную.

...