URL: https://linuxfr.org/users/mac_is_mac/journaux/edition-simple-de-fichiers-ts-sous-linux
Title: Edition simple de fichiers TS sous Linux
Authors: mac_is_mac
Date: 2014-11-01T11:32:11+01:00
License: CC By-SA
Tags: enregistrement, tv, mplayer, tnt, dvb et publicité
Score: 12
Je présente ici des petits scripts très simples permettant de découper des fichiers d'enregistrement TV, par exemple pour enlever la publicité.
Il existe des outils complexes permettant de faire cela (avidemux,pitivi,openshot,dvbcut), mais ils ont des lourdeurs et des limitations.
Par exemple, dvbcut est limité aux flux SD, et ni lui ni avidemux ne savent gérer les sous-titres.
Ici, on va couper les fichiers à la hache, sans essayer de comprendre le contenu. Le fichier est divisé en bloc de 100000 octets; le principe est de couper les morceaux qui nous intéressent.
L'inconvénient est qu'on a des coupures pas très nettes, l'avantage est qu'on est sûr qu'on ne perd rien.
Commençons par deux scripts basiques: coupebout et regardebout.
Le premier permet d'extraire un morceau de vidéo, le second montre quelques secondes à une position donnée.
coupebout fichier_depart bloc_debut bloc_fin fichier_de_sortie
````bash
#!/bin/sh
# coupebout
entree=$1
taille=$2
fin=$3<
sortie=$4
c=$((fin - taille + 1))
echo $c
dd if=$entree of=$sortie ibs=100000 skip=$taille count=$c
````
regardebout fichier_depart bloc_debut
regardebout fichier_depart bloc_debut nombre_de_blocs
Par défaut, on affiche 30 blocs.
````bash
#!/bin/sh
# regardebout
entree=$1
position=$2
if [ $3 -gt 0 ];
then
longueur=$3
else
longueur=30
fi
dd if=$entree ibs=100000 skip=$position count=$longueur | mplayer -
````
Le deuxième script nécessite d'avoir installé mplayer
Le dernier script, resume-film, est le plus complexe. Il fabrique un fichier avi formé d'images du film numérotées, prises à intervalles régulier.
Par défaut, l'intervalle est de 512 blocs. Par dichotomie, on peut alors trouver assez rapidement l'endroit de la coupure. On peut affiner avec regardebout.
resume-film fichier_depart
resume-film fichier_depart ecart
resume-film fichier_depart ecart bloc_depart bloc_fin
````bash
#!/bin/bash
# resume-film
nom=$1
if [ "$2" == "" ]; then
ecart=512
else
ecart=$2
fi
if [ "$4" == "" ]; then
taille=`stat -c "%s" $nom`
fin=$((taille / 100000 - ecart / 2 ))
debut=0
else
debut=$3
fin=$4
fi
#j'écris hors code une ligne qui apparaît sous une forme étrange quand elle est dans le code:
````
base=$(basename ${nom} .ts)
````bash
repertoire=`mktemp -d /tmp/$nom.XXXXXX`
longueur=${#fin}
for i in `seq $debut $ecart $fin`
do
dd if=$nom ibs=100000 skip=$i count=50 | mplayer -nosound -frames 1 -vo png:z=9:outdir=$repertoire -
longueurb=${#i}
ii=$i
for q in `seq $longueurb $longueur`
do
ii="0"$ii
done
convert $repertoire/00000001.png -pointsize 50 -fill red -draw "text 70,70 '$i'" -resize 600 $repertoire/thumb-$ii.png
done
mencoder mf://$repertoire/thumb-*.png -mf type=png:fps=4 -ovc lavc -lavcopts vcodec=mpeg4 -oac copy -o $base-resume-$debut-$ecart-$fin.avi
rm -f $repertoire/thumb-*.png
rm -f $repertoire/00000001.png
rmdir $repertoire
````
Pour que le script fonctionne, il faut avoir installé mplayer, mencoder et imagemagick.
A la fin, on peut simplement concaténer les fichiers avec
cat bout1.ts bout2.ts bout3.ts > film.ts