nodejs ffmpeg воспроизводит видео в указанное c время и передает его клиенту - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь создать простой c онлайн-редактор видео с nodeJS и ffmpeg.

Для этого мне нужно 2 шага:

  1. установите время входа и выхода видео от клиента, которое требует, чтобы клиент просматривал видео в определенное время c, и измените положение видео. Это означает, что если одно видео используется в качестве входа и разбито на более мелкие части, его необходимо воспроизвести с момента начала следующего отредактированного сегмента, если это имеет смысл.

  2. отправьте данные ввода-вывода на nodejs и экспортируйте их с помощью ffmpeg как законченный видеоролик.

Сначала я хотел сделать 1. чисто на клиенте, затем загрузить исходное видео (s) на nodeJS, и сгенерируйте тот же результат с помощью ffmpeg, и отправьте результат обратно.

Но в настоящий момент могут возникнуть проблемы с обработкой видео на стороне клиента в HTML, поэтому сейчас У меня смена планов: выполнить всю обработку на сервере nodeJS, включая воспроизведение видео.

Это та часть, в которой я застрял сейчас. Я знаю, что ffmpeg можно использовать по-разному, начиная с nodeJS, но Я не нашел способа воспроизвести видео .mp4 webm в режиме реального времени с помощью ffmpeg с указанием c отметки времени и отправить потоковое видео (опять же, с определенной отметкой времени) клиенту.

Я видел атрибут pipe: 1 из ffmpeg, но я не смог найти никаких учебных пособий, чтобы заставить его работать с mp4 webm video и как-то разобрать данные stdout с nodejs и отправить их клиенту. И даже если бы я мог заставить эту часть работать, у меня все равно не было бы возможности воспроизвести видео в реальном времени с определенной отметкой времени.

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

Итак:

как я могу воспроизвести видео, в nodeJS, в указанное время c (желательно с ffmpeg) и отправить его обратно клиенту в реальном времени?

Что я уже видел:

Лучший подход к HTTP-потоковая передача в реальном времени на HTML5 видео-клиент

Прямая трансляция с использованием FFMPEG для веб-аудио API

Ffmpeg - Как заставить MJPEG выводить целые кадры?

ffmpeg: визуализация webm из stdin с использованием NodeJS

Нет данных, записанных в stdin или stderr из ffmpeg

node.js прямое потоковое вещание ffmpeg stdout в res

преобразование видео в реальном времени с использованием nodejs и ffmpeg

Передача по каналу ffmpeg с использованием nodejs stdout

не может повторно транслировать с использованием FFMPEG в MP4 HTML5 видео

FFmpeg прямой эфир вебм видео для мул отправка http-клиентов через Nodejs

http://www.mobiuso.com/blog/2018/04/18/video-processing-with-node-ffmpeg-and-gearman/

потоковое видео mp4 с узлом fluent-ffmpeg

Как получить указанные c время начала и окончания в ffmpeg по Node JS?

Прямая трансляция: узел-медиа-сервер + Da sh. js сконфигурирован для реального времени с низкой задержкой

Низкая задержка (50 мс) Потоковое видео с NODE.JS и html5

Сервер node.js для прямой трансляции

Потоковая передача HLS с использованием node JS

Потоковая часть видео для клиента

Потоковое видео с HTML 5 через node.js

Потоковая передача видеофайла на видеоплеер html5 с Node.js, чтобы управление видео продолжало работать?

Как (псевдо) передавать видео H.264 - в кросс-браузерном режиме и html5 способом?

Псевдо-потоковая передача файла MP4

Как транслировать видеоданные на элемент видео? * 11 26 *

Как мне преобразовать поток h.264 в MP4 с помощью ffmpeg и передать результат клиенту?

https://medium.com/@brianshaler / на лету -Видео-рендеринг с- node-js и-FFmpeg-165590314f2

node.js прямая трансляция потока ffmpeg в res

Может Node.js редактировать видеофайлы?

1 Ответ

1 голос
/ 12 марта 2020

