Encoder une video qui change de taille

Encoder une video qui change de taille - Multimédia - Linux et OS Alternatifs

Marsh Posté le 21-06-2007 à 10:44:03    

Bonjour à tous :hello
 
J'ai un problème d'encodage video !
 
J'enregistre la tnt avec Kaffeine, au format m2t (mpeg transport stream je crois). La taille du flux video s'adapte dynamiquement à l'émission, ainsi par exemple sur une soirée Thema d'ARTE :
- début de l'émission : le présentateur parle, on est en 4:3, le stream est en 768*576
- premier reportage : on passe en 16:9, le stream est en 1024*576
- retour sur le présentateur : on repasse en 4:3
et ainsi de suite.
 
En regardant ce fichier m2t avec mplayer (ou kaffeine), le changement de taille dynamique passe tout seul. C'est pratique en plus, parce que quand l'émission est à la taille de votre écran vous êtes sûr d'avoir du full screen sans bandes noires.
 
Le problème c'est quand on veut encoder cette video... Impossible d'imposer une taille fixe en sortie, sous peine d'avoir une partie de l'émission totalement déformée.
 
En général j'utilise avidemux pour découper les pubs, et avidemux ou mencoder pour encoder/resynchroniser le son et la video.
 
avidemux propose des filtres pour retailler l'image, désentrelacer, ajouter des bandes noires et autres, et ô joie, on peut appliquer les filtres partiellement (de telle frame à telle frame).
Sauf que dans la pratique, appliquer partiellement un filtre resize+bandes noires de tel endroit à tel endroit ca fout le bordel, la video en sortie est inexploitable (gros tas de lignes vertes). Les mêmes filtres appliqués sur toute la video marchent, donc il doit y avoir une histoire de key frame de départ là-dessous...
 
Mes questions :

  • Peut-on dire à kaffeine (à son moteur xine en fait) d'enregistrer en taille fixe, quitte à découper ce qui dépasse ou à combler les trous avec des bandes noires ?
  • Comment encoder ma video avec une taille fixe (16:9 tout le long) en ajoutant des bandes noires à gauche et à droite dans les passages en 4:3 autrement qu'avec avidemux ? On peut appliquer un filtre partiellement avec mencoder (genre avec les Edition Decision Lists) ? Ou alors il faut découper la video, traiter les morceaux un à un, recoller le tout :( ?
  • Comment éviter la désynchronisation son/image ? Parce que refaire la synchro après, ca empêche d'automatiser les traitements, il faut regarder la video avec mplayer pour repérer la valeur de décalage, ce n'est pas scriptable.  

Il y a 2 options de synchronisation apparement, metronome et resample, mais le résultat est plus ou moins le même : l'enregistrement est synchrone au sein d'une émission, mais si on enregistre de "un peu avant" (durant la pub par exemple) à "un peu après", on dirait que le changement d'émission fout le bordel.
 
 
Bref comment feriez-vous à ma place ? Sachant que si personne n'a de solution miracle je vais découper la video en morceaux pour les traiter séparement :/
 
 
Les outils video dont j'ai entendu parler :
 
mplayer/mencoder :
http://www.mplayerhq.hu/
 
avidemux :  
http://fixounet.free.fr/avidemux/
http://fr.lprod.org/wiki/doku.php?id=video:avidemux  
 
kdeenlive :  
http://kdenlive.org/
http://fr.lprod.org/wiki/doku.php?id=video:kdenlive
 
cinelerra :
http://www.cinelerra.org/
http://fr.lprod.org/wiki/doku.php?id=video:cinelerra
 
kino :
http://www.kinodv.org/
 
jahshaka :
http://www.jahshaka.org/
 
virtualdub over wine (parait que  ca marche bien :D)


Message édité par Xavier_OM le 21-06-2007 à 10:45:37

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 21-06-2007 à 10:44:03   

Reply

Marsh Posté le 21-06-2007 à 13:27:07    

Pas de méthode précise pour t'indiquer comment faire, mais quelques idées.
 
Tout d'abord, je chercherais déjà s'il n'est pas possible de forcer un ratio fixe dès l'enregistrement ; un traitement postérieur de la vidéo ça implique des manips en plus (parfois complexes), c'est long, ça bouffe des ressources, etc. avec le risque en plus de dégradation de qualité de l'original si de mauvais paramètres sont appliqués...
 
