59 votes

Comment lire plusieurs vidéos côte à côte de manière synchronisée ?

J'ai 3 vidéos, toutes les 3 ont la même durée, le même nombre d'images, et elles ne diffèrent qu'en termes de qualité d'encodage.

J'ai maintenant besoin qu'ils fonctionnent côte à côte de manière synchronisée à des fins d'évaluation. Autrement dit, lorsque j'appuie sur "play", les DEUX vidéos doivent démarrer. De même pour arrêter, avancer et reculer.

Quelqu'un connaît-il un joueur capable de faire ça ? J'entends par là la lecture de plus d'une vidéo côte à côte...

Plate-forme : Win7

48voto

Tim L Points 669

Si quelqu'un est toujours intéressé par ce sujet, la version actuelle de VLC est capable de faire cela très bien sans aucune sorte de script ou d'add-on. Cependant, pour autant que je sache, vous ne pouvez lire que deux fichiers en synchronisation, pas 3.

  1. Pour cela, il suffit d'ouvrir VLC et de sélectionner Média>Ouvrir plusieurs fichiers .
  2. Dans la fenêtre des fichiers multiples, sélectionnez "Ajouter" pour ajouter le premier fichier.
  3. Après cela, cliquez sur l'icône " Afficher d'autres options suivi de la case à cocher " Lecture synchrone d'un autre média La case à cocher "," au bas de la fenêtre.
  4. Sélectionnez browse à côté de, " Extra média ," pour ajouter le deuxième fichier.
  5. Cliquez sur lecture et les deux fichiers multimédias seront lus simultanément dans une seule fenêtre de contrôle.

28voto

llogan Points 50040

Vous pouvez le faire avec mpv si vous n'avez pas peur 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

Notes

  • Sous Windows, utilisez ; pour séparer chaque nom de fichier dans --external-files (comme indiqué dans le 3 vidéos exemple). Sous Linux et macOS, utilisez : . Vous pouvez également utiliser deux instances de --external-file à la place, comme par exemple : --external-file=input2.mkv --external-file=input3.mkv .

  • Les fichiers doivent tous être de la même hauteur. S'ils ne le sont pas, ajoutez les filtres d'échelle, de remplissage et/ou de recadrage. Voir le documentation mpv y Filtres FFmpeg pour plus d'informations.

19voto

Oleg Points 593

Bino est un lecteur multimédia multiplateforme 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 premier abord, mais il vous suffit de

  1. Faites glisser vos deux fichiers vidéo dans Bino
  2. Sélectionnez "Ruisseaux séparés, la gauche en premier" option de saisie et "Gauche/droite" option de sortie

Voilà, vous avez une lecture synchronisée. Le genre où un seul jeu de commandes de lecture est utilisé pour tous les flux, de sorte que vous ne devez pas "Investissez dans des poids pour les doigts et entraînez-vous à cliquer très rapidement". comme le suggère @ta.speot.is.

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

16voto

Kiran Points 216

VLC sur Windows (1.1.10 ou plus) :

  • Outils → Préférences
  • Afficher les paramètres → Tous
  • Cliquez sur Avancé (Cliquez Liste de lecture pour VLC 2.1.5)
  • Décochez "Autoriser une seule instance en fonctionnement".
  • Décochez "Utiliser une seule instance lors du démarrage depuis le gestionnaire de fichiers".

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 .

5voto

user52874 Points 151

Après avoir fait ce que Kiran a dit, ouvrez toutes vos vidéos et exécutez l'AutoHotKey script 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 de touches à toutes les instances en cours du lecteur multimédia VLC. Cela ne fonctionne pas si vous utilisez une souris.

Ces choses devraient fonctionner :

  • en avant : Ctrl + right / Alt + right / Shift + right
  • à l'envers : Ctrl + left / Alt + left / Shift + left
  • lecture/pause : space
  • accélérer : ]
  • vitesse réduite : [

Vous pouvez facilement ajouter d'autres frappes sous la ligne : ~^down::LoopControlSend(Windows, "^{down}")

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

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

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X