Этот вопрос немного широк, но я построил похожие вещи и постараюсь ответить на него по частям:

  1. установить время начала и окончания видео от клиента, которое требует, чтобы клиент просматривал видео в определенное время c и переключал положение видео. Это означает, что если одно видео используется в качестве входа и разбито на более мелкие части, его необходимо воспроизвести со времени начала следующего отредактированного сегмента, если это имеет смысл.

На стороне клиента при воспроизведении вы можете просто использовать несколько экземпляров HTMLVideoElement, ссылающихся на один и тот же URL.

Для определения времени вы можете сами управлять этим с помощью свойства .currentTime. Тем не менее, вы обнаружите, что ваше JavaScript время не будет идеальным. Если вы знаете свои начальные / конечные точки во время создания экземпляра, вы можете использовать URI медиа-фрагмента :

video.src = 'https://example.com/video.webm#t=5.5,30';

В этом примере видео начинается с 5,5 секунд и заканчивается на 30 секунд. Вы можете использовать событие ended , чтобы узнать, когда начать воспроизведение следующего клипа. Это не гарантирует идеальную точность кадров, но вполне подходит для чего-то вроде живого предварительного просмотра.

Но могут быть проблемы с обработкой видео на стороне клиента в HTML на Сейчас у меня смена планов: выполнить всю обработку на сервере nodeJS, ...

Неплохой план, если согласованность важна.

... включая воспроизведение видео.

Здесь есть серьезный компромисс, связанный с задержкой управления этим видео и качеством предварительного просмотра. Я бы предложил гибридный подход, при котором редактирование выполняется на стороне клиента, но ваш окончательный отскок / композитинг / что-либо на стороне сервера.

В любом случае это не так, как программное обеспечение для редактирования видео на рабочем столе.

Это та часть, в которой я застрял. Я знаю, что ffmpeg можно использовать по-разному, начиная с nodeJS, но я не нашел способа воспроизвести видео в формате .mp4 в режиме реального времени с помощью ffmpeg с заданной отметкой времени c и отправить потоковое видео. (опять же, в определенное время) клиенту.

Это MP4 или WebM? Это два разных формата контейнера. WebM легко трансформируется, так как он поступает прямо из FFmpeg. MP4 требует futzing с атомом MOOV (-movflags faststart), и может быть немного хлопот.

В любом случае, звучит так, как будто вам просто нужно установить временные метки на входе:

ffmpeg -ss 00:01:23 -i video.mp4 -to 00:04:56 -f webm -

Я видел атрибут pipe: 1 из ffmpeg, но не смог найти учебных пособий, чтобы заставить его работать с видео mp4 webm, как-то проанализировать данные stdout с помощью nodejs и отправить его клиенту.

Просто используйте дефис - в качестве имени выходного файла, и FFmpeg выведет в STDOUT. Тогда вам больше ничего не нужно делать в вашем Node.js приложении ... канале, который выводит непосредственно на клиент. Не проверено, но вы ищете что-то вроде этого, предполагая, что типичное приложение Express:

app.get('/stream', (req, res, next) => {
  const ffmpeg = child_process.spawn('ffmpeg', [
    '-i', 'video.mp4',
    '-f', 'webm',
    '-'
  ]);

  res.set('Content-Type', 'video/webm'); // TODO: Might want to set your codecs here also

  ffmpeg.stdout.pipe(res);
});

И даже если бы я мог заставить эту часть работать, у меня все еще нет идеи играть видео, в реальном времени, с определенной отметкой времени.

Ну, для этого вы просто воспроизводите поток, поэтому вы можете просто сделать:

<video src="https://your-nodejs-server.example.com/stream" preload="none" />

preload="none" часть важна, чтобы поддерживать ее в рабочем состоянии.

Альтернативой всему этому является настройка конвейера GStreamer и, возможно, использование его встроенного стека WebRT C , Это не тривиально, но имеет преимущество в виде потенциально более низкой задержки и автоматической обработки c «догоняющего» видео в реальном времени с сервера. Если вы используете обычный тег видео, вам придется справиться с этим самостоятельно, отслеживая буферизованные данные и управляя скоростью воспроизведения.

Я также видел ffplay ...

FFplay не имеет отношения к вашему проекту.

Надеюсь, эта куча заметок даст вам несколько вещей, на которые стоит обратить внимание.

...