Faut donc déjà dans un premier temps chercher du côté des options que propose Kaffeine pour l'acquisition du flux. Sinon tu peux jeter un oeil également du côté de VLC, qui permet aussi de faire ce type d'acquisition et dispose de fonctions permettant de gérer le ratio et le cropping vidéo ou encore de mplayer qui doit sans doute également disposer de ce type de fonctionnalité.
 
Si malgré tout tu ne parviens pas à trouver des options satisfaisantes pour cela et que tu dois recourir au traitement postérieur de la vidéo, il reste la possibilité d'explorer les nombreux paramètres de mencoder qui propose une sacré palette d'outils et de filtres en tout genre.
 
Un autre soft qui n'est pas dans ta liste et qui peut faire ce genre de boulot, c'est transcode :
   ---> http://www.transcoding.org/cgi-bin/transcode
   ---> http://www.transcoding.org/cgi-bin [...] ne_Options
   ---> http://www.transcoding.org/cgi-bin [...] o_Resizing
   ---> http://www.transcoding.org/cgi-bin [...] o_Clipping
 
C'est pas super-trivial en terme d'utilisation (comme mencoder), mais très puissant et il y a la possibilité d'utiliser des nombreux utilitaires (scripts essentiellement) spécialisés pour différents type de traitement. Il y a également pas mal d'interfaces graphiques pour le traitement vidéo qui repose sur transcode.


---------------
THRAK (def.) : 1) A sudden and precise impact moving from intention, direction and commitment, in service of an aim. 2) 117 guitars almost striking the same chord simultaneously.
Reply

Marsh Posté le 21-06-2007 à 18:46:54    

Citation :

Comment éviter la désynchronisation son/image ?


http://sourceforge.net/projects/project-x/
Un guide très complet :
http://www.doom9.org/index.html?/D [...] lguide.htm
Ensuite les valeurs que tu donnes ne semble pas bonne (768*576 et 1024*576) mais celles après désanamorphose.
Exemple :
Le flux France 4 récupéré sur Freebox s'affiche en 768x576 (c'est du mpeg ts) dans mplayer mais sa taille réelle est de 544x576 (le flux est anamorphique). Les logs de mplayer le confirme :

Citation :

Movie-Aspect is 1.33:1 - prescaling to correct movie aspect.
VO: [xv] 544x576 => 768x576 Planar YV12  [zoom]


En fait des marqueurs dans le flux ts indiquent la résolution à afficher (1.33:1). Hors lors d'une conversion en divx ces marqueurs sont perdus, c'est pour ça qu'il faut retailler la vidéo. Ta vidéo ne change donc pas de taille mais des marqueurs (4/3, 16/9) se succèdent.
 
Que quelqu'un me détrompe car je ne suis pas non plus un spécialiste dans le domaine.


---------------
La réponse est 42
Reply

Marsh Posté le 22-06-2007 à 09:55:25    

Intéressant tout ça  :jap:


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 22-06-2007 à 16:21:22    

Je m'intéresse au même problème en ce moment pour des raisons totalement différentes mais voici une super page qui explique pas mal de choses sur le rapport d'aspect :
http://inferno.slug.org/cgi-bin/tr [...] pect_Ratio

 

Par contre amha, si le rapport d'aspect change au cours de la vidéo tu va être obligé de découper le truc à moins de pouvoir scripter l'encoder pour qu'il change de rapport d'aspect au bon moment quand ca change dans la vidéo. Il y a peu être moyen de scripter ca si le format que tu a en source indique le moment où le rapport d'aspect change.
Certains lecteurs video comme vlc adaptent la taille horiz ou vert pour converser le rapport d'aspect. Avec mplayer c'est plus aléatoire.
En gros le rapport d'aspect c'est h/v et ca doit rester correct pour ne pas déformer la video. Rapport classique TV : 4/3 ou 16/9 Exemple :
J'ai une video de base en 1350x1384. Je veux la faire tenir sur un écran 1024x768.
On fait une règle de trois
1350 1384
1024    y=?

 

OU
1350 1384
   x=?     768

 

Cela donne

 

Dans le cas 1 y=1049 ca ne va pas c'est trop grand
cas 2 x= 749

 

