Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/02/2010, à 20:54

Tomzz

script de conversion vidéo et html5

Bonsoir,

Je ne suis pas sûr d'être au bon endroit, la question porte sur de l'encodage vidéo mais implique aussi du bash et du html.

J'ai fais un nautilus-script qui permet de convertir une vidéo en un clic, vers 3 versions (ogv, mp4, et flv).

Le script envoi ensuite ces vidéos sur un site web et place un code html dans le presse papier pour l'insérer directement dans une page.

Ce code affiche la vidéo grâce aux balises dédiés du html5 (dans les deux formats, theora et mp4), affiche un lecteur flash dans les navigateurs ne supportant pas le html5, et ajoute un lien de téléchargement direct pour le fichier ogv (merci de me dire si j'ai oublié quelqu'un big_smile ).

Ce script semble bien marcher à partir de divers formats (avi, mpeg, wmv et certains mov) mais ffmpeg2theora ne veut rien savoir pour des fichiers .mov issues de mon apn et que les propriétés de nautilus me qualifient de JPEG still images 30 fps.
Je cherche donc comment convertir ces mov de mon apn en ogv et d'un façon plus générale, une solution de conversion vers ogv la plus universelle possible.

Voilà mon script:

#!/bin/bash

## prérequis xclip, detox, zenity, ffmpeg (dépots medibuntu), ffmpeg2theora, mplayer, player flash voir: http://www.longtailvideo.com/players/jw-flv-player/ (décocher les cases avant le téléchargement)  ##
printf %s "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" |
while read -r arg
do
  
  ## traitement des espaces et caractères spéciaux dans le nom de fichier ##
  detox -v -s utf_8 "$arg" > /tmp/fich.txt
  if [ $(wc -l /tmp/fich.txt | cut -d' ' -f1) -gt "1" ]; then
  {
	  tail --lines=1 /tmp/fich.txt > /tmp/fich1.txt
	  varg=$(cat /tmp/fich1.txt | cut -d'>' -f2 | sed 's/ //g')
	  echo "$varg" > /tmp/fich2.txt
	  video1=$(cat /tmp/fich2.txt | sed 's/ //g')
	  video=${video1##*/}
	  rm /tmp/fich.txt
	  rm /tmp/fich1.txt
	  rm /tmp/fich2.txt
  }
  else
  {
	  varg="$arg"
	  video="$1"
  }
  fi
  
  zenity --notification --text="Une conversion video est en cours" |
  (
    ## conversion de la vidéo en Théora ogv pour balise html5 ##
	ffmpeg2theora -o $HOME/fichiers-web/images-pretes/"$video".ogv -V 800 -x 320 -A 128 "$varg"
	
	## extraction d'une image pour aperçu de la vidéo ##
	mplayer -vo jpeg -frames 1 -ss 00:00:04 $HOME/fichiers-web/images-pretes/"$video".ogv
	mv 00000001.jpg $HOME/fichiers-web/images-pretes/"$video".jpg
	
	## conversion de la vidéo en flv pour lecteur flash alternatif ##
	ffmpeg -i $HOME/fichiers-web/images-pretes/"$video".ogv -ar 22050 -ab 32 -f flv $HOME/fichiers-web/images-pretes/"$video".flv
	
	## conversion de la vidéo en mp4 pour balise html5 (Safari) ##
	ffmpeg -i $HOME/fichiers-web/images-pretes/"$video".ogv -f mp4 -vcodec mpeg4 -maxrate 1000 -qmin 3 -qmax 5 -bufsize 4096 -g 300 -acodec libfaac -ab 128 -b 400 $HOME/fichiers-web/images-pretes/"$video".mp4
	
	## partie à remplacer par commandes lftp ou ssh pour envoi sur serveur distant ##
	mv $HOME/fichiers-web/images-pretes/"$video".jpg /var/www/video/"$video".jpg
	mv $HOME/fichiers-web/images-pretes/"$video".mp4 /var/www/video/"$video".mp4
	mv $HOME/fichiers-web/images-pretes/"$video".ogv /var/www/video/"$video".ogv
	mv $HOME/fichiers-web/images-pretes/"$video".flv /var/www/video/"$video".flv
	## partie à remplacer par commandes lftp ou ssh pour envoi sur serveur distant ##
	
	## création du code html ( balise vidéo html5 fichier ogv et mp4 + lecteur flash alternative à html5 + lien de téléchargement en ogv ##
	cod="<video poster=\"/video/${video}.jpg\" controls=\"controls\">
		<source src=\"/video/${video}.ogv\" type=\"video/ogg\" />
		<source src=\"/video/${video}.mp4\" type=\"video/mp4\" />
		<object id=\"player\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" name=\"player\" width=\"400\" height=\"315\">
		<param name=\"movie\" value=\"/video/player.swf\" />
		<param name=\"allowfullscreen\" value=\"true\" />
		<param name=\"allowscriptaccess\" value=\"always\" />
		<param name=\"flashvars\" value=\"file=/video/${video}.flv&image=/video/${video}.jpg\" />
		<embed type=\"application/x-shockwave-flash\" id=\"player2\" name=\"player2\" src=\"/video/player.swf\" width=\"320\" height=\"260\" allowscriptaccess=\"always\" allowfullscreen=\"true\" flashvars=\"file=/video/${video}.flv&image=/video/${video}.jpg\" />
	</object></video>
	<a href=\"/video/${video}.ogv\" title=\"clic droit, enregistrer sous...\">T&eacute;l&eacute;chargez la vid&eacute;o.</a>"
	
	## envoi du code html vers le presse papier (bouton du milieu) ##
	echo "$cod" | tee >(xclip)
	
	## envoi du code html vers un fichier texte ##
	echo "$cod" > $HOME/fichiers-web/images-pretes/"$video".txt
	killall zenity
	echo message:La conversion est terminée | zenity --notification --listen | zenity --notification --text="Vos vidéos sont disponnibles" &
sleep 20
killall zenity
  )
done

J'ai testé le résultat avec succès sous FF 3.5 (html5) et 3.0 (flash), Safari windows (html5 mp4), Opera 10.1 (html5), IE 7 et 8 (flash), Chrome windows (html5).
Et Chrome Ubuntu (téléchargé deb directement chez GG) mais là, la vidéo en ogv s'affiche via html5 mais elle n'est pas lue correctement, un peu de son 3 ou 4 images et ça fige.
Si quelqu'un a une idée pour Chrome Ubuntu, je suis aussi preneur, mais la question principale reste ce problème de conversion des mov de mon apn.

[ce point est résolu]
[EDIT] J'ai failli oublier, j'ai quelque soucis avec les notifications zenity, en fait elle ne se stoppe que lorsque que je clique dessus, j'aurais aimé que la notification de fin conversion apparaisse quelques secondes puis que tout soit quitté sans que j'ai à intervenir.
[/ce point est résolu]

Dernière modification par Tomzz (Le 07/02/2010, à 16:56)

Hors ligne

#2 Le 07/02/2010, à 12:48

Tomzz

Re : script de conversion vidéo et html5

Bonjour,
Un petit up et une synthèse de ma demande:

    ## conversion de la vidéo en Théora ogv pour balise html5 ##
    ffmpeg2theora -o $HOME/fichiers-web/images-pretes/"$video".ogv -V 800 -x 320 -A 128 "$varg"

Cette ligne fonctionne pour la pluspart des formats vidéos en entrée sauf pour des .mov issus de mon appareil photo (panasonic) (résultat de file -i: video/quicktime; charset=binary).
Est-il possible de convertir ces fichiers directement en ogv grâce à ffmpeg2theora ou sinon, quel outil utiliser ?

[ce point est résolu]
Et autre question (sur le même script):

echo message:La conversion est terminée | zenity --notification --listen | zenity --notification --text="Vos vidéos sont disponnibles"
    killall zenity

La notification fonctionne parfaitement mais je suis obligé de cliquer sur l'icone pour stoper le script, j'aimerai que zenity (et tout le script) soit quitté au bout de x secondes
[/ce point est résolu]

Dernière modification par Tomzz (Le 07/02/2010, à 16:57)

Hors ligne

#3 Le 07/02/2010, à 14:21

AnsuzPeorth

Re : script de conversion vidéo et html5

Bjr,
Si tu utilse que zenity --listen, le message est affiché et le script continue !

echo message:La conversion est terminée | zenity --notification --listen
exit

Si tu veux vraiment l'icone de notification, lancer la commande en arrière plan.

echo message:La conversion est terminée | zenity --notification --listen | zenity --notification --text="Vos vidéos sont disponnibles" &
sleep 10
killall zenity  #ou pkill zenity
exit

Dernière modification par AnsuzPeorth (Le 07/02/2010, à 14:25)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#4 Le 07/02/2010, à 16:59

Tomzz

Re : script de conversion vidéo et html5

Merci AnsuzPeorth, ça marche !!!

reste plus que le soucis des fichiers video/quicktime; charset=binary avec ffmpeg2theora.

Hors ligne

#5 Le 08/02/2010, à 19:25

twocats

Re : script de conversion vidéo et html5

if [ $(wc -l /tmp/fich.txt | cut -d' ' -f1) -gt "1" ]; then
  {
      tail --lines=1 /tmp/fich.txt > /tmp/fich1.txt
      varg=$(cat /tmp/fich1.txt | cut -d'>' -f2 | sed 's/ //g')
      echo "$varg" > /tmp/fich2.txt
      video1=$(cat /tmp/fich2.txt | sed 's/ //g')
      video=${video1##*/}
      rm /tmp/fich.txt
      rm /tmp/fich1.txt
      rm /tmp/fich2.txt
  }

Le même en plus court :

if [ $(wc -l < /tmp/fich.txt) -gt 1 ]; then # Un pipe en moins
  {
      tail --lines=1 /tmp/fich.txt > /tmp/fich1.txt
      varg=$(awk 'BEGIN {FS=">"} {gsub(/ /, ""); print $2}' /tmp/fich1.txt) # useless use of cat; deux pipes en moins
      echo "$varg" > /tmp/fich2.txt
      video1=$(sed 's/ //g' /tmp/fich2.txt) # useless use of cat; Un pipe en moins
      video=${video1##*/}
      rm /tmp/fich.txt /tmp/fich1.txt /tmp/fich2.txt
  }

A vérifier, quand même wink
My 2 cents

Dernière modification par twocats (Le 08/02/2010, à 19:26)


La réponse est 42

Hors ligne

#6 Le 09/02/2010, à 17:51

AnsuzPeorth

Re : script de conversion vidéo et html5

Bjr,
Juste un petit truc qui me chagrine, video=$1 , tu le sors d'où le $1, je vois pas ???

Sinon, je vois pas bien l'interet de passer par tous ces fichiers (j'avais pas lu ton code !)
Pourquoi ne pas simplement récupérer la sortie de detox pour le path de ta vidéo ?

Le passage par detox enlève les espaces et les caractères spéciaux, il envoie une ligne si aucun changement, et 2 lignes si changement. A chaque fois, c'est la dernière ligne de la sortie qui nous indique le path du fichier (modifié ou non).

J'aurais fais un truc du genre:

PATH_FICHIER=$(detox -v -s utf_8 "$arg" | tail -n 1 | awk '{print $NF}')
varg=$PATH_FICHIER
video=${PATH_FICHIER##*/}

Autre chose

## partie à remplacer par commandes lftp ou ssh pour envoi sur serveur distant ##
	mv $HOME/fichiers-web/images-pretes/"$video".jpg /var/www/video/"$video".jpg
	mv $HOME/fichiers-web/images-pretes/"$video".mp4 /var/www/video/"$video".mp4
	mv $HOME/fichiers-web/images-pretes/"$video".ogv /var/www/video/"$video".ogv
	mv $HOME/fichiers-web/images-pretes/"$video".flv /var/www/video/"$video".flv
	## partie à remplacer par commandes lftp ou ssh pour envoi sur serveur distant ##

si tu n'as que les videos à déplacer dans le dossier images-pretes, simplement:

mv $HOME/fichiers-web/images-pretes/* /var/www/video

_

## envoi du code html vers le presse papier (bouton du milieu) ##
	echo "$cod" | tee >(xclip)
	
	## envoi du code html vers un fichier texte ##
	echo "$cod" > $HOME/fichiers-web/images-pretes/"$video".txt

Je n'avais jamais utilisé xclip de cette manière smile (mais ca fonctionne qd même !)
Tu utilise tee et ensuite du fait une copie, doublon ici.

echo "$cod" | tee $HOME/fichiers-web/images-pretes/"$video".txt | xclip -i

Je me suis permis de poster ma façon de voir les choses car personnellement j'aime bien que l'on expose sa vision lorsque je post du code (ca m'apprends des trucs !), chaque tache peut être faite différemment, c'est ce qui est intéressant !


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#7 Le 09/02/2010, à 18:42

Tomzz

Re : script de conversion vidéo et html5

Merci pour vous réponses,

Juste un petit truc qui me chagrine, video=$1 , tu le sors d'où le $1, je vois pas ???

C'est le nom du fichier sélectionné dans nautilus
par ex:
je sélectionne /home/user/video.avi et je lance le nautitus script
alors $arg=/home/user/video.avi et $1=video.avi

c'est la dernière ligne de la sortie qui nous indique le path du fichier

J'ai vu et c'est ce que je gère avec succés grâce à

if [ $(wc -l /tmp/fich.txt | cut -d' ' -f1) -gt "1" ]; then
  {
      tail --lines=1 /tmp/fich.txt > /tmp/fich1.txt
      varg=$(cat /tmp/fich1.txt | cut -d'>' -f2 | sed 's/ //g')
      echo "$varg" > /tmp/fich2.txt
      video1=$(cat /tmp/fich2.txt | sed 's/ //g')
      video=${video1##*/}
      rm /tmp/fich.txt
      rm /tmp/fich1.txt
      rm /tmp/fich2.txt
  }
  else
  {
      varg="$arg"
      video="$1"
  }

Mais j'essaierai ta version qui est de loin plus élégante big_smile

Pas le temps de voir la suite tout de suite...
Mais je suis avant tout d'accord avec ça wink

Je me suis permis de poster ma façon de voir les choses car personnellement j'aime bien que l'on expose sa vision lorsque je post du code (ca m'apprends des trucs !), chaque tache peut être faite différemment, c'est ce qui est intéressant !

Hors ligne

#8 Le 09/02/2010, à 19:20

AnsuzPeorth

Re : script de conversion vidéo et html5

Tomzz a écrit :

je sélectionne /home/user/video.avi et je lance le nautitus script
alors $arg=/home/user/video.avi et $1=video.avi

Je ne savais pas du tout ! Je sais pas où tu as trouvé ça !
Et le printf est bien pratique également dans cette configuration . (j'utilise jamais cette commande)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#9 Le 09/02/2010, à 20:05

Tomzz

Re : script de conversion vidéo et html5

Je continu ...

si tu n'as que les videos à déplacer dans le dossier images-pretes, simplement:

Ce n'est pas le cas, j'utilise ce dossier pour d'autres fichiers en attente d'envoi sur un site (j'ai fais un autre script sur la même base pour redimensionner et convertir  des images).
Mais tu m'as fait penser à:

mv $HOME/fichiers-web/images-pretes/"$video".* /var/www/video/

Ce qui, si je ne m'abuse, devrait avoir le même effet en une ligne.

Pour xclip, j'ai juste pompé outrageusement big_smile l'exellent travail de Sputnick voir ici: http://forum.ubuntu-fr.org/viewtopic.php?id=369410
Je testerai ta solution.
Une remarque, j'utilise xclip + un ficher texte parceque xclip est très pratique, mais il suffit d'un clic malencontreux pour vider le presse papier, j'ai donc pensé qu'il valait mieux pouvoir récupérer le code dans un fichier texte.

[edit] La suite ...

Le passage par detox enlève les espaces et les caractères spéciaux, il envoie une ligne si aucun changement, et 2 lignes si changement. A chaque fois, c'est la dernière ligne de la sortie qui nous indique le path du fichier (modifié ou non).

J'aime bien detox pour sa simplicité d'utilisation, avec mon niveau actuel, chaque fois que je veux utiliser awk cut sed... je passe un bon moment sur le net avant de trouver la bonne syntaxe.

@towcats:

rm /tmp/fich.txt /tmp/fich1.txt /tmp/fich2.txt

Pas encore testé, mais peut être que je peux aussi faire rm /tmp/fich*.txt

Sinon, j'ai un peu avancé avec mon problème de fichiers mov, apparament le problème est liè aux codecs audio: faad 2pistes 128kb/s

Dernière modification par Tomzz (Le 09/02/2010, à 21:07)

Hors ligne

#10 Le 20/02/2010, à 20:24

kerkael

Re : script de conversion vidéo et html5

Bon, c'est super sympa.:)
Te voilà débarqué avec un script qui a l'air de faire plein de trucs tongue, mais dont tu viens ici chercher au final comment le déboguer. Faible de mon inexpérience dans le domaine de la conversion vidéo, ton script m'intéresse.;)

Mais, maintenant que tu as trouvé toute l'aide recherchée (merci les savants), où est la version complète, déboguée et fonctionnelle ? sad Un p'tit link, stp roll ? Ou bien une mise à jour de ton premier message pour dire :
version 0.99b boguée
version 1.0 qui marche.

Ce serait super sympa big_smile

Hors ligne

#11 Le 21/02/2010, à 01:07

Tomzz

Re : script de conversion vidéo et html5

Bonsoir,
@kerkael mon script est surtout fait pour utiliser la balise video du html5 en proposant (j'espère, me dire si j'en ai oublié) une alternative pour tous types de navigateurs et de systèmes (même les mauvais ... flash + ie).
Pour la conversion pure il y a un script tout prêt qui me parait sympa ici: http://gnome-look.org/content/show.php/ … tent=92533.

Pour mon script je n'y suis pas revenu pour le moment mais il fonctionne en l'état.
Je vais le détailler sur un wiki (voir ma signature).
Mon seul problème reste les fichiers mov de mon apn, mais j'ai localisé le problème, c'est une histoire de codec audios

Hors ligne