如何同步播放多个视频并排播放?
我有3个视频,3个视频都有相同的时间,相同的帧数,它们只是在编码质量上有所不同。
现在我需要它们以同步的方式并排运行,以便进行评估。也就是说,当我按下 “播放 "键时,两个视频都应该开始。类似于停止、前进、后退。
有谁知道有什么播放器可以做到这一点?我的意思是指并排播放多于1个视频…
平台。Win7
我有3个视频,3个视频都有相同的时间,相同的帧数,它们只是在编码质量上有所不同。
现在我需要它们以同步的方式并排运行,以便进行评估。也就是说,当我按下 “播放 "键时,两个视频都应该开始。类似于停止、前进、后退。
有谁知道有什么播放器可以做到这一点?我的意思是指并排播放多于1个视频…
平台。Win7
如果你不介意使用命令行的话,你可以用 mpv 来实现。
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"
mpv --lavfi-complex="[vid1][vid2]hstack[vo];[aid1][aid2]amix[ao]" input1.mkv --external-file=input2.mkv
在Windows中,使用;
来分隔每个文件名(如3个视频的例子所示)。在Linux和macOS中使用--external-files
。或者,使用两个:
的实例来代替,如。--external-file
.
文件必须都是相同高度。如果不一样,则添加缩放、填充和/或裁剪滤镜。请参阅 mpv 文档 和 FFmpeg 过滤器 了解更多信息。
按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%
}
}
这个脚本会把你的按键发送到所有正在运行的VLC媒体播放器中。如果你使用鼠标,它就不起作用了。
这些东西应该能用。
Ctrl + right / Alt + right / Shift + right
Ctrl + left / Alt + left / Shift + left
space
]
[
~^down::LoopControlSend(Windows, "^{down}")
你可以很容易地在下面添加其他按键:left, right, up, down
这并不能完美地同步视频,所以你可以使用以下4个键。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%
}
}
```。
谷歌可能已经告诉你了,你可以买几个专有软件谁可以做到这一点,但以防万一: videocompare,tmpgenc,vidlord……
这个是免费的: http://forum.doom9.org/showthread.php?t=138430
(工作下载链接在帖子末尾)
未测试,因为我的wine设置现在完全搞砸了。
未测试,因为我的wine设置现在完全被搞乱了。它不做并排播放,而是堆叠播放(除非你有一个很好的lcd,否则你不会看到同样的东西,在屏幕的两个相反角落播放同样的视频)
如果你认为你真的需要并排播放,你可以使用visynth来做zimmer所说的。
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播放器中,进入工具->首选项。确保取消勾选 “Allow only one running instance "和 "Pause on the last frame of a video"。
然后,在文本文件中输入/编辑以下命令。打开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 an http://ffmpeg.org/pipermail/ffmpeg-user/2013-June/015712.html 这个命令只描述了如何合并两个视频,但我相信(即我没有测试过)你可以多次运行这个命令来合并多个视频文件。
我形象的说,你可以用AutoHotKey脚本在很短的时间内给三个玩家发送一个 “播放 "的快捷方式。
他们是否能够完全在同一时间开始游戏是另一回事。即使他们能够直接开始,我想也会有一些争夺硬盘的现象。如果这是一个重要的评价,可能要做一个内存盘。
如果这不是你经常做的事情,我会使用像Vegas这样的视频编辑软件来建立一个视频,所有的人都会显示。 Youtube视频示例如何做到这一点。。