如何并排同步播放多个视频?

Gru*_*ear 55 windows-7 media-player software-rec

我有 3 个视频,所有 3 个都具有相同的时间,相同的帧数,它们仅在编码质量方面有所不同。

现在我需要它们以同步方式并行运行以进行评估。意思是当我同时按下“播放”时!视频应该开始。类比地表示停止、前进、后退。

有谁知道有哪位球员能够做到这一点?我的意思是并排播放超过 1 个视频...

平台:Win7

小智 44

如果有人仍然对此感兴趣,那么当前版本的 VLC 无需任何脚本或附加组件即可很好地完成此操作。但据我所知,您只能同步播放两个文件,而不是 3 个。

  1. 要完成此操作,只需打开 VLC 并选择Media>Open Multiple Files
  2. 在多个文件窗口中,选择添加以添加第一个文件。
  3. 在此之后,单击“显示更多选项”复选框,然后单击窗口底部的“同步播放其他媒体”复选框。
  4. 选择“额外媒体”旁边的浏览以添加第二个文件。
  5. 点击播放,两个媒体文件将通过一个控制窗口同时播放。

  • 对于 3.0.7,这似乎工作如下 - 单击播放后主视频开始播放,右键单击视频 -> 视频轨道 -> 轨道 2。这将打开一个单独的窗口,其中包含第二个视频。它们都由原始窗口中的控件控制。 (10认同)
  • 这仅适用于 2 个视频而不适用于 3 个 (3认同)
  • 如果您需要 3 个视频,请在第 5 步之前:在“打开媒体”窗口中,转到窗口底部的“编辑选项”字段。请注意,您的第二个视频文件位于类似 `:input-slave=file:///C:/Users/me/Documents/someVideo.mov:file-caching=300` 的框中。在文件名后放一个 `#` 然后是下一个相同格式的文件名,例如 `:input-slave=file:///C:/Users/me/Documents/someVideo.mov#file:///C:/用户/我/文档/yetAnother.mov :file-caching=300`。然后当您单击播放时,它将同步播放所有三个文件。见参考:https://wiki.videolan.org/VLC_command-line_help/ (3认同)
  • @filups21 似乎是一个错误,但有一个解决方法:首先选择第二个轨道,然后寻找视频中的某个位置。这将打开第二个视频窗口 (3认同)
  • 使用 VLC 3.0.16 仍然无法工作。甚至“解决方法”。 (3认同)
  • 不适用于 3.0.5 版,但适用于 2.2.4 版。 (2认同)
  • 不适用于 3.0.8 64x。我可以在视频轨道之间切换,但不能同时显示。 (2认同)

llo*_*gan 24

如果您不介意使用命令行,则可以使用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"
Run Code Online (Sandbox Code Playgroud)

2 个视频

mpv --lavfi-complex="[vid1][vid2]hstack[vo];[aid1][aid2]amix[ao]" input1.mkv --external-file=input2.mkv
Run Code Online (Sandbox Code Playgroud)

笔记

  • 在 Windows 中使用;分隔每个文件名--external-files(如3 个视频示例所示)。在 Linux 和 macOS 中使用:. 或者,使用两个实例--external-file代替,例如:--external-file=input2.mkv --external-file=input3.mkv

  • 文件的高度必须相同。如果不是,则添加比例、填充和/或裁剪过滤器。有关更多信息,请参阅mpv 文档FFmpeg 过滤器

  • 知道如何为视频 2 添加延迟吗?我尝试在 `[vid2]` 之后添加一个 `adelay` 过滤器,如下所示: `mpv --lavfi-complex="[vid1][vid2]hstack;adelay=delays=4000:all=1[vo];[aid1 ][aid2]amix[ao]" input1.mkv --external-file=input2.mkv` 但我收到错误(`Pad in2 未连接到任何东西`,非常明确......) (3认同)

Ole*_*leg 18

Bino是一种跨平台媒体播放器,通常推荐用于立体文件播放。除其他功能外,它还支持多个流的同步播放。

界面起初可能看起来有点原始或令人困惑,但您需要做的就是

  1. 将您的两个视频文件拖入 Bino
  2. 选择“单独的流,左先”输入选项和“左/右”输出选项

瞧,您获得了同步播放。对所有流使用一组播放控件的那种,因此您不必像@ta.speot.is 建议的那样“投资一些手指重量并训练自己非常快速地点击”

作为奖励,它支持渲染立体 3D。

  • 文件需要具有相同的大小和代码,否则该选项将显示为灰色。 (3认同)
  • OP 要求并排放置*三个*视频,而不是两个。据我所知,Bino 只支持两个视频。(另外,对我来说,“单独的流,先离开”选项是灰色的) (2认同)

小智 16

Windows 上的 VLC(1.1.10 或更高版本):

  • 工具 → 首选项
  • 显示设置 → 全部
  • 单击高级(单击VLC 2.1.5 的播放列表
  • 取消选中“仅允许一个正在运行的实例”
  • 取消选中“从文件管理器启动时仅使用一个实例”

OS X 上的 VLC 不提供相同的选项集。但是,您可以使用open -a VLC.

  • 这不能回答问题(Windows 7,而不是 OS X)。他也许可以用一个批处理文件开始 3 个视频,但没有办法暂停它们等等。 (17认同)
  • 这不应该是公认的答案。它不允许用户一起控制视频。 (5认同)
  • 这是 Mac 的“open -n -a vlc”。 (2认同)

小智 10

GridPlayer可以同时播放任意数量的视频。您可以播放、停止、搜索所有视频或单独播放每个视频。可以设置循环。您还可以控制播放速率、音量、动物园等。

完全披露:我是作者:)

在此输入图像描述

  • 我知道这是一个很晚的答案,所以没有太多赞成票,但这确实需要更加明显。尝试了一下,这是最不麻烦的方法。我知道 Awesome Video Player,但这个是免费且开源的。根据您的机器,如果您一次播放太多全高清视频,您可能会遇到一些帧速率问题,但这大概是我能看到的唯一限制。 (3认同)

小智 5

谷歌可能已经告诉你,你可以购买一些可以做到这一点的专有软件,但以防万一:videocompare、tmpgenc、vidlord...

这是免费的:http ://forum.doom9.org/showthread.php?t=138430

(线程末尾的有效下载链接)

未经测试,因为我的葡萄酒设置现在完全搞砸了。它不会并排播放,而是堆叠播放(除非你有一个非常好的液晶显示器,否则你不会通过在屏幕的两个相对角播放相同的视频来看到相同的东西)

如果您认为您确实需要并排,您可以使用 avisynth 来执行 zimmer 所说的操作。

clip1 = DirectShowSource("C:\MyEncode1.foo", audio=false)
clip2 = DirectShowSource("C:\MyEncode2.foo", audio=false)
StackVertical(clip1,clip2)
Run Code Online (Sandbox Code Playgroud)

(参考forum.doom9.org/showthread.php?t=139769)

您不需要进行编码(无论如何都会添加自己的编码工件),只需创建一个项目即可生成一起播放的两个视频的编码并跳过文件。


use*_*874 5

执行 Kiran 所说的操作后,打开所有视频并运行以下 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%
    }
}
Run Code Online (Sandbox Code Playgroud)

该脚本将您的击键发送到 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%
    }
}
Run Code Online (Sandbox Code Playgroud)