Экспортируйте проект .osp OpenShot в скрипт ffmpeg в качестве обходного пути к остановке экспорта видео или аварийному отказу - PullRequest
0 голосов
/ 29 августа 2018

У меня большой пик видео 35 ".

С помощью OpenShot я вырезал более 30 небольших последовательностей и объединял их в одну 25-дюймовую последовательность.

Теперь я пытаюсь экспортировать результат в виде видеофайла, но OneShot случайно вылетает или зависает во время экспорта / кодирования от 40% до 80%, так что после более чем часа кодирования. Похоже, что это память и обмен подкачкой с выделением памяти, отрицаемым, потому что не осталось места.

Я пробовал с кодировкой x264 (mp4) и vp8 (webm), но ничего не получалось.

Я открыл .osp файл, это большой файл json со всеми ссылками, подобными этим:

{
  clips:[
    {
      title: "<clipFileName.ext>",
      start:<seconds>.<decimals>,
      end:<seconds>.<decimals>,
      position:<seconds>.<decimals>
    }
  ]
}
  • title, если не переименовано, является inputFileName.
  • start время начала клипа с начала входного файла
  • end время окончания клипа с начала входного файла
  • position начальная позиция клипа на временной шкале выходного файла

Я прочитал ffmpeg может извлекать видео части / субклипы / последовательности с помощью функции вырезания : ffmpeg -ss 00:00:09.000 -i input.mp4 -to 00:00:20 output.mp4 Время может быть hh:mm:ss.xxx или hh:mm:ss или любое количество seconds, допуская десятичные дроби.

Я также прочитал ffmpeg может объединять последовательности : ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" output.ts

Итак, как кодировать мое видео с этими данными проекта?

1 Ответ

0 голосов
/ 29 августа 2018

Итак, я создаю следующий скрипт, чтобы извлечь все клипы в виде видеофайлов и затем объединить их:

function parser(e){
  const commandList = [];
  const outputFilesName = []
  const reader = new FileReader();
  reader.onload = function(){
    const j = JSON.parse(reader.result);
    j.clips.forEach(function(c){
      const fileName = f3d(c.position) + '.ts';
      outputFilesName.push(fileName);
      let cmd = `ffmpeg -i ${c.title} -ss ${f3d(c.start)} -to ${f3d(c.end)} `;
      cmd+= `-c copy -bsf:v h264_mp4toannexb -acodec libmp3lame -ab 128k -f mpegts `;
      cmd+= fileName;
      commandList.push(cmd);
    });
    const script = `Go to your video rush folder and run the following script :
    
${commandList.join(' && ')} && ffmpeg -i "concat:${outputFilesName.join('|')}" -c copy concatenated.mp4`
    document.getElementById('commands').innerHTML = script;
  };
  reader.readAsText(e.target.files[0]);
}

document.getElementById('osp').addEventListener('change', parser, false);
function f3d(floatNumber){
  return Math.round(floatNumber*1000)/1000;
}


...