Объедините несколько видео в одно - PullRequest
6 голосов
/ 10 ноября 2009

У меня есть три видео:

  • лекция, снятая на видеокамеру
  • видео с рабочего стола компьютера, использованного в лекции
  • и видео с доски

Я хочу создать окончательное видео с этими тремя компонентами, занимающими определенную область экрана.

Является ли программное обеспечение с открытым исходным кодом, которое позволило бы мне сделать это (mencoder, ffmpeg, virtualdub ..)? Что вы рекомендуете?

Или есть C / C ++ API, который позволил бы мне создать что-то подобное программно?

Редактировать
В будущем будет записано несколько лекций. Это означает, что мне нужно универсальное / автоматизированное решение.

В настоящее время я проверяю, могу ли я написать приложение с GStreamer для выполнения этой работы. Любые комментарии по этому поводу?

Решено!
Мне удалось это сделать с помощью элемента видеомиксера GStreamer. Я использую синтаксис gst-launch для создания конвейера, а затем загружаю его с помощью gst_parse_launch. Это действительно продуктивный способ реализации сложных конвейеров.

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

  desktop. ! queue
           ! ffmpegcolorspace
           ! videoscale
           ! video/x-raw-yuv,width=640,height=480
           ! videobox right=-320
           ! ffmpegcolorspace
           ! vmix.sink_0
  webcam. ! queue
          ! ffmpegcolorspace
          ! videoscale
          ! video/x-raw-yuv,width=320,height=240
          ! vmix.sink_1
  logo. ! queue
        ! jpegdec
        ! ffmpegcolorspace
        ! videoscale
        ! video/x-raw-yuv,width=320,height=240
        ! vmix.sink_2
  vmix. ! t.
  t. ! queue
     ! ffmpegcolorspace
     ! ffenc_mpeg2video
     ! filesink location="recording.mpg"
  t. ! queue
     ! ffmpegcolorspace
     ! dshowvideosink
  videotestsrc name="desktop"
  videotestsrc name="webcam"
  multifilesrc name="logo" location="logo.jpg"
  videomixer name=vmix
             sink_0::xpos=0 sink_0::ypos=0 sink_0::zorder=0
             sink_1::xpos=640 sink_1::ypos=0 sink_1::zorder=1
             sink_2::xpos=640 sink_2::ypos=240 sink_2::zorder=2
  tee name="t"

Ответы [ 4 ]

4 голосов
/ 11 ноября 2009

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

Процесс работает так:

  1. демультиплексировать аудио из источника 1 в сырой WAV
    • Demux audio из источника 2
    • Demux audio из источника 3
    • Демукс видео из источника 1 в MPEG1
    • Демо-видео из источника 2
    • Demux video из источника 3
    • Объединение аудио 1 + аудио 2 + аудио 3
    • Конкатенация видео 1 + видео 2 + видео 3
    • мультиплексировать аудио 123 и видео 123 в цель
    • кодировать в целевой формат

Я думаю, что удивляет людей, что вы можете буквально объединить два необработанных звуковых файла wav PCM, и результат будет действительным. Что действительно, действительно удивляет людей, так это то, что вы можете делать то же самое с видео MPEG1 / h.261.

Как я уже сказал, я сделал это. Есть некоторые особенности, но это определенно работает. Моя программа была выполнена в bash-скрипте с помощью ffmpeg. Хотя я никогда не использовал ffmpeg C API, я не понимаю, почему вы не можете использовать его для того же.

Это очень образовательный проект, если вы склонны. Если ваша цель состоит в том, чтобы просто соединить несколько видео для одного проекта, то, возможно, лучше использовать инструмент с графическим интерфейсом.

2 голосов
/ 10 января 2012

вы можете объединить несколько видеофайлов / потоков в одно изображение с VLC:

есть интерфейс командной строки, так что вы можете создавать сценарии / автоматизировать его.

http://wiki.videolan.org/Mosaic

2 голосов
/ 10 ноября 2009

Если вы просто хотите объединить кадры в одно видео и обрезать видео, я бы использовал виртуальный даб.

0 голосов
/ 11 ноября 2009

avisynth может сделать это довольно легко. Посмотрите здесь в разделе Мозаика для примера.

Я довольно часто использовал ffmpeg и никогда не сталкивался с этой функциональностью, но это не значит, что ее там нет. Вы всегда можете сделать это самостоятельно на C или C ++ с помощью libavformat и libavcodec (библиотеки ffmpeg), если вы ищете проект, но вам придется сильно испачкать руки, если вы сами создадите видео. Если вы просто хотите, чтобы видео было сделано, а не возиться с кодом, обязательно используйте готовый инструмент, такой как avisynth или virtualdub.

...