web-dev-qa-db-fra.com

Comment lire plusieurs vidéos côte à côte synchronisées?

J'ai 3 vidéos, toutes les 3 ont le même temps, le même nombre d'images, et elles ne diffèrent que par la qualité de l'encodage.

Maintenant, j'ai besoin qu'ils fonctionnent côte à côte de manière synchronisée à des fins d'évaluation. Cela signifie quand j'appuie sur "play" BOTH! les vidéos devraient commencer. Analogiquement pour stopper, avancer, reculer.

Quelqu'un sait-il un joueur capable de faire ça? J'entends par là jouer plus d'une vidéo côte à côte ...

Plate-forme: Win7

35
Grumpy ol' Bear

VLC sous Windows (1.1.10 ou ultérieur):

  • Outils → Préférences
  • Afficher les paramètres → Tout
  • Cliquez sur Advanced (cliquez sur Playlist pour VLC 2.1.5)
  • Décochez "Autoriser une seule instance en cours d'exécution"
  • Décochez la case "Une instance au démarrage du fichier"

VLC sur OS X ne fournit pas le même ensemble d'options. Vous pouvez cependant exécuter plusieurs instances à partir du terminal avec open -a VLC.

10
Kiran

Si quelqu'un est toujours intéressé par cela, la version actuelle de VLC est capable de le faire très bien sans script ou add-on. Pour autant que je sache, vous ne pouvez lire que deux fichiers simultanément, pas 3.

  1. Pour ce faire, ouvrez simplement VLC et sélectionnez Média> Ouvrir plusieurs fichiers .
  2. Dans les fenêtres de fichiers multiples, sélectionnez Ajouter pour ajouter le premier fichier.
  3. Après cela, cliquez sur la case " Afficher plus d'options ", suivie de la touche " Lire un autre support de manière synchrone , "case à cocher en bas de la fenêtre.
  4. Sélectionnez parcourir à côté de " Extra media " pour ajouter le deuxième fichier.
  5. Appuyez sur Lecture et les deux fichiers multimédias seront lus simultanément avec une seule fenêtre de contrôle.
29
Tim L

Bino est un lecteur multimédia multiplate-forme généralement recommandé pour la lecture de fichiers stéréoscopiques. Entre autres fonctionnalités, il prend en charge la lecture synchronisée de plusieurs flux.

L’interface peut sembler un peu primitive ou déroutante au début, mais tout ce que vous avez à faire est

  1. Faites glisser vos deux fichiers vidéo dans Bino
  2. Sélectionnez "Séparer les flux, en commençant par la gauche" option d'entrée et "Option de sortie gauche/droite"

Voilà, vous avez la lecture synchronisée. Le type dans lequel un seul jeu de commandes de lecture est utilisé pour tous les flux, de sorte que vous n’ayez pas à "Investir dans des haltères et vous entraîner à cliquer très rapidement" comme @ta .speot.is suggère.

En prime, il prend en charge le rendu 3D d'anaglyphe.

17
o.v.

Après avoir suivi les instructions de Kiran, ouvrez toutes vos vidéos et exécutez le script AutoHotKey suivant.

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

Ce script envoie vos frappes sur toutes les instances de VLC Media Player en cours d’exécution. Cela ne fonctionne pas si vous utilisez une souris.

Ces choses devraient fonctionner:

  • transférer: Ctrl + right / Alt + right / Shift + right
  • en arrière: Ctrl + left / Alt + left / Shift + left
  • lecture/pause: space
  • accélérer: ]
  • vitesse réduite: [

Vous pouvez facilement ajouter d'autres touches au-dessous de la ligne: ~^down::LoopControlSend(Windows, "^{down}")

Cela ne synchronise pas parfaitement les vidéos, vous pouvez donc utiliser les 4 touches suivantes: left, right, up, down pour contrôler la fenêtre active uniquement .

  • left saut très court en arrière
  • right saut très court en avant
  • up saut en arrière moyen
  • down saut moyen en avant

Si vous préférez choisir les programmes manuellement, utilisez plutôt le code suivant

;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%
    }
}
4
user52874

Vous pouvez le faire avec mpv si cela ne vous dérange pas d'utiliser la ligne de commande:

