Si vous utilisez un player Flash pour lire des vidéos stockées sur votre site web (comme par exemple avec DewTube), voici un script à utiliser en ligne de commande pour Linux (testé sous Ubuntu 10.10) qui permet de préparer une vidéo au format MP4 avec tout le nécessaire pour qu’elle puisse être lue en streaming.
Prérequis
Il va vous falloir les paquetages suivants :
- x264, pour l’encodage du flux vidéo,
- faac, pour l’encodage du flux audio,
- ffmpeg, pour le multiplexage et l’ajout des informations nécessaires au streaming (avec l’utilitaire qt-faststart).
Un petit tour dans Synaptic et l’affaire est dans le sac.
Le script a été conçu pour se satisfaire des versions fournies en standard dans les paquetages d’Ubuntu et ne nécessite donc pas la recompilation de ffmpeg pour lui ajouter le support du x264.
Un des avantages de x264 par rapport à une autre solution c’est qu’il est capable d’utiliser plusieurs cœurs/processeurs pour encoder la vidéo.
Le script
Il est plutôt simple à utiliser : toflashmp4 <video en entrée>
Le script va encoder la vidéo au format MP4 et remplacer l’extension de la vidéo par mp4.
L’encodage vidéo est la partie qui prend le plus de temps. L’encodage audio, le multiplexage, l’ajout des informations pour les streaming sont rapides.
Sa conception est des plus simples : il s’agit d’un enchaînement de commandes qui est interrompu dès qu’une des commandes renvoie un code d’erreur. Cela permet sa modification pour l’adapter à des besoins spécifiques (options, paramètres particuliers, etc.)
#!/bin/bash # Définition des variables source="$1" intermediairevideo="/tmp/$$-intermediairevideo.mp4" intermediaireaudio="/tmp/$$-intermediaireaudio.m4a" intermediaireaudiovideo="/tmp/$$-intermediaireaudiovideo.mp4" destination="${source%.*}.mp4" # Teste le résultat de la dernière commande et arrête le script s’il y a eu # un problème. Les fichiers temporaires sont également nettoyés function finsiprobleme { if [ $? -ne 0 ] then echo "Erreur !!!" rm "$intermediairevideo" "$intermediaireaudio" "$intermediaireaudiovideo" 2> /dev/null exit 1 else echo "OK" fi } # Encode en MPEG-4 le flux vidéo de la source echo -n "→ Encodage en MPEG-4 du flux vidéo de la source... " x264 -o "$intermediairevideo" "$source" 2> /dev/null finsiprobleme # Encode en FAAC le flux audio de la source echo -n "→ Encodage en FAAC du flux audio de la source... " ffmpeg -i "$source" -acodec pcm_s16le -f wav - 2> /dev/null | faac -o "$intermediaireaudio" - 2> /dev/null finsiprobleme # Multiplexe les flux audio et vidéo echo -n "→ Multiplexage des flux audio et vidéo... " ffmpeg -i "$intermediairevideo" -vcodec copy -i "$intermediaireaudio" -acodec copy "$intermediaireaudiovideo" 2> /dev/null finsiprobleme # Ajoute les informations de streaming et produit la vidéo finale echo -n "→ Ajout des informations pour le streaming... " qt-faststart "$intermediaireaudiovideo" "$destination" > /dev/null 2> /dev/null finsiprobleme # Nettoie les fichiers intermédiaires echo -n "→ Nettoyage des fichiers intermédiaires... " rm "$intermediairevideo" "$intermediaireaudio" "$intermediaireaudiovideo" 2> /dev/null finsiprobleme # Fin echo "La vidéo a été convertie !"