Создание потока hls в облачных функциях Google (ffmpeg) - PullRequest
0 голосов
/ 03 ноября 2018

Я пытался в течение нескольких часов без хорошего результата.

Я хочу создать поток hls (из видео mp4) с помощью облачных функций Google.

Вот что я придумал до сих пор:

  const remoteReadStream = myBucket.file(vidPath).createReadStream();
  const remoteWriteStream = myBucket.file(vidPath.replace('.mp4', '.m3u8')).createWriteStream();


  var proc = ffmpeg()
    .input(remoteReadStream)
  // Base url
  // include all the segments in the list
  .addOption('-hls_time',4)
  .addOption('-c:a aac')
  .addOption('-ar 48000')
  .addOption('-c:v h264')
  .addOption('-profile:v main')
  .addOption('-crf 20')
  .addOption('-sc_threshold 0')
  .addOption('-g 48')
  .addOption('-keyint_min 48')
  .addOption('-hls_playlist_type vod')
  .addOption('-b:v 800k')
  .addOption('-maxrate 856k')
  .addOption('-bufsize 1200k')   
  .addOption('-b:a 96k')
  .addOption('-hls_segment_filename', 'this_is_not_working_%03d.ts') 
              *tried gs://.../videos/$03d.ts' as well as other paths...
  .outputOptions('-f hls')
  .on('progress', function(progress) {

    var processing_str = 'Processing:' + progress.percent + '% done';
    console.log(processing_str);
  })
  .on('end', function() {
    console.log('file has been ffmpeg succesfully');
  })
  .on('error', (err, stdout, stderr) => {
      console.error('An error occured during encoding', err.message);
      console.error('stdout:', stdout);
      console.error('stderr:', stderr);
    })
  .pipe(remoteWriteStream, { end: true });

Это даст мне файл m3u8, но файлы заголовков (ts files) не будут созданы, из-за сбоя их сохранения. Файл m3u8 сохранен, потому что это поток.

Открытие 'xxx.ts' для записи Не удалось записать заголовок для выходного файла # 0 (неверные параметры кодека?)

Я хочу сохранить их в той же папке, но не могу получить к ней доступ из-за корзины. Кто-нибудь знает, как «создать» несколько файлов (указать точный путь моего сегмента) в конфигурации ffmpeg?

Возможно, сохранение их в виде потока было бы ответом, но я понятия не имею, как передать этот поток (.createWriteStream ();) в качестве аргумента.

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

...