Génération des fichiers *.toc pour Cinelerra

14 05 2009

Si vous utilisez Cinelerra pour monter des vidéos HD, ce script va vous intéresser.

Cinelerra est un logiciel de montage vidéo sous Linux. C’est ce qui se fait de plus complet et de plus utilisable sous Linux (avis forcément subjectif de ma part).

Le problème

En SD, les sources sont généralement des fichiers DV. Cinelerra les lit et les intègre très rapidement car l’accès à chaque image de chaque vidéo se fait instantanément. C’est dû au fait que les images des vidéos DV sont compressées individuellement.

En HD, les sources sont généralement des fichiers M2T (du Mpeg2). Cinelerra doit d’abord les indexer avant de pouvoir les utiliser car les images sont compressées par paquet et accéder à une image peut nécessiter de décompresser plusieurs images avant elle.

Il y a 2 problèmes :

  • Cinelerra indexe les vidéos l’une après l’autre, quel que soit le nombre de cœeurs disponibles sur votre machine,
  • Cinelerra se bloque de façon régulière sur une indexation ou l’autre, vous obligeant à fermer brutalement Cinelerra puis à le relancer pour refaire la manipulation.

Pré-requis

Vous devez disposer de la commande mpeg3toc fournit par libmpeg3. L’installation de Cinelerra sous Ubuntu étant ce qu’elle est, vous aurez probablement le choix entre plusieurs solutions :

  • libmpeg3-1 + mpeg3-utils
  • libmpeg3cv
  • autre ?

Chez moi, c’est libmpeg3cv qui est utilisé.

Le script nécessite le paquet php5-cli.

La solution

Le script PHP fourni ci-après s’utilise comme suit :

gentoc *.m2t

La commande accepte un ou plusieurs fichiers en paramètres. Elle est prévue pour fonctionner sur un quad-core. Pour changer le nombre de cœurs utilisés, il suffit de remplacer l’argument 4 de l’appel à la procédure pool_execute par le nombre de cœurs.

Fonctionnement

Cinelerra recherche les indexs des vidéos dans le répertoire .bcast de l’utilisateur (~/.bcast/).

Les noms de fichiers d’index sont construits comme suit :

  • récupérer le chemin absolu vers la vidéo,
  • remplacer les / et les . par des _ (underscore),
  • ajouter l’extension .toc.

Le code source

#!/usr/bin/php
<?php
function pool_execute($commandes,$nb_max_process) {
  // Initialise le pool de processus
  $pool=array();
  for($i=0;$i<$nb_max_process;$i++) {
    $pool[$i]=FALSE;
  }

  // Exécute toutes les commandes
  while(count($commandes)>0) {
    $commande=array_shift($commandes);

    // Essaie de lancer une commande
    $commande_lancee=FALSE;
    while($commande_lancee==FALSE) {
      usleep(50000);

      // Recherche une entrée libre dans le pool
      for($i=0;$i<$nb_max_process and $commande_lancee==FALSE;$i++) {
        // Teste si l'entrée a déjà été utilisée
        if($pool[$i]===FALSE) {
          $pool[$i]=proc_open($commande,array(),$foo);
          echo $commande."\n";
          $commande_lancee=TRUE;
        } else {
          // Teste si l'entrée pointe sur un process terminée
          $etat=proc_get_status($pool[$i]);
          if($etat['running']==FALSE) {
            proc_close($pool[$i]);
            $pool[$i]=proc_open($commande,array(),$foo);
            echo $commande."\n";
            $commande_lancee=TRUE;
          }
        }
      }
    }
  }
}

$fichiers=$argv;
array_shift($fichiers);
$commandes=array();
foreach($fichiers as $fichier) {
  $entree=$fichier;
  $complet=getcwd().'/'.$entree;
  $nomtoc=str_replace('/','_',$complet);
  $nomtoc=str_replace('.','_',$nomtoc);
  $nomtoc=substr($nomtoc,1).'.toc';

  $commandes[]='mpeg3toc '.escapeshellarg($complet).' ~/.bcast/'.escapeshellarg($nomtoc);
}

pool_execute($commandes,4);

Actions

Information

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s




%d blogueurs aiment cette page :