Как воспроизвести несколько видео синхронно?

У меня 3 видео, у всех 3 одинаковое время, одинаковое количество кадров, и они отличаются только качеством кодирования.

Теперь мне нужно, чтобы они работали бок о бок синхронно для оценки. Значение, когда я нажимаю "играть" ОБА! видео должно начаться. Аналогично для остановки, вперед, назад.

Кто-нибудь знает любого игрока, способного сделать это? Под этим я подразумеваю воспроизведение более 1 видео бок о бок...

Платформа: Win7

13 ответов

Решение

VLC на Windows (1.1.10 или более поздняя версия):

  • Инструменты → Настройки
  • Показать настройки → Все
  • Нажмите " Дополнительно" (нажмите " Плейлист" для VLC 2.1.5).
  • Снимите флажок "Разрешить только один запущенный экземпляр"
  • Снимите флажок "Один экземпляр при запуске из файла"

VLC на OS X не предоставляет тот же набор параметров. Однако вы можете запустить несколько экземпляров из терминала с помощью open -a VLC,

Если кто-то все еще заинтересован в этом, текущая версия VLC может сделать это очень хорошо без каких-либо сценариев или дополнений. Насколько я знаю, однако, вы можете воспроизводить только два файла синхронно, а не 3.

  1. Для этого просто откройте VLC и выберите " Мультимедиа"> "Открыть несколько файлов".
  2. Внутри нескольких файловых окон выберите "Добавить", чтобы добавить первый файл.
  3. После этого установите флажок "Показать дополнительные параметры", а затем в нижней части окна установите флажок "Воспроизвести другой носитель синхронно".
  4. Выберите пункт "Дополнительно", чтобы добавить второй файл.
  5. Нажмите кнопку воспроизведения, и два медиа-файла будут воспроизводиться одновременно с одним окном управления.

Вы можете сделать это с помощью mpv, если не возражаете против использования командной строки:

3 видео рядом (горизонтально)

mpv --lavfi-complex="[vid1][vid2][vid3]hstack=inputs=3[vo];[aid1][aid2][aid3]amix=inputs=3[ao]" input1.mkv --external-files="input2.mkv;input3.mkv"

2 видео

mpv --lavfi-complex="[vid1][vid2]hstack[vo];[aid1][aid2]amix[ao]" input1.mkv --external-file=input2.mkv

Заметки

  • В винде используй ; отделить каждое имя файла в --external-files (как показано в примере 3 видео). В Linux и MacOS используют :, В качестве альтернативы используйте два экземпляра --external-file вместо таких как: --external-file=input2.mkv --external-file=input3.mkv,

  • Файлы должны быть одинаковой высоты. Если это не так, добавьте масштаб, площадку и / или фильтры обрезки. См. Документацию mpv и фильтры FFmpeg для получения дополнительной информации.

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

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

  1. Перетащите два видеофайла в Bino
  2. Выберите опцию "Отдельные потоки, левый первый" и опцию "Левый / правый"

Вуаля, у тебя синхронизированное воспроизведение. Это тот тип, в котором для всех потоков используется один набор элементов управления воспроизведением, поэтому вам не придется "инвестировать в вес пальцев и приучить себя очень быстро щелкать", как предлагает @ ta.speot.is.

В качестве бонуса, он поддерживает рендеринг анаглифа 3D.

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

Полное раскрытие: я автор :)

Сделав то, что сказал Киран, откройте все свои видео и запустите следующий скрипт AutoHotKey

ScriptVersion = 1.1
#Singleinstance,force

GoSub, MainProgram
return

mainprogram:
    SetTitleMatchMode, 2
    WinGet, id, list, - VLC media player,, Program Manager
    Windows = 
    Loop, %id%
    {
        StringTrimRight, this_id, id%a_index%, 0
        Windows := this_id . "," . Windows
    }
    StringTrimRight, Windows, Windows, 1

    #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
    SendMode Input ; Recommended for new scripts due to its superior speed and reliability.

    ~]::LoopControlSend(Windows, "]")
    ~[::LoopControlSend(Windows, "[")
    ~j::LoopControlSend(Windows, "j")
    ~k::LoopControlSend(Windows, "k")
    ~space::LoopControlSend(Windows, "{space}")

    ~+left::LoopControlSend(Windows, "+{left}")
    ~!left::LoopControlSend(Windows, "!{left}")
    ~^left::LoopControlSend(Windows, "^{left}")
    ~+right::LoopControlSend(Windows, "+{right}")
    ~!right::LoopControlSend(Windows, "!{right}")
    ~^right::LoopControlSend(Windows, "^{right}")
    ~^up::LoopControlSend(Windows, "^{up}")
    ~^down::LoopControlSend(Windows, "^{down}")

    ; for active windows only. use this to adjust speed when out of sync
    ~left::ActiveWindowSend(Windows, "+{left}")
    ~right::ActiveWindowSend(Windows, "+{right}")
    ~up::ActiveWindowSend(Windows, "^{left}")
    ~down::ActiveWindowSend(Windows, "^{right}")
return

LoopControlSend(Windows, x)
{
    WinGet, active_id, ID, A

    is_valid_window = 0
    Loop,Parse,Windows,CSV
    {
        if active_id = %A_LoopField%
        {
            is_valid_window = 1
            break
        }
    }

    if is_valid_window
    {
        Loop,Parse,Windows,CSV
        {
            if active_id <> %A_LoopField%
            {
                ControlSend, , %x%, Ahk_Id %A_LoopField%
            }
        }
    }
}

ActiveWindowSend(Windows, x)
{
    WinGet, active_id, ID, A

    is_valid_window = 0
    Loop,Parse,Windows,CSV
    {
        if active_id = %A_LoopField%
        {
            is_valid_window = 1
            break
        }
    }

    if is_valid_window
    {
        SendInput, %x%
    }
}

Этот сценарий отправляет нажатия клавиш всем работающим экземплярам медиаплеера VLC. Это не работает, если вы используете мышь.

Эти вещи должны работать:

  • вперед: Ctrl + right / Alt + right / Shift + right
  • назад: Ctrl + left / Alt + left / Shift + left
  • играть / пауза: space
  • ускорить: ]
  • снизить скорость: [

Вы можете легко добавить другие нажатия клавиш под строкой: ~^down::LoopControlSend(Windows, "^{down}")

Это не синхронизирует видео идеально, поэтому вы можете использовать следующие 4 клавиши: left, right, up, down управлять только активным окном.

  • left очень короткий прыжок назад
  • right очень короткий прыжок вперед
  • up средний обратный прыжок
  • down средний прыжок вперед

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

;Modified from MultipleSend by jgpaiva

ScriptVersion = 1.1
#Singleinstance,force

GoSub, MainProgram
return

Guiescape:
GuiClose:
    gui,destroy
    exitapp  

mainprogram:
    ;start by populating the listview.
    Gui, 1:default
    Gui, Add, Text, ,Select the windows to send the text.`nSelect several by pressing ctrl while selecting.`nAfter you've finished the selection`, press Submit.
    Gui, Add, ListView,w400 h500 vMyListView, Name of the Window | Window Class |Window ID
    WinGet, id, list,,, Program Manager
    Loop, %id%
    {
        StringTrimRight, this_id, id%a_index%, 0
        WinGetClass, this_class, ahk_id %this_id%
        WinGetTitle, this_title, ahk_id %this_id%
        If This_Title =
            continue
        if % LV_Add("",This_Title,This_Class,This_ID) = 0
            msgbox, bug
    } 
    Gui, Add, Button, default,Submit
    Gui,  Show
return

ButtonSubmit:
    NextRow := -1
    Windows =
    Loop,% LV_GetCount("Selected")
    {
    NextRow:=LV_GetNext(NextRow)
    LV_GetText(Text, NextRow,3)
    Windows := Text . "," . Windows
    }
    StringTrimRight, Windows, Windows, 1
    Gui,1:Destroy

    #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
    SendMode Input ; Recommended for new scripts due to its superior speed and reliability.

    ~]::LoopControlSend(Windows, "]")
    ~[::LoopControlSend(Windows, "[")
    ~j::LoopControlSend(Windows, "j")
    ~k::LoopControlSend(Windows, "k")
    ~space::LoopControlSend(Windows, "{space}")

    ~+left::LoopControlSend(Windows, "+{left}")
    ~!left::LoopControlSend(Windows, "!{left}")
    ~^left::LoopControlSend(Windows, "^{left}")
    ~+right::LoopControlSend(Windows, "+{right}")
    ~!right::LoopControlSend(Windows, "!{right}")
    ~^right::LoopControlSend(Windows, "^{right}")

    ~^up::LoopControlSend(Windows, "^{up}")
    ~^down::LoopControlSend(Windows, "^{down}")

    ; for active windows only. use this to adjust speed when out of sync
    ~left::ActiveWindowSend(Windows, "+{left}")
    ~right::ActiveWindowSend(Windows, "+{right}")
    ~up::ActiveWindowSend(Windows, "^{left}")
    ~down::ActiveWindowSend(Windows, "^{right}")
return

LoopControlSend(Windows, x)
{
    WinGet, active_id, ID, A

    is_valid_window = 0
    Loop,Parse,Windows,CSV
    {
        if active_id = %A_LoopField%
        {
            is_valid_window = 1
            break
        }
    }

    if is_valid_window
    {
        Loop,Parse,Windows,CSV
        {
            if active_id <> %A_LoopField%
            {
                ControlSend, , %x%, Ahk_Id %A_LoopField%
            }
        }
    }
}

ActiveWindowSend(Windows, x)
{
    WinGet, active_id, ID, A

    is_valid_window = 0
    Loop,Parse,Windows,CSV
    {
        if active_id = %A_LoopField%
        {
            is_valid_window = 1
            break
        }
    }

    if is_valid_window
    {
        SendInput, %x%
    }
}

Google, вероятно, уже говорил вам, что вы можете купить пару проприетарных программ, которые могут это сделать, но на всякий случай: videocompare, tmpgenc, vidlord...

Это бесплатно: http://forum.doom9.org/showthread.php?t=138430

(рабочие ссылки для скачивания в конце ветки)

Не проверено, потому что моя винная установка полностью испорчена прямо сейчас. Он не работает бок о бок, но воспроизводится в стеке (если у вас не очень хороший ЖК-дисплей, вы не увидите одно и то же, если все равно сыграете один и тот же видео в двух противоположных углах экрана)

Если вы думаете, что вам действительно нужно рядом, вы можете использовать avisynth, чтобы делать то, что сказал Циммер.

clip1 = DirectShowSource("C:\MyEncode1.foo", audio=false)
clip2 = DirectShowSource("C:\MyEncode2.foo", audio=false)
StackVertical(clip1,clip2)

(ссылка на forum.doom9.org/showthread.php?t=139769)

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

У меня та же проблема, но я пока не видел удовлетворительных решений онлайн (и, поверьте мне, я провел тщательный поиск). Наконец-то я придумала собственное решение, которое не требует лишних долларов. Хотя это старый вопрос, я надеюсь, что мой обходной путь все еще будет полезен.

Во-первых, в проигрывателе VLC, перейдите в Инструменты-> Настройки. Обязательно снимите флажок "Разрешить только один запущенный экземпляр" и "Пауза в последнем кадре видео".

Затем введите / отредактируйте следующие команды в текстовом файле. Откройте командную строку Windows и выполните команды путем копирования и вставки (или сохраните текст и запустите его как командный файл):

set VLCplayer="C:\Program Files (x86)\VideoLAN\VLC\vlc.exe"
set VLCoptions=--repeat
set VIDEOdir="D:\path to your video directory"
set Video1="calibration1.mj2"
set Video2="calibration2.mj2"
set Video3="calibration3.mj2"

REM check the commands for misplaced spaces or missing '/' or '"' before running
ECHO cd %VIDEOdir%
ECHO %VLCplayer% %VLCoptions% %Video1%
ECHO %VLCplayer% %VLCoptions% %Video2%
ECHO %VLCplayer% %VLCoptions% %Video3%

cd %VIDEOdir%
%VLCplayer% %VLCoptions% %Video1%
%VLCplayer% %VLCoptions% %Video2%
%VLCplayer% %VLCoptions% %Video3%

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

Я пробовал, но невозможно управлять всеми экземплярами с помощью горячих клавиш для остановки, перемотки вперед, назад и т. Д. Однако опция '--repeat' поместит видео в цикл, так что вы можете просто подождать, пока они начнут сначала.,

Для очень длинных видео может быть лучше объединить видео в параллельной композиции в одно видео, используя, например, ffmpeg: https://ffmpeg.org/pipermail/ffmpeg-user/2013-June/015662.html и http://ffmpeg.org/pipermail/ffmpeg-user/2013-June/015712.html Эта команда описывает только то, как объединить два видео, но я верю (т.е. я не проверял это), вы можете запустить команду несколько раз, чтобы включить несколько видео файлов.

Awesome Video Player может делать это с 16 видео (платно) или до 4 видео (бесплатно).

Вы можете легко воспроизводить / приостанавливать и искать все видео одновременно с Space помощью клавиш со стрелками.
Кроме того, вы можете использовать сочетания клавиш для управления отдельными видео.

Я не связан с AVP, я просто пользователь.

Я представляю, что вы можете использовать скрипт AutoHotKey, чтобы отправить ярлык "Play" всем трем игрокам за очень короткое время.

Способны ли они начать играть в одно и то же время, это другой вопрос. Даже если они смогут начать сразу, я думаю, что будет немного борьбы за жесткий диск. Возможно, вы захотите сделать RAM-диск, если это важная оценка.

При сравнении качества видео полезно разделить видео, чтобы можно было увидеть разницу в качестве пикселей.

  1. Vivict предлагает отличный способ сравнения видео, разделенных таким образом, особенно благодаря тому, что вы можете использовать мышь для перемещения разделительной линии. Однако проект ограничен двумя одновременными видео и не поддерживает некоторые форматы.
  2. ffplay можно использовать для размещения видео рядом.
  3. Поскольку два вышеупомянутых варианта имели ограничения, я написал программу, которая позволяет добавлять столько видео, сколько вам нужно, а также имеет возможность изменять ось и положение видео. См. проект SplitVideoQualityViewer.


Если это не то, что вы делаете очень часто, я бы использовал программное обеспечение для редактирования видео, такое как Вегас, чтобы создать одно видео со всеми их показами.

Youtube видео пример того, как это сделать.

Многие игроки смогут выводить изображение одного кадра в видео.

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

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

Убедитесь, что вы не используете JPG в качестве выходных данных, поскольку это формат с потерями, и он представит свои собственные артефакты.

Другие вопросы по тегам