Pour adapter la taille correctement on doit donc utiliser la solution 2 pour que ca tienne dans l'écran.
Ensuite il faut ajouter des bandes noires pour que le rapport d'aspect soit correct car sinon ce boulet de codec ne veut pas encoder. Sinon tu découpe l'image "clipping" ou "letterboxing" qu'ils appelent ca :)

 

taille voulue : x = 1024
taille obtenue x = 749
soit 1024 - 749 = 275 px de bandes noires.
275/2= 137,5 = 136 + 138

 

Soit -Z 749x768

 

on utilise l'option -Y pour ajouter des bandes noires
dans ce cas c'est on ajoute des bandes noires a gauche et a droite.
soit :

 

-Y 0,-138,0,-136

 

Bon ca ne marche pas dans tous les cas, erreurs bizarres pour la conversion yuv2rgb dans mon cas, je poste pour updater + tard

 

EDIT : apparemment l'option -Y centre obligatoirement l'image.
On doit donc dans mon cas utiliser les paramètres suivants :

 

-Z 750x768 -Y 0,-137,0,-137

 

C'est en gros ce qui est expliqué sur la page de wiki, la 3e page citée par THR4K

 

EDIT2 : transcode permet de faire ca automatiquement avec -ZdimX,dimY,fast mais chez moi camarchepa


Message édité par enfoiro le 22-06-2007 à 17:07:15
Reply

Marsh Posté le 23-06-2007 à 13:26:47    

Bon je vais scripter un truc pour découper tout ca, recoder les morceaux en fonction des marqueurs de ratio (ou en indiquant les tailles voulues en dur si je trouve pas) et recoller le tout.

 

Et faut aussi que je pense à faire un bug report sur avidemux, en fait ce qui fait tout foirer c'est le filtre qui ajoute les bandes noires quand il est utilisé dans le filtre "Partial" (de telle frame à telle frame) :D


Message édité par Xavier_OM le 23-06-2007 à 13:28:08

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 24-06-2007 à 11:54:00    

Bonjour
 
Je me permet d'intervenir pour quelques précisions techniques. :wahoo:  
Pour faire simple:
La TNT, c'est du DVB-T (Digital Video Broadcasting - Terrestrial).
 
En DVB on transmet des multiplexes vidéo, 1 par bande de fréquence.
 
Chaque multiplex vidéo contient un ensembles de chaines.
En MPEG, le multiplex s'appelle un Transport Stream. La chaine s'appelle un Program Stream.
 
Chaque Program est indépendant des autres au niveau du contenu (le son d'une chaine ne doit pas se retrouver avec l'image d'une autre),
mais pas au niveau de sa norme, commune à tous les Program d'un Transport.
 
Chaque program choisi et envoi dans son flux vidéo un code de ratio, c'est a dire la fraction qui correspond à la dimension de l'image finale que l'on veut obtenir.
 
Exemple:
Le mux qui contient TF1, c'est du 720x576 (1,25)
Le mux qui contient M6, c'est du 704x576 (1,22)
Le mux de France Television, qui contient ARTE, c'est du 544x576 (0,94)
 
Quand TF1, M6 ou ARTE envoie un programme indiqué 4/3, c'est votre appli de lecture qui la déformer (redimensionner) pour que la nouvelle taille, quand on la divise L/H = 4/3. De façon classique, sur PC, on obtient, 768x576. Pour le 16/9: 1024x576.
768x576 et 1024x576 ne sont pas normalisés ni utilisables en MPEG 2 pour le DVB.
 
Pour vos problèmes
 
Xavier_OM:
Traite ta vidéo en morceaux: le 4/3 avec un profil 4/3, le 16/9 avec du 16/9. C'est toi qui décide quand couper l'image, quand mettre des bandes noires, car c'est suivant le contenu. Tu conforme tous tes morceaux avec le même ratio, le même format, la même résolution. Et après tu les colles bout à bout. C'est la méthode la moins casse-gueule.  :p  
 
twocats:
Tu en étais pas loin.  ;)  
 
Dernière chose:
Ne vous fiez pas aux comportements de vos lecteurs au niveau de la résolution et du ratio. Il n'y a pas de norme pour l'affichage sur PC, chacun voit midi à sa porte.
 
Si j'ai le temps, je vous parlerais du décalage image/son.

Reply

Marsh Posté le 28-06-2007 à 00:06:23    

Bon ben voilà ce que ca donne... jle poste, des fois que quelqu'un en ait besoin un jour...

 


