34

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

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

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

Платформа: Win7

10 ответов10

28

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

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

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

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

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

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

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

11

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

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

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

4

Сделав то, что сказал Киран, откройте все свои видео и запустите следующий скрипт 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%
    }
}
3

Вы можете сделать это с помощью 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 для получения дополнительной информации.

3

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?т = 139769)

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

3

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

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

1

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

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

-1

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

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

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

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

-1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .