Этот вопрос немного широк, но я построил похожие вещи и постараюсь ответить на него по частям:
- установить время начала и окончания видео от клиента, которое требует, чтобы клиент просматривал видео в определенное время 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 не имеет отношения к вашему проекту.
Надеюсь, эта куча заметок даст вам несколько вещей, на которые стоит обратить внимание.