#!/bin/bash
##########################################################################
# Shellscript: carver
# Date       : 2007-06-27
# Category   : Multimedia
# Requires   : mplayer/mencoder>=1.0pre7, bc
# Version    : 1.0
##########################################################################
# Description
#   carver cut a movie in different parts with different resolutions,
#   following an instruction file. Then it concatenates all parts into
#   a single file, adding black borders when needed.
#
#   An instruction file is a text file containing some lines structured
#   as:
#       hh:mm:ss.ms hh:mm:ss.ms w:h
#       hh:mm:ss.ms hh:mm:ss.ms w:h
#       hh:mm:ss.ms hh:mm:ss.ms w:h
#   with on one line:
#       - first hh:mm:ss.ms  as beginning time
#       - second hh:mm:ss.ms as ending time
#       - w:h as encoding resolution in pixel
#
#   Some files don't have 0 for time origin. If you record
#   a stream at 16h15, time origin could be 16h15 sometimes.
#   By default, carver runs
#       mplayer -ignore-start
#   so if your want to cut from eighth to ninth minute, please write:
#       00:08:00 00:09:00 320:240
#   and not:
#       16:23:00 16:24:00 320:240
#
##########################################################################

 


Usage() {
    cat << EOF
Syntax : $0 instructions_file input_file output_file
EOF
    exit 1
} #Usage()

 

