Découper les vidéos enregistrées avec la Freebox

Comment manipuler les enregistrements effectuées avec la Freebox, quand on souhaite par exemple supprimer les publicités ou découper un enrigstrement en plusieurs parties.

Le principal problème vient des formats d'enregistrements utilisés par la Freebox. Les formats ts ou m2ts sont des conteneurs multimedia un peu particuliers pensés avant tout pour la diffusion réseau, et donc pour assurer la synchronisation son/image en compensant d'éventuelles pertes ou erreurs lors de la transmission (enfin c'est ce que j'ai compris ; je ne suis pas spécialiste des formats multimedia). D'où leur utilisation pour la diffusion de la télévision numérique.

Les fichiers utilisant ces formats sont aussi particuliers par le fait qu'il est très difficile de les manipuler ; en l'occurrence, pour ce qui nous concerne ici, de les découper. J'ai utilisé pendant longtemps le logiciel Avidemux pour éditer les fichiers, associé à ProjectX pour assurer la synchronisation audio/vidéo. Malheureusement, Avidemux ne gère pas très bien le format vidéo haute définition H.264 dorénavant utilisé par la Freebox, et ProjectX pas du tout.

Finalement, après avoir essayé - sans succès - tout un tas de solutions à base de mencoder et autre tsMuxer, je suis revenu aux basiques, à savoir la commande unix dd, car le but ici est simplement de découper un fichier, pas de réencoder les pistes audio et/ou vidéos. La commande s'utilisera comme suit :

dd bs=<block_size> if=<input_file> of=<output_file> count=<n_b> skip=<n_e>
Utilisation de la commande dd.

Les paramètres input_file et output_file sont respectivement le nom du fichier vidéo enregistré par la Freebox à traiter et le nom du fichier vidéo portant la séquence que l'on souhaite extraire. Il nous reste donc à calculer les 3 autres paramètres :

  • block_size : la taille en octets des blocs à couper.
  • n_b : le nombre de blocs à copier.
  • n_e : le nombre de blocs à ignorer en début de fichier.

Les fichiers ts ou m2ts transportent des paquets de données de 188 octets ; la norme DVB utilisée en Europe pour la diffusion de la télévision numérique peut en outre définir des paquets de 204 octets, les octets supplémentaires portant des informations de corrections pour d'éventuelles erreurs. C'est l'une de ces 2 tailles que nous utiliseront comme valeur block_size.

block_size = 188

Il nous ensuite évaluer le temps que représente une quantité n de blocs de 188 octets - disons un million :

dd bs=188 if=<input_file> of=<output_file> count=1000000
Evaluation de la durée de 1.000.000 de blocs d'un fichier ts.

Cette commande va générer un fichier vidéo dont la durée est variable. A titre d'information, j'ai découpé des fichiers où le million de blocs faisait 12min 30s, d'autres où il faisait 13min 13s, voire 15min 23s. On obtient ainsi la valeur pps ou « paquets par seconde ».

Une fois cette « calibration » effectuée, il ne reste plus qu'à jouer le fichier à traiter avec un lecteur vidéo (VLC par exemple) et à noter les temps de début (tstart) et de fin (tend) de chaque passage que l'on souhaite récupérer ; une simple règle de trois permet de convertir ces valeurs en quantité de blocs d'octets et donc de découper le fichier. On peut ainsi calculer les derniers paramètres de la commande dd :

  • n_b = (tend - tsart) * pps
  • n_e = tstart * pps