Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1550 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [résolu] Capture de la sortie de mencoder

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[résolu] Capture de la sortie de mencoder

n°847683
wedgeant
Da penguin inside
Posté le 02-10-2006 à 08:31:12  profilanswer
 

Bonjour à tous  :sleep:  
 
Je suis en train de mettre en place un script shell de rip dvd -> avi qui nécessite une intervention extrèmement minime de l'utilisateur (titre du film, taille finale, langue audio, langue sous-titres et c'est tout :sol:). Pour ça j'utilise (entre autres) mencoder (encodeur de mplayer).
 
Actuellement, le script fonctionne sans aucun souci, mais je souhaiterais capturer sa sortie pour cacher tous les messages pas zoulis et traiter les informations de sortie (% d'avancement, temps restant etc ...).
Mon seul problème est que l'affichage de ces informations est traité avec un "\r" final (à priori, faudrait que je regarde les sources, pas eu le temps) et qu'un traitement du style

Code :
  1. mencoder [options] | tail -1

ne permet pas de capturer cette ligne, de même avec grep ou awk ...  :non:
 
J'ai bien trouvé un moyen qui consiste à envoyer la sortie de mencoder vers un fichier puis de faire un tail sur le fichier, mais avec cette méthode je perds environ 5 fps (passage de 27 fps à 21/22 fps) et donc pas loin de 20 min d'encodage par film  :sweat:  
 
Je cherche donc un moyen de récupèrer la sortie en RAM ou un moyen de la traiter en direct (en évitant perl qui fait perdre autant de temps que le passage par fichier).
 
Je précise que j'ai testé les méthodes du style  

Code :
  1. text=`mencoder ...` &
  2. echo $text | tail -1


et ça ne donne rien d'utilisable (en fait, text est vide  :heink:)
 
Merci bien :)

Message cité 2 fois
Message édité par wedgeant le 05-10-2006 à 11:46:06

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
mood
Publicité
Posté le 02-10-2006 à 08:31:12  profilanswer
 

n°847790
memaster
ki a volé mon 62?
Posté le 02-10-2006 à 15:39:17  profilanswer
 

wedgeant a écrit :


 
J'ai bien trouvé un moyen qui consiste à envoyer la sortie de mencoder vers un fichier puis de faire un tail sur le fichier, mais avec cette méthode je perds environ 5 fps (passage de 27 fps à 21/22 fps) et donc pas loin de 20 min d'encodage par film  :sweat:  
 
Je cherche donc un moyen de récupèrer la sortie en RAM ou un moyen de la traiter en direct (en évitant perl qui fait perdre autant de temps que le passage par fichier).
 
Merci bien :)


je ne suis pas expert en encodage et c'est la (en gras) que je comprend pas?
cela voudrais dire que l'encoder saute des frames? :heink:

n°847795
wedgeant
Da penguin inside
Posté le 02-10-2006 à 15:49:05  profilanswer
 

memaster a écrit :

je ne suis pas expert en encodage et c'est la (en gras) que je comprend pas?
cela voudrais dire que l'encoder saute des frames? :heink:


 
Nope, fps c'est l'abbréviation pour "Frames Per Second"  ;)  
Donc en gros, quand j'encode sans capture texte, je tourne environ à 27 fps (sachant que quand on lit un film, la vitesse de base est 25 fps). Quand je tourne en mode capture, je descend à 21 fps (c'est dû aux accès disques qui font ralentir le processus).
 
Wala  :D  
 
Sinon, t'as pas une idée sur la manière de faire ?  :sweat:  :cry:


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°847796
0x90
Posté le 02-10-2006 à 15:53:21  profilanswer
 

essaye ca:
mencoder 2>1 | tail -1

n°847803
memaster
ki a volé mon 62?
Posté le 02-10-2006 à 16:05:43  profilanswer
 

wedgeant a écrit :

Nope, fps c'est l'abbréviation pour "Frames Per Second"  ;)  
Donc en gros, quand j'encode sans capture texte, je tourne environ à 27 fps (sachant que quand on lit un film, la vitesse de base est 25 fps). Quand je tourne en mode capture, je descend à 21 fps (c'est dû aux accès disques qui font ralentir le processus).
 
Wala  :D  
 
Sinon, t'as pas une idée sur la manière de faire ?  :sweat:  :cry:


ahhhh!!!
donc tu encodes en temps réel (cad en regardant le dvd) et tu perds sur la durée
totale de l'encodage.
 
pour la solution, je ne sais pas :(

n°847818
wedgeant
Da penguin inside
Posté le 02-10-2006 à 16:21:44  profilanswer
 

0x90 a écrit :

essaye ca:
mencoder 2>&1 | tail -1


 
Fonctionne pas ...  :non:
La sortie qui m'intéresse se trouvé déjà sur le stdout et pas sur le stderr  :sweat:  
 
edit: corrigé une tite erreur au passage ;)


Message édité par wedgeant le 02-10-2006 à 16:41:13

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°847820
wedgeant
Da penguin inside
Posté le 02-10-2006 à 16:23:13  profilanswer
 

memaster a écrit :

ahhhh!!!
donc tu encodes en temps réel (cad en regardant le dvd) et tu perds sur la durée
totale de l'encodage.
 
pour la solution, je ne sais pas :(


 
Non, pas en regardant le dvd, juste quand je redirige la sortie "texte" de la commande dans un fichier, ça fait de gros accès disques et donc ça ralentit le tout :(


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°847821
memaster
ki a volé mon 62?
Posté le 02-10-2006 à 16:26:17  profilanswer
 

ben alors, je ne comprends pas la nature même de cette perte de fps :cry:  
à la fin ton dvd il est bien encodé comme il faut dixit sans perte d'aucune frame?

n°847828
wedgeant
Da penguin inside
Posté le 02-10-2006 à 16:38:45  profilanswer
 

memaster a écrit :

ben alors, je ne comprends pas la nature même de cette perte de fps :cry:  
à la fin ton dvd il est bien encodé comme il faut dixit sans perte d'aucune frame?


 
On va reprendre du début, papleurer  :D  
Quand tu lances mencoder, il n'ouvre pas de lecteur video, il affiche simplement sur la console le résultat de ce qu'il est en train de faire : l'avancement de l'encodage.
En gros, ça donne une sortie qui ressemble à ça:

Code :
  1. Pos: 120.5s (  2%) 150f  25.3fps (etc...)


 
Je voudrais "capturer" cette sortie pour traiter les informations intéressantes (le % d'avancement, la durée restante, etc ...).
Seulement, cet affichage se passe sur une seule ligne, c'est à dire qu'à chaque fois la ligne est réécrite sur elle même (via un \r à la fin au lieu d'un \n).
Et impossible donc de le traiter simplement via un tail ou un grep.
 
Par contre, je peux rediriger cette sortie vers un fichier sur disque, mais ça fait écrire environ une 10 aine de lignes par seconde, donc de très gros accès disques d'où un ralentissement conséquent de l'encodage derrière et une perte de fps, même si le dvd est bien encodé à la fin ;)

Message cité 1 fois
Message édité par wedgeant le 02-10-2006 à 16:41:48

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°847830
memaster
ki a volé mon 62?
Posté le 02-10-2006 à 16:46:55  profilanswer
 

wedgeant a écrit :


Par contre, je peux rediriger cette sortie vers un fichier sur disque, mais ça fait écrire environ une 10 aine de lignes par seconde, donc de très gros accès disques d'où un ralentissement conséquent de l'encodage derrière et une perte de fps, même si le dvd est bien encodé à la fin ;)


si tu as une perte de fps, c'est que dans ton encodage final, il va te manquer quelques images intermédiaires qui n'ont pas été traités et donc une perte d'information même si ton
fichier final encodé va à 25img/s.
c'est juste que qd tu as une perte de fps dans ton traitement, l'encodeur va calculer/extrapoler
des images entre les images qu'il n'aura pas pu lire.
 
ce que je ne comprend donc pas, c'est la perte de 20min?
 
sinon c'est que tu as un faux pb :sleep:  :sweat:  :??:  
 
pour ta solution, essaye d'encoder en désactivant ta swap disque : si c'est possible? :??:  
tu vas peut etre pouvoir recuperer des fps manquant même en écrivant ton log
sur le disque. tu peux essayer aussi d'envoyer ta sortie dans un log sur le réseau (un disque nfs par exemple),
ainsi ta machine principale (celle qui encode) ne ralentira pas (enfin, je crois).

mood
Publicité
Posté le 02-10-2006 à 16:46:55  profilanswer
 

n°847838
0x90
Posté le 02-10-2006 à 17:06:06  profilanswer
 

t'as toujours pas compris cette histoire de fps :D
 
L'encodeur ne perds pas des frames, il met juste plus de temps pour faire l'encodage.
 
Si pour encoder un film de 1h30 il te faut 1h30, tu as encodé en moyenne à 25fps.
Si pour encoder un film de 1h30 il te faut 1h50, tu as encodé en moyenne à 21fps. Et t'as perdu 20 de temps de ta précieuse vie :p
 
C'est juste une mesure de vitesse, comme en bagnole tu va a 100km/h au lieu de 130km/h, tu perds du temps pour un trajet donné, mais t'as pas sauté des bouts de route :D

n°847839
memaster
ki a volé mon 62?
Posté le 02-10-2006 à 17:10:20  profilanswer
 

ok, d'ac :jap:  
ma question est donc?
es tu as 20min près?
 
après ben vois si mes propositions te semblent aider pour te faire gagner du temps.

n°847844
0x90
Posté le 02-10-2006 à 17:15:06  profilanswer
 

perdre 20min simplement pour un pb de recup des infos en sortie, ca fait qand même chier :/

n°847849
franceso
Posté le 02-10-2006 à 17:20:46  profilanswer
 

tu devrais peut-être regarder du côté d'AcidRip : il doit faire à peu près ce que tu veux...


---------------
TriScale innov
n°847965
wedgeant
Da penguin inside
Posté le 03-10-2006 à 08:17:39  profilanswer
 

franceso a écrit :

tu devrais peut-être regarder du côté d'AcidRip : il doit faire à peu près ce que tu veux...


 
 :lol:  :lol:  :lol:  
Mon script est inspiré du fonctionnement d'acidrip
Maintenant, pourquoi j'ai voulu en faire un moi même à la main ? Tout simplement parce que j'ai constaté qu'avec acidrip, il y avait la même perte (encodage environ à 21/22 fps au lieu de 27/28)
 
Sinon, memaster62: non, je ne suis pas à 20 minutes près personellement, mais comme le dir 0x90, perdre 20 minutes d'encodage pour seulement une récupération d'informations, ça fait lourd  :sweat:  
 
Pour les solutions:

  • je n'ai pas de swap disque (avec 1 Go de RAM, j'ai constaté que le système swappait même avec 20% d'utilisation de la RAM, du coup, je l'ai viré)
  • ton idée de disque nfs semble intéressant, mais il n'y a qu'un seul souci ... le disque nfs lui même (que je n'ai pas)  :cry:  


Merci bien sinon ;)


Message édité par wedgeant le 03-10-2006 à 08:18:25

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°847984
memaster
ki a volé mon 62?
Posté le 03-10-2006 à 09:26:59  profilanswer
 

il y a surement un moyen d'utiliser une partie de ta ram pour en faire un "mount point".
 
et je me demande si un hdd flash (genre une CF sur usb) pourrais te convenir car ils ont des temps d'accès
beaucoup mois elevé, etant donné que ici pour ecrire du txt, ce n'est pas le debit qui
va être un handicap.

n°847989
wedgeant
Da penguin inside
Posté le 03-10-2006 à 09:38:40  profilanswer
 

memaster a écrit :

il y a surement un moyen d'utiliser une partie de ta ram pour en faire un "mount point".
 
et je me demande si un hdd flash (genre une CF sur usb) pourrais te convenir car ils ont des temps d'accès
beaucoup mois elevé, etant donné que ici pour ecrire du txt, ce n'est pas le debit qui
va être un handicap.


 
Yep, j'ai déjà /tmp qui est en RAM ... c'est ce que je vais faire, mais comme mon but final est la distribution de ce script, je cherche une solution qui soit la plus générale possible  :sol:


Message édité par wedgeant le 03-10-2006 à 09:39:25

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°848108
Mjules
Modérateur
Parle dans le vide
Posté le 03-10-2006 à 14:45:20  profilanswer
 

wedgeant a écrit :

Bonjour à tous  :sleep:  
 
Je suis en train de mettre en place un script shell de rip dvd -> avi (...)


 
pourquoi ne pas contacter l'équipe de tuxrip ? (qui passe régulièrement sur HFR)  
 
http://tuxrip.free.fr/
http://forum.hardware.fr/hardwaref [...] 8446-1.htm


---------------
Celui qui pose une question est idiot 5 minutes. Celui qui n'en pose pas le reste toute sa vie. |  Membre du grand complot pharmaceutico-médico-scientifico-judéo-maçonnique.
n°848114
wedgeant
Da penguin inside
Posté le 03-10-2006 à 14:56:22  profilanswer
 

Mjules a écrit :

pourquoi ne pas contacter l'équipe de tuxrip ? (qui passe régulièrement sur HFR)  
 
http://tuxrip.free.fr/
http://forum.hardware.fr/hardwaref [...] 8446-1.htm


 
Yep, je verrais avec eux :)
Merci pour l'info que je n'avais pas vue  :jap:
 