[ $# -ne 3 ] && Usage

   


INFO=$1
shift

 

SRC=$1
shift

 

OUT=$1
shift

 

NAME="`echo $0 | grep -o "[^/]*$"`" # /path/to/carver => carver

 

declare -a TMP_FILES

 

############
# CLEANING #
############
Clean() {
    rm ${TMP_FILES[@]}
} # Clean ()

 

# Assures temporary files are removed at program termination (0)
trap "Clean" 0
trap "Error Signal trapped !" 1 2 3 13 15 # NB: also triggers trap for signal 0
                                          # before script terminates

  

date_diff() {
# Returns, in ss.ms formatted time, the absolute value
# of the difference between two HH:mm:ss.ms formatted time
#
# Usage: date_diff $1 $2
    local i_DATE1=`date --date="$1" "+%s.%N"`
    local i_DATE2=`date --date="$2" "+%s.%N"`

 

   local i_DIFF=`echo "$i_DATE2 - $i_DATE1" | bc`

 

   local i_ABS
    if [ `echo $i_DIFF | cut -d '.' -f 1` -lt 0 ]; then
        i_ABS=-1
    else
        i_ABS=1
    fi

 

   echo "$i_DIFF * $i_ABS" | bc

 

} #date_diff()

   

##########################
# FINDING MAX WIDTH:HEIGHT
##########################
WIDTH=0
HEIGHT=0
while read LINE; do
    WH=`echo $LINE | cut -d ' ' -f 3`
    W=`echo  $WH   | cut -d ':' -f 1`
    H=`echo  $WH   | cut -d ':' -f 2`

 

   [ $W -gt $WIDTH ]  && WIDTH=$W
    [ $H -gt $HEIGHT ] && HEIGHT=$H
done < $INFO

 


########
# MAIN #
########

 

# ENCODING
CPT=0
while read LINE; do
    TMP_FILES[$CPT]="$SRC.$NAME$CPT"
    START=`echo  $LINE | cut -d ' ' -f 1`
    STOP=`echo   $LINE | cut -d ' ' -f 2`
    FORMAT=`echo $LINE | cut -d ' ' -f 3`

 

   LENGTH=`date_diff $START $STOP`

 

   mencoder        \
    -ignore-start   \
    -ss $START -endpos $LENGTH \
    -ovc lavc -oac lavc \
    -lavcopts vcodec=mpeg4:vqcomp=0.6:vmax_b_frames=2:vb_strategy=2:brd_scale=3:vbitrate=1500:acodec=ac3 \
    -vf scale=$FORMAT,expand=$WIDTH:$HEIGHT \
    -o "${TMP_FILES[$CPT]}" \
    "$SRC"

 

   ((CPT++))
done < $INFO

 

# CONCATENATE
mencoder -ovc copy -oac copy -o $OUT ${TMP_FILES[@]}

 

# autocleaning on exit because of trapping signals
exit 0


Message édité par Xavier_OM le 25-03-2011 à 17:12:51

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 28-06-2007 à 09:53:29    

Ca aurait été interessant de coder en dur les différents cas: 4/3 > 4/3, 4/3 > 16/9, 16/9 > 4/3, 16/9 > 16/9.
 
Pour les morceaux codés avec mencoder, le conseil que je donnerais, serait de faire un MPEG 2 en sortie et non pas un MPEG 4.
 
Reserve le MPEG 4 pour ton fichier final.
(au lieu de faire des -ovc copy -oac copy, tu fait ton MPEG 4).
 
Deux transcodages, mais tu y gagnera en qualité et évitera des défauts de fichier mal coupés/mal collés.
 
Tu a vraiment besoin de faire de l'AC3 ?

Reply

Marsh Posté le 28-06-2007 à 10:21:56    

HDSDI a écrit :

Ca aurait été interessant de coder en dur les différents cas: 4/3 > 4/3, 4/3 > 16/9, 16/9 > 4/3, 16/9 > 16/9.
 
Pour les morceaux codés avec mencoder, le conseil que je donnerais, serait de faire un MPEG 2 en sortie et non pas un MPEG 4.
 
Reserve le MPEG 4 pour ton fichier final.
(au lieu de faire des -ovc copy -oac copy, tu fait ton MPEG 4).
 
Deux transcodages, mais tu y gagnera en qualité et évitera des défauts de fichier mal coupés/mal collés.
 
Tu a vraiment besoin de faire de l'AC3 ?


 
Beaucoup de questions qui attendent beaucoup de réponses ! J'ai vraiment fais ça à l'arrache, pour voir si l'enchaînement des étapes de découpages/resizing/ajout de bandes noires/concaténation était possible, j'ai pas réfléchi aux codecs  :D  
 
Je comprends pas trop ton idée de coder "en dur" certaines transfos, je vois pas l'intérêt vu que là je peux choisir la taille que je veux pour chaque morceau...
Par contre, et à moins que ca n'entraîne de gros pb d'espace disque, c'est mieux de garder le mpeg4 pour la fin tu as raison :jap:  
 
 :hello:  
 
PS : si je trouve comment détecter les changements de tailles automatiquement, on pourrait générer le fichier d'instructions  :bounce:


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 28-06-2007 à 10:21:56   

Reply

Marsh Posté le 30-06-2007 à 00:43:15    

Citation :

PS : si je trouve comment détecter les changements de tailles automatiquement, on pourrait générer le fichier d'instructions


Code :
  1. mplayer fichier.mpg -nosound -vo null -speed 10 > changetaille.log


En gros tu lis la vidéo à x10 et tu génère un fichier de log. Dans mon fichier de test j'ai trouvé ça  :)  :

Code :
  1. VO: [null] 544x576 => 1024x576 Mpeg PES  [zoom]
  2. V:   0.0   1/  1 ??% ??% ??,?% 0 0 10.00x 


C'est le ratio de départ. Puis un premier changement :

Code :
  1. VO: [null] 544x576 => 768x576 Mpeg PES  [zoom]
  2. V: 223.4 5583/5583  0%  0%  0.0% 0 0 10.00x 


Soit à 223.4 secondes un passage en 4/3. Ensuite :

Code :
  1. VO: [null] 544x576 => 1024x576 Mpeg PES  [zoom]
  2. V: 231.2 5777/5777  0%  0%  0.0% 0 0 10.00x 


A 231.2 secondes un dernier changement en 16/9 (mon fichier de test ne faisait que quelques minutes.
Cela ne marche que si tu passes ton fichier par ProjectX et que tu le remultiplexe avec mplex :

Code :
  1. mplex -f 8 -o fichier.mpg fichier.m2v fichier.mp2


sinon les marqueurs de temps sont foireux.


---------------
La réponse est 42
Reply

Marsh Posté le 30-06-2007 à 08:39:19    

Oué j'avais commencé un truc du genre (merci pour le coup de main  :jap: ) sauf qu'au changement de ratio j'ai pas les infos temporelles moi :/

 

Pour les marqueurs de temps c'est pas simplement un -ignore-start qu'il te faudrait par hasard ? Sinon on peut aussi créer un fichier edl et foutre -hr-edl-seek ptet...


Message édité par Xavier_OM le 30-06-2007 à 12:00:00

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed