63

I've got 3 videos, all 3 have the same time, same amount of frames, and they only differ in terms of encoding quality.

Now I need them to run side-by-side in synchronized fashion for evaluation purposes. Meaning when I press "play" BOTH! videos should start. Analogically for stop, forward, backward.

Anyone know any player capable of doing that? By that I mean playing more than 1 video side-by-side...

Platform: Win7

fixer1234
  • 27,064
  • 61
  • 75
  • 116
Grumpy ol' Bear
  • 6,271
  • 12
  • 58
  • 78

13 Answers13

52

If anyone is still interested in this the current version of VLC is able to do this very well without any kind of scripting or add-on. As far as I know however you can only play two files synchronously, not 3.

  1. To accomplish this simply open VLC and select Media>Open Multiple Files.
  2. Inside the multiple file windows select add to add the first file.
  3. After this click on the, "Show more options," checkbox followed by the, "Play another media synchronously," checkbox at the bottom of the window.
  4. Select browse next to, "Extra media," to add the second file.
  5. Hit play and the two media files will play simultaneously with a single control window.
Ramhound
  • 41,734
  • 35
  • 103
  • 130
Tim L
  • 709
  • 1
  • 6
  • 4
  • Works perfectly on OSX :) – Navin Jan 29 '16 at 07:16
  • 3
    this works only for 2 videos not 3 – Wakan Tanka Dec 08 '16 at 09:00
  • 4
    If you want 3 videos, before step 5: on the Open Media window, go to the Edit Options field at the bottom of the window. Note that your 2nd video file is in the box like `:input-slave=file:///C:/Users/me/Documents/someVideo.mov:file-caching=300`. After the filename put a `#` then the next filename in the same format, e.g. `:input-slave=file:///C:/Users/me/Documents/someVideo.mov#file:///C:/Users/me/Documents/yetAnother.mov :file-caching=300`. Then when you click Play it will play all three files in sync. See reference: https://wiki.videolan.org/VLC_command-line_help/ – Rory Dec 29 '17 at 12:03
  • 2
    Didn't work for version 3.0.5, but it did work for version 2.2.4. – badjr Dec 31 '18 at 04:48
  • 13
    For 3.0.7 this seems to work as follows - after you click Play the main video starts playing, Right click Video -> Video Track -> Track 2. This opens a separate window with the second vid. They're both controlled by the controls in the original window. – Terry Brown Jun 11 '19 at 19:10
  • 2
    Not working on 3.0.8 64x. I can switch between video tracks, but not display both simultaneously. – filups21 Apr 19 '20 at 17:21
  • 2
    @filups21 seems to be a bug, but there's a workaround: select the second track first and then seek to somewhere in the video. This opens the second video window – hanjo Aug 19 '20 at 08:57
  • 3
    Still not working using VLC 3.0.16. Even the "workaround". – WackGet Sep 29 '21 at 20:44
  • @hanjo Your workaround works for me (3.0.16). Thanks. – Shaohua Li Feb 22 '22 at 08:08
37

You can do this with mpv if you don't mind using the command-line:

3 videos side-by-side (stacked horizontally)

enter image description here

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 videos

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

Notes

  • In Windows use ; to separate each file name in --external-files (as shown in the 3 videos example). In Linux and macOS use :. Alternatively, use two instances of --external-file instead such as: --external-file=input2.mkv --external-file=input3.mkv.

  • Files must all be the same height. If they are not then add the scale, pad, and/or crop filters. See the mpv documentation and FFmpeg Filters for more info.

llogan
  • 57,139
  • 15
  • 118
  • 145
  • The link of doucmentation is incorrect, could you update the link? – foxiris Feb 15 '21 at 13:27
  • @foxiris Fixed, thanks. – llogan Feb 15 '21 at 20:06
  • Thanks! That's exactly what I'm looking for. – Xavier Sep 03 '21 at 10:13
  • 3
    Any idea how to add a delay to, let's say, video 2? I tried adding a `adelay` filter after `[vid2]`, like that: `mpv --lavfi-complex="[vid1][vid2]hstack;adelay=delays=4000:all=1[vo];[aid1][aid2]amix[ao]" input1.mkv --external-file=input2.mkv` but I'm getting an error (`Pad in2 is not connected to anything`, really explicit...) – ThibaultV Aug 03 '22 at 22:37
  • @ThibaultV. Probably a too late answer, but as far as I understand the documentation you can just delay the audio or subtitles for (both) the videos but not the video track of one of the videos – patrickvogt Apr 08 '23 at 20:00
20

Bino is a cross-platform media player commonly recommended for stereoscopic file playback. Among other features, it supports synchronized playback of multiple streams.

The interface may seem a bit primitive or confusing at first, but all you need to do is

  1. Drag your two video files into Bino
  2. Select "Separate streams, left first" input option and "Left/right" output option

Voilà, you got synchronized playback. The kind where a single set of playback controls is used for all streams so you wouldn't have to "Invest in some finger weights and train yourself to click very quickly" as @ta.speot.is suggests.

As a bonus, it supports rendering anaglyph 3D.

Oleg
  • 613
  • 6
  • 16
  • 3
    The OP asked for having *three* videos side-by-side, not two. As far as I can see, Bino only supports two videos. (Additionally, for me the "Separate streams, left first" option is greyed out) – Simon Forsberg Jun 16 '15 at 16:05
  • 4
    Files need to be the same size and code or the option will be greyed out. – Ashley Nov 19 '16 at 17:03
14

VLC on Windows (1.1.10 or later):

  • Tools → Preferences
  • Show Settings → All
  • Click Advanced (Click Playlist for VLC 2.1.5)
  • Uncheck "Allow only one running instance"
  • Uncheck "Use only one instance when started from file manager"

VLC on OS X does not provide the same set of options. You can however run multiple instances from the Terminal with open -a VLC.

live-love
  • 133
  • 5
Kiran
  • 220
  • 2
  • 2
10

GridPlayer can play any number of videos simultaneously. You can play, stop, seek all of them or each video separately. You can set loops. You can also control playback rate, sound volume, zoo, etc.

Full disclosure: I am the author :)

enter image description here

vzhd1701
  • 116
  • 1
  • 3
  • 3
    I know this is a very late answer so it doesn't have much upvotes, but this really needs to be more visible. Tried it out, it's the least hassle way to do it. I know of Awesome Video Player, but this one is free and open-source. Depending on your machine, you may get some framerate hiccups if you're playing too many full HD videos at once, but that's about the only limitation I can see. – Anomalous Underdog Nov 27 '21 at 13:13
  • I have used Gridplayer on an Intel Mac and it was awesome. On an M1 Mac, opening fails with a notice that Gridplayer is damaged and should be put in the bin. Downloaded twice. Not a security issue as I right-clicked on Gridplayer to open it and have an exception. Too bad! – Foliovision Feb 06 '22 at 21:54
  • @Foliovision Have you tried the [workaround](https://github.com/vzhd1701/gridplayer#macos-gridplayer-is-damaged-and-cant-be-opened)? – vzhd1701 Feb 08 '22 at 06:08
  • Thanks @vzhd1701 This exact command did work to make Gridplayer open. There's still long spinning beachballs waiting for Gridplayer to finish opening. I'm also having an issue with video rotation (my upside down videos are playing sideways) but that's probably not related to the M1 issues – there don't seem to be any rotation controls even if there are aspect ratio controls. – Foliovision Feb 16 '22 at 15:20
  • Definitely recommend this application, it works exactly how I wanted it to. I did a bunch of video transcoding and wanted to play the videos side by side to see if there was any noticeable quality drop, this was exactly what I needed and would recommend it for anyone with the same issue. – 97WaterPolo Jan 04 '23 at 22:44
5

google probably already told you, you could buy a couple proprietary software who could do that, but just in case : videocompare, tmpgenc, vidlord...

This one's free : http://forum.doom9.org/showthread.php?t=138430

(working download links at the end of the thread)

Untested because my wine setup is completely screwed right now. It doesn't do side by side but stacked playback (unless you have a very good lcd you won't be seeing the same thing by playing the same vid in two opposite corners of the screen anyway)

If you think you really need side by side you can use avisynth to do what zimmer said.

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

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

You don't need to do an encode (wich would add its own encoding artifacts anyway), just make a project that would produce an encode of the two vids playing together and skip through the file.

user36755
  • 66
  • 1
5

After doing what Kiran said, open all your videos and run the following AutoHotKey script

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%
    }
}

This script sends your keystrokes to all running instances of VLC media player. It doesn't work if you use a mouse.

These things should work:

  • forward: Ctrl + right / Alt + right / Shift + right
  • backward: Ctrl + left / Alt + left / Shift + left
  • play/pause: space
  • speed up: ]
  • speed down: [

You can easily add in other keystrokes below the line: ~^down::LoopControlSend(Windows, "^{down}")

This doesn't sync the videos perfectly, so you can use the following 4 keys: left, right, up, down to control the active window only.

  • left very short backward jump
  • right very short forward jump
  • up medium backward jump
  • down medium forward jump

If you prefer choosing the programs manually, use the following code instead

;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%
    }
}
user52874
  • 151
  • 1
  • 3
  • Holy cow AHK is amazing. How about this....lets say I have 14 VLC instances running oacross two broswers....is there a script that can tile all the videos across both browsers (so basically, look at # videos per screen, screen resolution, and tile them in some intelligent way)? – tbone Sep 08 '18 at 06:52
3

I have the same problem but I have not seen any satisfactory solutions online so far (and believe me I had done a thorough search). At last I come up with my own solution that do not require any extra $. Although this is an old question, I hope my workaround will still be useful.

First, in VLC player, go to Tools->Preferences. Make sure to unchecked 'Allow only one running instance' and 'Pause on the last frame of a video'.

Then, type/edit the following commands in a text file. Open a windows command prompt, and run the commands by copy-and-paste (or save the text and run it as a batch file):

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%

This will open up three VLC instances, each with one of the three videos and all playing in a very synchronized fashion, at least to your eye. However, the three instances will be overlapping each other initially. You will need to click on the title bar of each of the instance to move them around without interrupting the playback so that you can see them playing side-by-side on your screen. This is rather annoying but I consider it a very small inconvenience.

I have tried but it is not possible to control all the instances with hotkeys for stop, forward, backward etc. However, the option '--repeat' will put the videos in a loop, so you can just wait for them to start over.

For very long videos, it may be best to merge the videos in a side-by-side composition into one video using e.g. ffmpeg: https://ffmpeg.org/pipermail/ffmpeg-user/2013-June/015662.html and http://ffmpeg.org/pipermail/ffmpeg-user/2013-June/015712.html This command only describes how to merge two videos, but I believe (i.e. I have not test it) you can run the command multiple times to incorporate multiple video files.

wtong
  • 77
  • 2
2

Awesome Video Player can do this with up to 16 videos (paid) or up to 4 videos (free).

You can easily play/pause and seek all videos simultaneously with Space and with the arrow keys.
Additionally you can use keyboard shortcuts to control individual videos.

I am not affiliated with AVP, just a user.

Saaru Lindestøkke
  • 5,515
  • 8
  • 30
  • 48
1

I image you can use an AutoHotKey script to send a "Play" shortcut to all three players in a very short amount of time.

Whether they are able to start playing at exactly the same time is a different matter. Even if they are able to start straight away, I imagine there will be some fighting for the hard drive. Might want to make a RAM disk if this is an important evaluation.

ta.speot.is
  • 14,205
  • 3
  • 33
  • 48
0

Many players will be able to output a picture of a single frame in the video.

You could choose multiple points in your videos to compare different types of image (clouds, smoke, trees, grass, motion are good for encoding comparisons) and take the same frames from each of your videos.

You can then make comparisons on a static image rather than trying to spot differences in motion. You can compare on a pixel by pixel basis if you want.

Ensure you don't use JPG as the output though as this is a lossy format and will introduce its own artefacts.

Shevek
  • 16,502
  • 7
  • 46
  • 75
  • 2
    You're missing the point: I need a player capable of displaying more than 1 video. – Grumpy ol' Bear May 10 '10 at 15:26
  • 3
    @NoCanDo: I understand that, this is just an alternative option for you to compare video encoding results should you not find a suitable answer. – Shevek May 10 '10 at 16:00
0

If this is not something you do very often, I would use a video editing software like vegas to build one video with all of them showing.

Youtube video example of how to do that.

zimmer62
  • 1,601
  • 2
  • 17
  • 22
0

When comparing video quality, it helps to have the videos split, so that you can see the difference in pixel quality.

  1. Vivict offered a great way to compare videos split in this manner, especially because of how you can use the mouse to move the splitter line. However, the project is limited to two simultaneous videos and it doesn't support some formats.
  2. ffplay can be used to place videos side by side.
  3. Since the above two had limitations, I wrote a program which allows you to add as many videos as you like, and has options to change the axis and video positions. See the splitVideoQualityViewer project.

enter image description here
enter image description here

Nav
  • 1,049
  • 3
  • 14
  • 28