[edit: je suis un boulet  ;)]


Message édité par wedgeant le 03-10-2006 à 15:06:39

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°848148
franceso
Posté le 03-10-2006 à 16:07:46  profilanswer
 

et tu pourrais pas faire un petit programme C qui te fait une lecture de ligne terminée par '\r' plutôt que '\n' ?
 
C'est vrai que ça te force à ne pas tout faire en shell, mais c'est peut-être un moyen rapide d'arriver à tes fins...


---------------
TriScale innov
n°848152
memaster
ki a volé mon 62?
Posté le 03-10-2006 à 16:14:45  profilanswer
 

et modifier les sources aussi, histoire de balancer le retour à la ligne
(je n'y avais même pas pensé :sleep: )

n°848155
wedgeant
Da penguin inside
Posté le 03-10-2006 à 16:25:36  profilanswer
 

memaster a écrit :

et modifier les sources aussi, histoire de balancer le retour à la ligne
(je n'y avais même pas pensé :sleep: )


 
Mwaif, moyen quand même, si je veux pouvoir distribuer ce script, ça veut dire distribuer aussi un patch pour Mplayer et obliger les gens à recompiler ... le but final reste une quasi non intervention de l'utilisateur lors d'un rip de dvd : nom du film, répertoire de destination et basta :)
 

franceso a écrit :

et tu pourrais pas faire un petit programme C qui te fait une lecture de ligne terminée par '\r' plutôt que '\n' ?
 
C'est vrai que ça te force à ne pas tout faire en shell, mais c'est peut-être un moyen rapide d'arriver à tes fins...


 
J'y ai pensé, mais ça me gène un peu pour la même raison, obliger les gens à compiler quelque chose  :sweat:


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°848166
franceso
Posté le 03-10-2006 à 16:50:19  profilanswer
 

Si c'est juste la compilation qui te gêne, tu peux le faire en perl :
 
getline.pl

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. my $line = "";
  4. while (my $char = getc)
  5. {
  6.     last if ($char eq "\r" );
  7.     $line .= $char;
  8. }
  9. print $line, "\n";


 

> echo -ne "toto\rtutu" | ./getline.pl
toto

Message cité 1 fois
Message édité par franceso le 03-10-2006 à 16:50:59

---------------
TriScale innov
n°848167
wedgeant
Da penguin inside
Posté le 03-10-2006 à 16:52:14  profilanswer
 

franceso a écrit :

Si c'est juste la compilation qui te gênes, tu peux le faire en perl :


 
Déjà testé, le traitement via perl fait perdre environ le même temps qu'en envoyant la sortie dans un fichier :(


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°848171
Nonor_
Ubuntu c'est supaire
Posté le 03-10-2006 à 17:03:11  profilanswer
 

Il y a deux ou trois ans de ça j'avais fait un script qui faisait la même chose... Et pour traiter la sortie de mencoder, j'avais été obligé de faire comme toi, envoyer tout dans un fichier log et traiter celui ci. J'avais pas souvenir que ça ralentissait particulièrement le processus mais c'est fort possible.
Tout ça pour faire signe que t'es pas seul à te poser la question. En passant par un FIFO ça serait pas plus rapide ? Ou bien faudrait trouver le moyen de réduire la fréquence de rafraîchissement de la sortie stdout de mencoder....
 
edit : Autre chose tant que j'y suis, as-tu fais des tests pour voir si, par hasard, ce qui ralentit tant c'est le fait de traiter le log plutôt que de l'écrire ? Je viens de me souvenir que l'affichage de mon script qui montrait la progression du rippage n'était mis à jour que toutes les 30 secondes, justement pour des questions de perfs... ?

Message cité 1 fois
Message édité par Nonor_ le 03-10-2006 à 17:07:08
n°848173
franceso
Posté le 03-10-2006 à 17:07:55  profilanswer
 

wedgeant a écrit :

Déjà testé, le traitement via perl fait perdre environ le même temps qu'en envoyant la sortie dans un fichier :(

même si tout ton script est en perl ?
 
là je vois pas trop ce que tu pourrais faire de mieux...  :??:  


---------------
TriScale innov
n°848296
wedgeant
Da penguin inside
Posté le 04-10-2006 à 08:18:06  profilanswer
 

Nonor_ a écrit :

Il y a deux ou trois ans de ça j'avais fait un script qui faisait la même chose... Et pour traiter la sortie de mencoder, j'avais été obligé de faire comme toi, envoyer tout dans un fichier log et traiter celui ci. J'avais pas souvenir que ça ralentissait particulièrement le processus mais c'est fort possible.
Tout ça pour faire signe que t'es pas seul à te poser la question. En passant par un FIFO ça serait pas plus rapide ? Ou bien faudrait trouver le moyen de réduire la fréquence de rafraîchissement de la sortie stdout de mencoder....
 
edit : Autre chose tant que j'y suis, as-tu fais des tests pour voir si, par hasard, ce qui ralentit tant c'est le fait de traiter le log plutôt que de l'écrire ? Je viens de me souvenir que l'affichage de mon script qui montrait la progression du rippage n'était mis à jour que toutes les 30 secondes, justement pour des questions de perfs... ?


 
Merci pour ta réponse, je vois que je suis pas tout seul à me gratouiller les neurones à ce propos ;)
Pour tes propositions:

  • le coup du FIFO ne fonctionne pas, impossible de piper la sortie à cause de ce foutu \r
  • réduire la fréquence de sortie ... pas encore trouvé de moyen de le faire  :sweat:  
  • pour le fait du traitement ou de l'écriture, ça c'est un truc que je n'ai pas fouillé, mais je pencherais quand même pour l'écriture ... comme je l'ai dit plus haut, y'a environ 10 écritures / s, ce qui revient à la question n°2


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°848314
wedgeant
Da penguin inside
Posté le 04-10-2006 à 09:31:18  profilanswer
 

En fouillant sourceforge, j'ai trouvé un script python qui utilise mencoder, je vais essayer de le tester ce soir pour voir ce qu'il donne et je regarderais au niveau du code comment ils s'en sortent pour traiter la sortie, je vous tiendrais au courant :)


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°848430
0x90
Posté le 04-10-2006 à 14:21:26  profilanswer
 

mencoder blahblahblah | tr '\033' '\n'

n°848453
wedgeant
Da penguin inside
Posté le 04-10-2006 à 14:59:10  profilanswer
 

0x90 a écrit :

mencoder blahblahblah | tr '\033' '\n'


 
Ouuuuhhh, je le sens bien ça :)
J'essaye ce soir, mais y'a peut-être de fortes chances pour que ça fonctionne  :pt1cable:
 


Message édité par wedgeant le 05-10-2006 à 11:45:16

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°848750
wedgeant
Da penguin inside
Posté le 05-10-2006 à 11:45:32  profilanswer
 

En fait, il fallait faire  

Code :
  1. mencoder [...] | tr '\r' '\n' | grep 'Pos:' | tr '\n' '\r'


 
C'était tout con, mais fallait y penser, merci beaucoup 0x90 !!!
 :)


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [résolu] Capture de la sortie de mencoder

 

Sujets relatifs
[Resolu][NetBSD]Utiliser le lecteur de CD-ROM[RESOLU][DEBIAN] Deux sites sur Apache2 : problème de virtualhost.
[Resolu][NetBSD]wd0 ou wd1?[Resolu] Récupérer des logins
[résolu]problème avec konsole[scripts] variable et sortie de commande
[résolu] avidemux et firefox 1.5[Resolu]Installation de plusieures distributions Linux
[résolu] Partage d'une imprimante windows via sambaPas de son sur la sortie coaxiale numérique
Plus de sujets relatifs à : [résolu] Capture de la sortie de mencoder


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR