Sony α55, vidéos MTS et Cinelerra

12 12 2010

Heureux possesseur d’un α55, j’ai eu des petits soucis pour pouvoir utiliser les vidéos qu’il produit sous Cinelerra (Ubuntu/Linux). Après quelques prises de tête, voici le résultat de mes recherches.

Les vidéos de l’α55

Si on en croit la documentation, l’α55 génère des vidéos Full HD 1080i50 (pour les Sony vendus en Europe) au format AVCHD. Pour plus d’info sur l’entrelacement, Wikipédia est votre ami.

Oui mais voilà…

Les vidéos ne sont absolument pas entrelacées !

Physiquement, l’α55 capture du Full HD 1080p25 (pour progressif à 25 images/secondes) et enregistre le tout dans un format entrelacé.

Grossièrement, il crée une vidéo à 50 images secondes, mais indique que chaque image est dupliquée. Le format AVCHD supportant cette astuce, cela ne consomme pas plus de bande passante.

Par contre, si vous faites une avance image par image des vidéos ainsi produites, vous constaterez la duplication.

Cinelerra

Et Cinelerra dans tout ça ? Il ne lit malheureusement pas les fichiers AVCHD (MTS).

De plus, même s’il pouvait ouvrir ces fichiers, travailler à 50 images/secondes en Full HD nécessite une configuration plutôt musclée.

Il faut donc procéder à une conversion. Et c’est là qu’on commence à s’amuser…

Façon rapide

Pour réaliser la conversion, ffmpeg est bien pratique :

ffmpeg -i fichier.MTS \
       -r 25 \
       -ar 48000 -ab 256000 -ac 2 \
       -qscale 2 \
       fichier.mpg

Explications :

  • -i fichier.MTS : fichier en entrée, à convertir,
  • -r 25 : indique à ffmpeg que la fréquence d’images en sortie doit être de 25 images/secondes et non 50 comme il l’aurait détecté à l’ouverture de fichier.MTS ; par défaut, il va ignorer une image sur deux ; mettre -r 29.97 si vous disposez d’un boitier NTSC,
  • -ar 48000 -ab 256000 -ac 2 : si on le laisse faire, ffmpeg déterminera un niveau de qualité qui va dégrader le son ; on force donc une fréquence d’échantillonnage de 48 KHz, un encodage à 256 kbps et deux canaux pour la stéréo,
  • -qscale 2 : indique le niveau de quantisation pour l’encodage de la vidéo, un quantisation à 2 conserve une excellente qualité lors de la conversion, ce dont nous avons besoin puisque nous voulons faire du montage !
  • fichier.mpg : fichier en sortie, ffmpeg se base sur l’extension pour déterminer les codecs utilisés.

Note : la ligne de commande a été mise sur plusieurs lignes pour faciliter sa lecture. Vous pouvez bien sûr la faire tenir sur une seule ligne en retirant les anti-slash (\).

Par défaut ffmpeg va générer un fichier MPEG avec la vidéo en MPEG1 et le son en MPEG1 layer 2 (ou mp2).

Voilà, une ligne de commande assez simple pour convertir une vidéo, que demande le peuple ?

Malheureusement…

Façon moins rapide mais plus fiable

Le titre pourrait laisser penser que ffmpeg n’est pas fiable. Loin de là !

Le gros problème se situe au niveau des vidéos produites par l’α55. Il arrive que certaines soit mal encodées ce qui va poser des problèmes à ffmpeg et générer une espèce de bouillie infâme où l’on reconnaîtra tout juste ce que l’on a filmé.

Il faut donc une autre méthode pour réaliser la conversion.

Je dois avouer que j’y ai passé quelques heures car il y a pas mal d’outils disponibles sous Ubuntu (mencoder, mplayer, ffmpeg, vlc, avidemux, mpeg2enc, mjpegtools etc.) et chacun de ces outils dispose bien souvent de nombreuses options de configuration ce qui multiplie d’autant les possibilités.

La méthode doit avoir deux avantages :

  • pouvoir lire des vidéos abîmées (comme la plupart des lecteurs comme mplayer ou vlc),
  • pouvoir convertir le flux vidéo en se basant au minimum sur ses caractéristiques (car le flux est abîmé, je le rappelle).

Non contente d’être moins rapide, la solution à laquelle j’ai abouti est aussi moins simple.

Pour résumer, je passe par un flux intermédiaire au format YUV4MPEG. Ce flux ne contenant pas l’audio, le script doit également réaliser l’extraction de l’audio de la vidéo originale et le rajouter à la vidéo finale.

Voici donc le script mts2mpg.sh :

#!/bin/sh
input="$1"
output="$2"
videofifo=stream.$$.fifo
audio=stream.$$.wav

# Nettoyage des fichiers et piles temporaires
rm -f $audio $videofifo

# Extraction de l’audio
echo "Extraction de l’audio"
mplayer -really-quiet \
        -noconfig all \
        -novideo -vo null \
        -ao pcm:file=$audio:fast \
        "$input"

# Extraction de la vidéo
echo "Extraction de la vidéo"
mkfifo $videofifo
ffmpeg -f yuv4mpegpipe \
       -r 25 \
       -i $videofifo \
       -y \
       -qscale 2 \
       -ar 48000 -ab 256000 -ac 2 \
       -i $audio \
       "$output" &
mplayer -noconfig all \
        -nosound -ao null \
        "$input" \
        -vf harddup \
        -vo yuv4mpeg:file=$videofifo

wait $!

# Nettoyage des fichiers et piles temporaires
rm $audio $videofifo
echo "Terminé !"

Explications :

  • videofifo=stream.$$.fifo / mkfifo $videofifo : le script nécessite l’utilsation d’un tube nommé (named pipe) pour pouvoir faire communiquer mplayer et ffmpeg ; le $$ permet de générer un tube nommé pour le processus en court autorisant ainsi plusieurs exécutions parallèles du script,
  • audio=stream.$$.wav : l’audio sera extrait dans un fichier temporaire au format WAV avec la même astuce sur le $$ que pour $videofifo,
  • rm -f $audio $video : supprime tout fichier ou pile temporaire existant au cas où le script aurait été interrompu au beau milieu d’une conversion, l’option -f permet de supprimer le message d’erreur apparaissant quand ces fichiers n’existent pas (ce qui devrait être la plupart du temps le cas),
  • mplayer, extraction de l’audio
    • -really-quiet : supprime tous les messages
    • -noconfig all : ignore tous les fichiers de configuration de mplayer car ils pourraient interférer avec nos options,
    • -novideo -vo null : ignore complètement le flux vidéo,
    • -ao pcm:file=$audio:fast : extrait l’audio au format WAV aussi vite que possible (fast)
  • mkfifo $videofifo : crée le tube nommé nécessaire à la communication entre mplayer et ffmpeg
  • ffmpeg, encodage de la vidéo :
    • -f yuv4mpegpipe : indique à ffmpeg que le format du fichier d’entrée est un tube fournissant un flux au format YUV4MPEG,
    • -r 25 : la fréquence d’images en sortie doit être de 25 images/secondes et non 50 (une image sur deux sera ignoré) ; mettre -r 29.97 si vous disposez d’un boitier NTSC,
    • -i $videofifo : spécifie le chemin vers le tube nommé,
    • -y : par défaut, ffmpeg demande confirmation avant l’écrasement de tout fichier, avec l’option -y ffmpeg ne demandera plus confirmation,
    • -qscale 2 : indique le niveau de quantisation pour l’encodage de la vidéo, un quantisation à 2 conserve une excellente qualité lors de la conversion, ce dont nous avons besoin puisque nous voulons faire du montage !
    • -ar 48000 -ab 256000 -ac 2 :si on le laisse faire, ffmpeg déterminera un niveau de qualité qui va dégrader le son ; on force donc une fréquence d’échantillonnage de 48 KHz, un encodage à 256 kbps et deux canaux pour la stéréo,
    • -i $audio : quand on fournit en entrée un fichier vidéo et un fichier son, ffmpeg réalise automatiquement le multiplexage des deux fichiers ; on indique ici le fichier audio précédemment extrait,
    • & : lance ffmpeg en tâche de fond, il va ainsi atteindre qu’on lui fournisse un flux sur le tube nommé.
  • mplayer, décodage de la vidéo :
    • -noconfig all : ignore tous les fichiers de configuration de mplayer car ils pourraient interférer avec nos options,
    • -nosound -ao null : ignore complètement le son car YUV4MPEG ne peut pas le contenir,
    • « $input » : fichier vidéo à lire,
    • -vf harddup : pour toutes les images indiquées comme dupliquées, mplayer générera deux images physiques,
    • -vo yuv4mpeg:file=$videofifo : génère un flux vidéo au format YUV4MPEG en utilisant le tube nommé en sortie.
  • wait $! : attend que ffmpeg ait complètement fini d’encoder la vidéo avant de supprimer les fichiers temporaires ($! contient le PID du dernier processus lancé en tâche de fond).

Par défaut ffmpeg va générer un fichier MPEG avec la vidéo en MPEG1 et le son en MPEG1 layer 2 (ou mp2).

Limitation :

  • avec des fichiers sources abîmés, le son et la vidéo ne seront probablement plus synchrones, ce sera à vous de le rattraper dans votre logiciel de montage.

Pré-requis

Pour la méthode rapide, il suffit de disposer de ffmpeg.

Pour la méthode moins rapide, il faut avoir ffmpeg et mplayer.


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 :