3 vidéos côte à côte (empilées horizontalement)

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 vidéos

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

Remarques

  • Sous Windows, utilisez ; pour séparer chaque nom de fichier en --external-files (comme indiqué dans l'exemple 3 videos ). Sous Linux et macOS, utilisez :. Vous pouvez également utiliser deux instances de --external-file, telles que: --external-file=input2.mkv --external-file=input3.mkv.

  • Les fichiers doivent tous avoir la même hauteur. Si ce n'est pas le cas, ajoutez les filtres d'échelle, de tampon et/ou de rognage. Voir la documentation mpv et Filtres FFmpeg pour plus d'informations.

4
llogan

google vous a probablement déjà dit, vous pourriez acheter un logiciel propriétaire qui pourrait le faire, mais juste au cas où: vidéocompare, tmpgenc, vidlord ...

Celui-ci est gratuit: http://forum.Doom9.org/showthread.php?t=138430

(liens de téléchargement de travail à la fin du fil)

Non testé car mon vin est complètement foutu en ce moment. Il ne fait pas la lecture côte à côte mais empilée (à moins que vous n'ayez un très bon écran LCD, vous ne verrez pas la même chose en lisant la même vidéo dans les deux coins opposés de l'écran).

Si vous pensez avoir vraiment besoin d’être côte à côte, vous pouvez utiliser avisynth pour faire ce que dit Zimmer.

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

(référence forum.Doom9.org/showthread.php?t=139769)

Vous n'avez pas besoin de faire un encodage (qui ajouterait de toute façon ses propres artefacts d'encodage), mais de créer un projet qui produirait un encodage des deux disques joués en même temps et ignorant le fichier.

3
user36755

J'ai le même problème mais je n'ai pas encore vu de solution satisfaisante en ligne (et croyez-moi, j'ai effectué une recherche approfondie). Enfin, je propose ma propre solution, qui ne nécessite pas de frais supplémentaires. Bien que cette question soit ancienne, j'espère que ma solution de contournement sera toujours utile.

Tout d’abord, dans VLC Player, allez dans Outils-> Préférences. Assurez-vous de décocher "Autoriser une seule instance en cours d'exécution" et "Suspendre sur la dernière image d'une vidéo".

Ensuite, tapez/modifiez les commandes suivantes dans un fichier texte. Ouvrez une invite de commande Windows et exécutez les commandes par copier-coller (ou enregistrez le texte et exécutez-le en tant que fichier de traitement par lots):

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%

Cela ouvrira trois instances de VLC, chacune avec l'une des trois vidéos et jouant toutes de manière très synchronisée, au moins à vos yeux. Cependant, les trois instances se chevaucheront initialement. Vous devrez cliquer sur la barre de titre de chaque instance pour les déplacer sans interrompre la lecture afin de pouvoir les voir jouer côte à côte sur votre écran. C’est plutôt agaçant, mais j’estime qu’il s’agit d’un très petit inconvénient.

J'ai essayé, mais il n'est pas possible de contrôler toutes les instances avec des raccourcis clavier pour arrêter, avancer, reculer, etc. Cependant, l'option '--repeat' mettra les vidéos en boucle, vous pouvez donc attendre qu'elles recommencent. .

Pour de très longues vidéos, il peut être préférable de fusionner les vidéos d’une composition côte à côte en une seule vidéo, en utilisant par exemple une vidéo. ffmpeg: https://ffmpeg.org/pipermail/ffmpeg-user/2013-June/015662.html et http://ffmpeg.org/pipermail/ffmpeg-user/2013-June/015712.html Cette commande décrit uniquement comment fusionner deux vidéos, mais je crois (c’est-à-dire que je n’ai pas testé vous pouvez exécuter la commande plusieurs fois pour incorporer plusieurs fichiers vidéo.

3
wtong

Je pense que vous pouvez utiliser un script AutoHotKey pour envoyer un raccourci "Lecture" aux trois joueurs en très peu de temps.

Qu'ils soient capables de commencer à jouer exactement au même moment est une autre affaire. Même s’ils sont capables de commencer tout de suite, j’imagine qu’il faudra se battre pour le disque dur. Vous voudrez peut-être créer un disque RAM s'il s'agit d'une évaluation importante.

1
ta.speot.is