Capture d'écran de vlc en plein streamEn 2010 nos objectifs étaient multiples :

  1. Enregistrer les vidéos en HDV dans les 3 principales salles afi de les encoder en XVID pour les proposer ensuite au téléchargement sur le site vidéos du FOSDEM;
  2. Diffuser le signal vidéo d'au moins une salle est live-streaming.

Les différentes étapes que nous détaillerons ici seront donc :

  1. Les jours précédant le FOSDEM : préparation des images de titres;
  2. Le jour même: capture et streaming :
    1. Acquérir un flux vidéo directement sur un disque dur dans un format haute-définition;
    2. Envoyer le fichier vidéo ainsi créé sur un serveur de streaming;
    3. Encoder la vidéo sur le serveur de streaming dans un format adéquat pour être diffusé;
    4. Diffuser la vidéo en live-streaming;
  3. Les jours suivants: encodage en xvid :
    1. Encoder toutes les pistes vidéos obtenues dans un format permettant une mise en ligne;

Toutes ces étapes sont détaillés dans les pages suivantes:

Jours J-1 : Préparation des images de titre

Création des images de titre, à insérer au début de chaque conférence

Logiciels et bibliothèques nécessaires

InkScape : logiciel d'édition d'images vectorielles (format SVG).

Méthode

Image du svg rempli avec les valeurs du csvChaque vidéo commencera avec une image de titre comprenant le nom de l'orateur, le titre de la conférence, le lieu et la date de l'enregistrement, tant de données qui sont connues dans les jours précédent le FOSDEM. Il est donc possible de les préparer à l'avance, histoire de pouvoir commencer l'encodage des vidéos au plus tôt.

Cette  image de titre est généralement suivie par les logos du FOSDEM et de notre association, et enfin le début de la conférence. De même, chaque film se termine par l'image des deux logos.

Pour automatiser la procédure de création des images, nous utilisons un fichier svg comme modèle, en y incluant les zones de texte à éditer. Nous préparons également un fichier CSV comprenant toutes les phrases à ajouter dans chaque svg, et un script qui, pour chaque ligne du csv, créera un fichier svg auto-complété, puis l'exportera en png.

Le fichier svg de référence doit contenir 6 champs de textes, dans lesquels seront placées les 6 valeurs du fichier csv, défini selon le modèle suivant :

"Jour Date";"Titre";"Sous-titre";"Orateur(s)";"Lieu";"nom_du_repertoire_final"

Structure du fichier data.csv (2 lignes en exemple):

"Saturday 2010-02-06";"Welcome";"FOSDEM Opening Talk ";"FOSDEM Staff";"Room Janson";"jan_sat_mo1_welcome"
"Saturday 2010-02-06";"Promoting Open Source Methods";" at a Large Company";"Brooks Davis";"Room Janson";"jan_sat_mo2_company"

Structure du fichier titre.svg de référece :

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="1024"
   height="576"
   id="svg2"
   sodipodi:version="0.32"
   inkscape:version="0.46"
   version="1.0"
   sodipodi:docbase="/home/jfw/FOSDEM"
   sodipodi:docname="titre.svg"
   inkscape:output_extension="org.inkscape.output.svg.inkscape"
   inkscape:export-filename="/media/disk-1/Janson/welcome/titre-welcome.png"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90">
  <defs
     id="defs4">
    <inkscape:perspective
       sodipodi:type="inkscape:persp3d"
       inkscape:vp_x="0 : 288 : 1"
       inkscape:vp_y="0 : 1000 : 0"
       inkscape:vp_z="1024 : 288 : 1"
       inkscape:persp3d-origin="512 : 192 : 1"
       id="perspective76" />
    <linearGradient
       id="linearGradient3186">
      <stop
         style="stop-color:#000000;stop-opacity:1;"
         offset="0"
         id="stop3188" />
      <stop
         style="stop-color:#000000;stop-opacity:0;"
         offset="1"
         id="stop3190" />
    </linearGradient>
    <linearGradient
       inkscape:collect="always"
       id="linearGradient4154">
      <stop
         style="stop-color:#000000;stop-opacity:1;"
         offset="0"
         id="stop4156" />
      <stop
         style="stop-color:#000000;stop-opacity:0;"
         offset="1"
         id="stop4158" />
    </linearGradient>
    <linearGradient
       inkscape:collect="always"
       id="linearGradient4146">
      <stop
         style="stop-color:#658bae;stop-opacity:1;"
         offset="0"
         id="stop4148" />
      <stop
         style="stop-color:#658bae;stop-opacity:0;"
         offset="1"
         id="stop4150" />
    </linearGradient>
    <linearGradient
       inkscape:collect="always"
       xlink:href="#linearGradient4146"
       id="linearGradient4152"
       x1="12.625"
       y1="43.185758"
       x2="225.70312"
       y2="43.185758"
       gradientUnits="userSpaceOnUse" />
    <linearGradient
       inkscape:collect="always"
       xlink:href="#linearGradient4154"
       id="linearGradient4160"
       x1="12.625"
       y1="43.185758"
       x2="225.70312"
       y2="43.185758"
       gradientUnits="userSpaceOnUse" />
    <linearGradient
       inkscape:collect="always"
       xlink:href="#linearGradient4146"
       id="linearGradient4170"
       gradientUnits="userSpaceOnUse"
       x1="12.625"
       y1="43.185758"
       x2="225.70312"
       y2="43.185758" />
    <linearGradient
       inkscape:collect="always"
       xlink:href="#linearGradient4154"
       id="linearGradient4172"
       gradientUnits="userSpaceOnUse"
       x1="12.625"
       y1="43.185758"
       x2="225.70312"
       y2="43.185758" />
    <radialGradient
       inkscape:collect="always"
       xlink:href="#linearGradient3186"
       id="radialGradient2459"
       gradientUnits="userSpaceOnUse"
       gradientTransform="matrix(1.0897038,0,0,1.4446528e-2,-45.950908,284.9511)"
       cx="512.0207"
       cy="288"
       fx="512.0207"
       fy="288"
       r="429.48148" />
    <radialGradient
       inkscape:collect="always"
       xlink:href="#linearGradient3186"
       id="radialGradient2484"
       gradientUnits="userSpaceOnUse"
       gradientTransform="matrix(1.0897038,0,0,1.4446528e-2,-45.950908,284.9511)"
       cx="512.0207"
       cy="288"
       fx="512.0207"
       fy="288"
       r="429.48148" />
    <radialGradient
       inkscape:collect="always"
       xlink:href="#linearGradient3186"
       id="radialGradient2499"
       gradientUnits="userSpaceOnUse"
       gradientTransform="matrix(1.0897038,0,0,1.4446528e-2,-45.950908,324.90345)"
       cx="512.0207"
       cy="288"
       fx="512.0207"
       fy="288"
       r="429.48148" />
  </defs>
  <sodipodi:namedview
     id="base"
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1.0"
     inkscape:pageopacity="1"
     inkscape:pageshadow="2"
     inkscape:zoom="0.98994949"
     inkscape:cx="786.78317"
     inkscape:cy="297.75278"
     inkscape:document-units="px"
     inkscape:current-layer="layer1"
     width="1024px"
     height="576px"
     inkscape:window-width="1274"
     inkscape:window-height="742"
     inkscape:window-x="4"
     inkscape:window-y="46"
     showgrid="true"
     showguides="true"
     inkscape:guide-bbox="true">
    <inkscape:grid
       type="xygrid"
       id="grid2501" />
  </sodipodi:namedview>
  <metadata
     id="metadata7">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g
     inkscape:label="Calque 1"
     inkscape:groupmode="layer"
     id="layer1"
     style="display:inline">
    <g
       id="g5145">
      <flowRoot
         transform="translate(-2.125,-10.865446)"
         style="font-size:28px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
         id="flowRoot2178"
         xml:space="preserve"><flowRegion
           style="fill:url(#linearGradient4152);fill-opacity:1;stroke:url(#linearGradient4160)"
           id="flowRegion2180"><rect
             style="font-size:28px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
             y="23.142857"
             x="10"
             height="86.428581"
             width="279.99994"
             id="rect2182" /></flowRegion><flowPara
           style="font-size:28px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
           id="flowPara2184">FOSDEM 2010</flowPara></flowRoot>      <flowRoot
         transform="translate(656.96875,-10.881071)"
         style="font-size:28px;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
         id="flowRoot4162"
         xml:space="preserve"><flowRegion
           style="fill:url(#linearGradient4170);fill-opacity:1;stroke:url(#linearGradient4172)"
           id="flowRegion4164"><rect
             style="font-size:28px;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
             y="23.142857"
             x="10"
             height="73.989853"
             width="347.0192"
             id="rect4166" /></flowRegion><flowPara
           style="font-size:28px;text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
           id="flowPara4168">
namurlugdate
</flowPara></flowRoot>    </g>
    <flowRoot
       xml:space="preserve"
       id="flowRoot6160"
       style="font-size:28px;text-align:center;text-anchor:middle;display:inline"
       transform="translate(-224.70341,171.035)"
       inkscape:export-filename="/media/disk-1/Janson/debian/titre-debian.png"
       inkscape:export-xdpi="90"
       inkscape:export-ydpi="90"><flowRegion
         id="flowRegion6162"><rect
           id="rect6164"
           width="1023.2845"
           height="49.497486"
           x="224.25386"
           y="356.79691"
           style="font-size:28px;text-align:center;text-anchor:middle" /></flowRegion><flowPara
         id="flowPara6166">namurlugroom</flowPara></flowRoot>    <rect
       style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0999999;stroke-dasharray:none;stroke-opacity:1"
       id="rect6141"
       width="1028.3353"
       height="581.84784"
       x="-3.0304718"
       y="-5.8478661" />
    <g
       id="g2541"
       inkscape:label="Layer 1"
       transform="matrix(1.4583334,0,0,1.4583334,849.45179,514.75)">
      <g
         inkscape:export-ydpi="300.23013"
         inkscape:export-xdpi="300.23013"
         inkscape:export-filename="/mnt/hgfs/Bov/Documents/Work/2007/cc/identity/srr buttons/big/by-nc-sa.png"
         id="g117"
         transform="matrix(0.9937808,0,0,0.9936696,-437.12334,-74.436914)">
        <path
           style="fill:#aab2ab"
           d="M 443.28857,75.3667 L 557.35205,75.56934 C 558.9458,75.56934 560.36963,75.33301 560.36963,78.75 L 560.22998,116.31689 L 440.40967,116.31689 L 440.40967,78.61035 C 440.40967,76.92529 440.57275,75.3667 443.28857,75.3667 z "
           nodetypes="ccccccc"
           id="path3817_5_" />
        <path
           id="path120"
           d="M 558.34912,74.91113 L 442.12061,74.91113 C 440.87354,74.91113 439.85889,75.92578 439.85889,77.17236 L 439.85889,116.66845 C 439.85889,116.95019 440.08741,117.1787 440.36963,117.1787 L 560.09912,117.1787 C 560.38135,117.1787 560.60986,116.95018 560.60986,116.66845 L 560.60986,77.17236 C 560.60986,75.92578 559.59521,74.91113 558.34912,74.91113 z M 442.12061,75.93262 L 558.34913,75.93262 C 559.03272,75.93262 559.58839,76.48877 559.58839,77.17237 C 559.58839,77.17237 559.58839,93.06934 559.58839,104.56641 L 476.51515,104.56641 C 473.47023,110.07227 467.60304,113.81055 460.87062,113.81055 C 454.13624,113.81055 448.27101,110.07569 445.22804,104.56641 L 440.88038,104.56641 C 440.88038,93.06934 440.88038,77.17237 440.88038,77.17237 C 440.88037,76.48877 441.43701,75.93262 442.12061,75.93262 z " />
        <g
           transform="matrix(0.872921,0,0,0.872921,50.12536,143.2144)"
           id="g5908_5_">
          <path
             style="fill:#ffffff"
             d="M 486.26599,-55.7066 C 486.27154,-47.02581 479.2381,-39.9851 470.55786,-39.97952 C 461.87768,-39.9739 454.83636,-47.00738 454.83081,-55.68762 C 454.83081,-55.69433 454.83081,-55.69989 454.83081,-55.7066 C 454.82519,-64.38739 461.85864,-71.4281 470.53888,-71.43371 C 479.22022,-71.43871 486.26148,-64.40588 486.26599,-55.72564 C 486.26599,-55.71948 486.26599,-55.71277 486.26599,-55.7066 z "
             rx="22.939548"
             type="arc"
             cy="264.3577"
             ry="22.939548"
             cx="296.35416"
             id="path5906_5_" />
          <g
             transform="translate(-289.6157,99.0653)"
             id="g5706_5_">
            <path
               d="M 772.94165,-167.5741 C 776.42651,-164.08869 778.16943,-159.82074 778.16943,-154.77191 C 778.16943,-149.72253 776.45666,-145.49988 773.03112,-142.10397 C 769.39526,-138.52795 765.09936,-136.74023 760.14111,-136.74023 C 755.24328,-136.74023 751.02124,-138.51287 747.47717,-142.05978 C 743.93078,-145.60504 742.15869,-149.84222 742.15869,-154.77191 C 742.15869,-159.7005 743.93078,-163.96789 747.47717,-167.5741 C 750.93176,-171.06061 755.15381,-172.80359 760.14111,-172.80359 C 765.18994,-172.80359 769.45569,-171.06061 772.94165,-167.5741 z M 749.82312,-165.22925 C 746.87634,-162.25287 745.40295,-158.76636 745.40295,-154.76746 C 745.40295,-150.76856 746.86181,-147.31165 749.77722,-144.39624 C 752.69482,-141.47974 756.16626,-140.02148 760.19482,-140.02148 C 764.22338,-140.02148 767.72497,-141.49429 770.7019,-144.44043 C 773.52783,-147.17688 774.94079,-150.6181 774.94079,-154.76746 C 774.94079,-158.88495 773.50439,-162.38038 770.63256,-165.25165 C 767.76195,-168.12226 764.28271,-169.55817 760.19482,-169.55817 C 756.10693,-169.55817 752.64783,-168.11499 749.82312,-165.22925 z M 757.57703,-156.52606 C 757.12732,-157.50775 756.45386,-157.9989 755.55432,-157.9989 C 753.9657,-157.9989 753.17139,-156.92883 753.17139,-154.78979 C 753.17139,-152.65026 753.9657,-151.58129 755.55432,-151.58129 C 756.60376,-151.58129 757.35327,-152.10204 757.80298,-153.14587 L 760.00574,-151.97284 C 758.95532,-150.10736 757.38013,-149.17383 755.28028,-149.17383 C 753.66028,-149.17383 752.36256,-149.67053 751.38819,-150.66339 C 750.41273,-151.6568 749.92493,-153.02673 749.92493,-154.77191 C 749.92493,-156.48694 750.42835,-157.84845 751.43299,-158.85693 C 752.43751,-159.86547 753.69056,-160.3695 755.1908,-160.3695 C 757.41138,-160.3695 759,-159.49462 759.96216,-157.74664 L 757.57703,-156.52606 z M 767.94092,-156.52606 C 767.49011,-157.50775 766.82886,-157.9989 765.9585,-157.9989 C 764.33753,-157.9989 763.52637,-156.92883 763.52637,-154.78979 C 763.52637,-152.65026 764.33753,-151.58129 765.9585,-151.58129 C 767.01014,-151.58129 767.74622,-152.10204 768.16578,-153.14587 L 770.41773,-151.97284 C 769.36951,-150.10736 767.79664,-149.17383 765.70008,-149.17383 C 764.0824,-149.17383 762.78809,-149.67053 761.81361,-150.66339 C 760.84144,-151.6568 760.35365,-153.02673 760.35365,-154.77191 C 760.35365,-156.48694 760.84816,-157.84845 761.83717,-158.85693 C 762.82496,-159.86547 764.08241,-160.3695 765.61061,-160.3695 C 767.8268,-160.3695 769.41432,-159.49462 770.37196,-157.74664 L 767.94092,-156.52606 z "
               id="path5708_5_" />
          </g>
        </g>
        <g
           id="g126">
          <circle
             style="fill:#ffffff"
             sodipodi:ry="10.80615"
             sodipodi:rx="10.80615"
             sodipodi:cy="90.231934"
             sodipodi:cx="491.94629"
             id="circle128"
             r="10.80615"
             cy="90.231934"
             cx="491.94629" />
          <g
             id="g130">
            <path
               id="path132"
               d="M 495.07373,87.10498 C 495.07373,86.68848 494.73584,86.35107 494.31982,86.35107 L 489.54736,86.35107 C 489.13134,86.35107 488.79345,86.68847 488.79345,87.10498 L 488.79345,91.87793 L 490.1245,91.87793 L 490.1245,97.52979 L 493.74169,97.52979 L 493.74169,91.87793 L 495.07372,91.87793 L 495.07372,87.10498 L 495.07373,87.10498 z " />
            <circle
               sodipodi:ry="1.63232"
               sodipodi:rx="1.63232"
               sodipodi:cy="84.090332"
               sodipodi:cx="491.93359"
               id="circle134"
               r="1.63232"
               cy="84.090332"
               cx="491.93359" />
          </g>
          <path
             style="fill-rule:evenodd"
             id="path136"
             d="M 491.91846,78.3252 C 488.68701,78.3252 485.95069,79.45313 483.71143,81.70899 C 481.41358,84.04249 480.26514,86.80469 480.26514,89.99366 C 480.26514,93.18263 481.41358,95.9253 483.71143,98.22071 C 486.00928,100.51466 488.74561,101.6626 491.91846,101.6626 C 495.13135,101.6626 497.91651,100.50586 500.27295,98.19092 C 502.49268,95.99365 503.60205,93.26123 503.60205,89.99365 C 503.60205,86.72607 502.47314,83.96484 500.21435,81.70898 C 497.95556,79.45312 495.19092,78.3252 491.91846,78.3252 z M 491.94873,80.4248 C 494.59717,80.4248 496.84521,81.35888 498.69482,83.22607 C 500.56494,85.07324 501.49951,87.32959 501.49951,89.99365 C 501.49951,92.67724 500.58447,94.90429 498.75342,96.67431 C 496.82569,98.58007 494.55713,99.53271 491.94873,99.53271 C 489.33838,99.53271 487.08935,98.58984 485.20068,96.70312 C 483.31201,94.81689 482.36767,92.58056 482.36767,89.99365 C 482.36767,87.40674 483.32177,85.15136 485.22997,83.22607 C 487.06104,81.35889 489.30029,80.4248 491.94873,80.4248 z "
             clip-rule="evenodd" />
        </g>
        <g
           id="g138"
           enable-background="new    ">
          <path
             style="fill:#ffffff"
             id="path140"
             d="M 488.56299,107.86719 C 488.88037,107.86719 489.17041,107.89551 489.43213,107.95117 C 489.69385,108.00683 489.91846,108.09863 490.10596,108.22656 C 490.29248,108.35351 490.43701,108.52344 490.54053,108.73437 C 490.64307,108.94628 490.69483,109.20703 490.69483,109.51855 C 490.69483,109.85449 490.61866,110.13378 490.46534,110.35742 C 490.313,110.58203 490.08643,110.76465 489.78761,110.9082 C 490.19972,111.02636 490.50734,111.2334 490.71046,111.52929 C 490.91358,111.82518 491.01515,112.18163 491.01515,112.59863 C 491.01515,112.93457 490.94972,113.22558 490.81886,113.47168 C 490.688,113.7168 490.51124,113.91797 490.28956,114.07324 C 490.06886,114.22949 489.81593,114.34472 489.53272,114.41894 C 489.24854,114.49414 488.95752,114.53124 488.65772,114.53124 L 485.42139,114.53124 L 485.42139,107.86718 L 488.56299,107.86718 L 488.56299,107.86719 z M 488.37549,110.5625 C 488.63721,110.5625 488.85205,110.5 489.02002,110.37598 C 489.18897,110.25196 489.27295,110.05078 489.27295,109.77149 C 489.27295,109.61622 489.24463,109.48829 489.18897,109.38965 C 489.13233,109.29004 489.05811,109.21289 488.96436,109.15625 C 488.87061,109.10059 488.76319,109.06152 488.64209,109.04004 C 488.52002,109.01856 488.39404,109.00781 488.26318,109.00781 L 486.89013,109.00781 L 486.89013,110.5625 L 488.37549,110.5625 z M 488.46143,113.39062 C 488.60498,113.39062 488.7417,113.37695 488.87256,113.34863 C 489.00342,113.32031 489.11865,113.27343 489.21924,113.20898 C 489.31885,113.14355 489.39795,113.05468 489.45752,112.94238 C 489.51611,112.83105 489.54639,112.6875 489.54639,112.51367 C 489.54639,112.17187 489.44971,111.92773 489.25635,111.78125 C 489.06299,111.63574 488.80713,111.5625 488.48975,111.5625 L 486.89014,111.5625 L 486.89014,113.39062 L 488.46143,113.39062 z " />
          <path
             style="fill:#ffffff"
             id="path142"
             d="M 491.27393,107.86719 L 492.91651,107.86719 L 494.47706,110.49903 L 496.02882,107.86719 L 497.66261,107.86719 L 495.188,111.97364 L 495.188,114.53126 L 493.71925,114.53126 L 493.71925,111.93653 L 491.27393,107.86719 z " />
        </g>
        <g
           id="g144"
           enable-background="new    ">
          <path
             style="fill:#ffffff"
             id="path146"
             d="M 538.91553,112.88379 C 538.99658,113.03906 539.10303,113.16504 539.23682,113.26172 C 539.37061,113.3584 539.52686,113.42969 539.70752,113.47656 C 539.88721,113.52344 540.07275,113.54687 540.26611,113.54687 C 540.39599,113.54687 540.53564,113.53613 540.68506,113.51367 C 540.8335,113.49219 540.97315,113.45019 541.10401,113.38769 C 541.23389,113.32617 541.34229,113.24023 541.43018,113.13085 C 541.51612,113.02245 541.56006,112.88378 541.56006,112.71581 C 541.56006,112.53515 541.50244,112.38964 541.38721,112.27733 C 541.27295,112.16503 541.12159,112.07225 540.93604,111.99706 C 540.74952,111.92284 540.5376,111.85741 540.30225,111.80077 C 540.06592,111.74511 539.82666,111.68261 539.58448,111.61425 C 539.33546,111.55175 539.09327,111.47558 538.85694,111.38573 C 538.62159,111.29589 538.40967,111.1787 538.22315,111.03514 C 538.0376,110.89256 537.88624,110.71385 537.77198,110.49901 C 537.65675,110.28417 537.59913,110.0244 537.59913,109.71971 C 537.59913,109.37694 537.67237,109.08006 537.81788,108.82811 C 537.96436,108.57616 538.15577,108.3662 538.39112,108.19725 C 538.62745,108.02928 538.89503,107.90526 539.19385,107.8242 C 539.4917,107.74315 539.79053,107.70311 540.08838,107.70311 C 540.43701,107.70311 540.771,107.74217 541.09131,107.8203 C 541.41065,107.89745 541.6958,108.0244 541.94385,108.19823 C 542.19287,108.37303 542.39014,108.59569 542.53662,108.8662 C 542.68213,109.13768 542.75537,109.46581 542.75537,109.85155 L 541.33349,109.85155 C 541.32079,109.65233 541.27978,109.48729 541.20849,109.35741 C 541.1372,109.22655 541.04247,109.12401 540.92431,109.04882 C 540.80712,108.9746 540.67236,108.92089 540.52099,108.89062 C 540.36962,108.85937 540.20361,108.84374 540.02392,108.84374 C 539.90673,108.84374 539.78857,108.85644 539.67138,108.88085 C 539.55322,108.90624 539.44677,108.94921 539.35107,109.01171 C 539.25439,109.07421 539.17627,109.15136 539.11377,109.24511 C 539.05225,109.33886 539.021,109.45702 539.021,109.5996 C 539.021,109.73046 539.04541,109.8369 539.09522,109.91698 C 539.14502,109.99803 539.24268,110.07323 539.38917,110.14159 C 539.53566,110.20995 539.73683,110.27831 539.99464,110.34667 C 540.25245,110.41503 540.59034,110.50292 541.00636,110.60839 C 541.13038,110.6328 541.30324,110.6787 541.52296,110.74413 C 541.74366,110.80956 541.96339,110.91308 542.18019,111.05663 C 542.39796,111.20018 542.58546,111.39159 542.74464,111.63085 C 542.90284,111.87011 542.98194,112.17675 542.98194,112.55077 C 542.98194,112.85546 542.92237,113.13866 542.80421,113.40038 C 542.68605,113.6621 542.51026,113.88768 542.27687,114.07714 C 542.04347,114.26757 541.75441,114.41503 541.40871,114.5205 C 541.06398,114.62695 540.66457,114.67968 540.20949,114.67968 C 539.8423,114.67968 539.48683,114.63378 539.14113,114.54394 C 538.79543,114.45312 538.49074,114.31152 538.22707,114.11816 C 537.96242,113.9248 537.75246,113.67773 537.59621,113.3789 C 537.44094,113.08007 537.36574,112.72558 537.37258,112.31445 L 538.79446,112.31445 C 538.79443,112.53809 538.83447,112.72852 538.91553,112.88379 z " />
          <path
             style="fill:#ffffff"
             id="path148"
             d="M 547.17236,107.86719 L 549.66455,114.53125 L 548.14307,114.53125 L 547.63916,113.04687 L 545.14697,113.04687 L 544.62353,114.53125 L 543.14892,114.53125 L 545.66943,107.86719 L 547.17236,107.86719 z M 547.25635,111.95312 L 546.41651,109.50976 L 546.39698,109.50976 L 545.52979,111.95312 L 547.25635,111.95312 z " />
        </g>
        <g
           id="g150"
           enable-background="new    ">
          <path
             style="fill:#ffffff"
             id="path152"
             d="M 512.83057,107.86719 L 515.61475,112.33789 L 515.63037,112.33789 L 515.63037,107.86719 L 517.00537,107.86719 L 517.00537,114.53125 L 515.53955,114.53125 L 512.76611,110.06934 L 512.74756,110.06934 L 512.74756,114.53125 L 511.37256,114.53125 L 511.37256,107.86719 L 512.83057,107.86719 z " />
          <path
             style="fill:#ffffff"
             id="path154"
             d="M 522.56885,109.64258 C 522.48194,109.50196 522.37256,109.37891 522.2417,109.27344 C 522.11084,109.16797 521.96338,109.08496 521.79834,109.02637 C 521.6333,108.9668 521.46045,108.9375 521.28076,108.9375 C 520.95068,108.9375 520.67041,109.00098 520.43994,109.12891 C 520.20947,109.25586 520.02295,109.42676 519.88037,109.64161 C 519.73682,109.85645 519.63232,110.10059 519.56689,110.37403 C 519.50146,110.64747 519.46923,110.93067 519.46923,111.22266 C 519.46923,111.50293 519.50146,111.77539 519.56689,112.03907 C 519.63232,112.30372 519.73681,112.542 519.88037,112.75294 C 520.02295,112.96485 520.20947,113.1338 520.43994,113.26173 C 520.67041,113.38966 520.95068,113.45314 521.28076,113.45314 C 521.72803,113.45314 522.07861,113.31642 522.33056,113.04201 C 522.58251,112.76857 522.73681,112.40724 522.79247,111.959 L 524.21142,111.959 C 524.17431,112.37599 524.07763,112.75295 523.92236,113.08888 C 523.76709,113.42579 523.56103,113.71193 523.30615,113.94923 C 523.05127,114.18653 522.75244,114.3672 522.40967,114.4922 C 522.06787,114.6172 521.69092,114.6797 521.28076,114.6797 C 520.77002,114.6797 520.31103,114.59083 519.90283,114.4131 C 519.4956,114.23634 519.15088,113.99122 518.8706,113.68068 C 518.59033,113.36916 518.37451,113.00295 518.22509,112.58302 C 518.07568,112.16212 518.00048,111.70997 518.00048,111.22364 C 518.00048,110.72559 518.07568,110.26368 518.22509,109.83692 C 518.3745,109.41016 518.59032,109.03809 518.8706,108.72071 C 519.15088,108.40333 519.4956,108.1543 519.90283,107.97364 C 520.31103,107.79298 520.77002,107.70313 521.28076,107.70313 C 521.64795,107.70313 521.99463,107.75586 522.3208,107.86231 C 522.64795,107.96778 522.94092,108.12208 523.19873,108.3252 C 523.45752,108.52735 523.67041,108.77832 523.83838,109.07715 C 524.00635,109.37598 524.11182,109.71875 524.15576,110.10449 L 522.73681,110.10449 C 522.71143,109.93652 522.65576,109.78223 522.56885,109.64258 z " />
        </g>
        <g
           transform="matrix(0.624995,0,0,0.624995,152.2987,316.9328)"
           id="g6332_1_">
          <path
             style="fill:#ffffff"
             d="M 644.57642,-363.11569 C 644.58423,-353.70389 636.95911,-346.0679 627.54663,-346.06088 C 618.13403,-346.05539 610.49963,-353.67813 610.4917,-363.09225 C 610.4917,-363.09927 610.4917,-363.10867 610.4917,-363.11569 C 610.48547,-372.52749 618.1106,-380.16348 627.52161,-380.1705 C 636.93421,-380.17752 644.56861,-372.55246 644.57642,-363.14145 C 644.57642,-363.13211 644.57642,-363.12509 644.57642,-363.11569 z "
             rx="29.209877"
             type="arc"
             cy="252.08646"
             ry="29.209877"
             cx="475.97119"
             id="path6334_1_" />
          <g
             transform="translate(-23.9521,-89.72962)"
             id="g6336_1_">
            <path
               d="M 651.36426,-292.05655 C 646.19238,-292.05655 641.81421,-290.25107 638.23291,-286.64322 C 634.5564,-282.90878 632.71729,-278.48923 632.71729,-273.38608 C 632.71729,-268.28293 634.5564,-263.89615 638.23291,-260.22348 C 641.90796,-256.55154 646.28613,-254.71561 651.36426,-254.71561 C 656.50501,-254.71561 660.95972,-256.56797 664.72998,-260.26957 C 668.28162,-263.78678 670.05823,-268.15873 670.05823,-273.38609 C 670.05823,-278.61351 668.25196,-283.03306 664.63623,-286.64323 C 661.02222,-290.25107 656.59875,-292.05655 651.36426,-292.05655 z M 651.41113,-288.69559 C 655.64868,-288.69559 659.2456,-287.20261 662.20654,-284.21427 C 665.19726,-281.25883 666.6925,-277.65098 666.6925,-273.38608 C 666.6925,-269.09232 665.22851,-265.52976 662.2987,-262.69614 C 659.21594,-259.64768 655.58459,-258.12345 651.41113,-258.12345 C 647.23608,-258.12345 643.63769,-259.63285 640.61572,-262.65085 C 637.59387,-265.66959 636.08288,-269.24698 636.08288,-273.38608 C 636.08288,-277.52518 637.6079,-281.13455 640.66259,-284.21427 C 643.59082,-287.20261 647.17358,-288.69559 651.41113,-288.69559 z "
               id="path6338_1_" />
            <path
               d="M 643.08923,-276.02048 C 643.833,-280.71897 647.13928,-283.22989 651.28466,-283.22989 C 657.24401,-283.22989 660.87682,-278.90488 660.87682,-273.13767 C 660.87682,-267.5095 657.01122,-263.13913 651.19078,-263.13913 C 647.18614,-263.13913 643.6002,-265.60245 642.94859,-270.43997 L 647.65171,-270.43997 C 647.79233,-267.92898 649.4221,-267.04465 651.75022,-267.04465 C 654.40342,-267.04465 656.12681,-269.50949 656.12681,-273.27671 C 656.12681,-277.23142 654.6378,-279.32285 651.84239,-279.32285 C 649.79393,-279.32285 648.02513,-278.57834 647.65172,-276.02048 L 649.01891,-276.02988 L 645.31737,-272.32669 L 641.61571,-276.02988 L 643.08923,-276.02048 z "
               id="path6340_1_" />
          </g>
        </g>
        <g
           transform="matrix(1.146822,0,0,1.146822,-85.92464,166.153)"
           id="g6361_1_">
          <path
             style="fill:#ffffff"
             d="M 536.23669,-66.41458 C 536.24096,-61.18613 532.00543,-56.94675 526.77868,-56.94208 C 521.55108,-56.93866 517.30956,-61.17337 517.30615,-66.40094 C 517.30615,-66.40564 517.30615,-66.41031 517.30615,-66.41458 C 517.30194,-71.64218 521.53747,-75.88241 526.76422,-75.88708 C 531.99182,-75.8905 536.23334,-71.65536 536.23669,-66.42819 C 536.23669,-66.42438 536.23669,-66.41882 536.23669,-66.41458 z "
             rx="29.209877"
             type="arc"
             cy="252.08646"
             ry="29.209877"
             cx="475.97119"
             id="path6363_1_" />
          <path
             d="M 526.75824,-76.5896 C 529.6109,-76.5896 532.02161,-75.60565 533.99121,-73.63944 C 535.96167,-71.67197 536.94604,-69.2634 536.94604,-66.41459 C 536.94604,-63.56578 535.97784,-61.18318 534.04315,-59.26634 C 531.98755,-57.24821 529.55981,-56.23958 526.75824,-56.23958 C 523.99072,-56.23958 521.60474,-57.24013 519.60193,-59.24123 C 517.59827,-61.2415 516.59601,-63.63347 516.59601,-66.4146 C 516.59601,-69.19573 517.59827,-71.6043 519.60193,-73.63945 C 521.5545,-75.60565 523.93964,-76.5896 526.75824,-76.5896 z M 518.8858,-69.14801 C 518.58178,-68.28967 518.43023,-67.37851 518.43023,-66.41458 C 518.43023,-64.15884 519.25366,-62.20926 520.90051,-60.56409 C 522.54736,-58.91935 524.50848,-58.09674 526.78381,-58.09674 C 529.05908,-58.09674 531.03723,-58.92743 532.71814,-60.58963 C 533.28015,-61.13333 533.74426,-61.72644 534.10785,-62.36935 L 530.27252,-64.07751 C 530.01282,-62.78659 528.86242,-61.91546 527.47186,-61.81286 L 527.47186,-60.24389 L 526.30353,-60.24389 L 526.30353,-61.81286 C 525.16248,-61.82604 524.0589,-62.29312 523.21503,-63.0314 L 524.61664,-64.44412 C 525.29187,-63.80929 525.96631,-63.52402 526.8877,-63.52402 C 527.48548,-63.52402 528.1471,-63.75736 528.1471,-64.53565 C 528.1471,-64.8107 528.0398,-65.00272 527.87208,-65.14664 L 526.90217,-65.5788 L 525.69386,-66.11655 C 525.09608,-66.38263 524.59022,-66.60746 524.08271,-66.83396 L 518.8858,-69.14801 z M 526.78381,-74.75793 C 524.47442,-74.75793 522.5227,-73.9443 520.92608,-72.31573 C 520.49175,-71.87762 520.1137,-71.41949 519.79266,-70.94134 L 523.68249,-69.20974 C 524.03417,-70.28863 525.05944,-70.94347 526.30352,-71.01629 L 526.30352,-72.58523 L 527.47185,-72.58523 L 527.47185,-71.01629 C 528.27654,-70.97711 529.15874,-70.75655 530.02898,-70.083 L 528.69207,-68.70904 C 528.19817,-69.05859 527.57574,-69.30511 526.95238,-69.30511 C 526.44658,-69.30511 525.73296,-69.15014 525.73296,-68.51532 C 525.73296,-68.41782 525.76537,-68.33225 525.82409,-68.25687 L 527.12524,-67.6774 L 528.00573,-67.28485 C 528.56945,-67.03363 529.1068,-66.79523 529.63982,-66.55765 L 534.85381,-64.23633 C 535.02581,-64.91928 535.11181,-65.64563 535.11181,-66.41458 C 535.11181,-68.73886 534.29693,-70.70505 532.6679,-72.31573 C 531.05426,-73.94431 529.09314,-74.75793 526.78381,-74.75793 z "
             id="path6365_1_" />
        </g>
      </g>
    </g>
    <text
       xml:space="preserve"
       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
       x="542.4519"
       y="339.6243"
       id="text2449"><tspan
         sodipodi:role="line"
         id="tspan2451" /></text>
    <path
       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient2499);stroke-width:10.38072491;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0999999;stroke-dasharray:none;stroke-opacity:1"
       d="M 44.979672,329.06403 L 979.02033,329.06403"
       id="path4174"
       sodipodi:nodetypes="cc" />
    <flowRoot
       xml:space="preserve"
       id="flowRoot5175"
       style="font-size:64px;font-style:italic;font-weight:bold;text-align:center;text-anchor:middle"
       transform="translate(-28.203125,-137.13902)"><flowRegion
         id="flowRegion5177"><rect
           id="rect5179"
           width="1028.3353"
           height="100.00509"
           x="26.263966"
           y="269.92377"
           style="font-size:64px;font-style:italic;font-weight:bold;text-align:center;text-anchor:middle" /></flowRegion><flowPara
         id="flowPara2457">namurlugtitle</flowPara></flowRoot>    <flowRoot
       xml:space="preserve"
       id="flowRoot6152"
       style="font-size:36px;text-align:center;text-anchor:middle"
       transform="translate(-225.50781,23.850824)"><flowRegion
         id="flowRegion6154"><rect
           id="rect6156"
           width="1023.2845"
           height="49.497486"
           x="224.25386"
           y="356.79691"
           style="font-size:36px;text-align:center;text-anchor:middle" /></flowRegion><flowPara
         id="flowPara6158">namurlugauthor</flowPara></flowRoot>    <flowRoot
       xml:space="preserve"
       id="flowRoot2461"
       style="font-size:64px;font-style:italic;font-weight:bold;text-align:center;text-anchor:middle;display:inline"
       transform="translate(-28.285156,-60.680631)"><flowRegion
         id="flowRegion2463"><rect
           id="rect2465"
           width="1028.3353"
           height="100.00509"
           x="26.263966"
           y="269.92377"
           style="font-size:64px;font-style:italic;font-weight:bold;text-align:center;text-anchor:middle" /></flowRegion><flowPara
         id="flowPara2467"
         style="font-size:40px">namurlugsubtitle</flowPara></flowRoot>  </g>
</svg>

Ce fichier représente une image comme celle-ci :

Image du SVG de référence

Une fois les champs remplis avec les valeurs de la première ligne du fichier csv, celle-ci deviens :

Image du svg rempli avec les valeurs du csv

L'image des logos a elle été créé aussi en svg, mais n'est exportée qu'une fois :

Image d'introduction avec les logos FOSDEM et NamurLUG

Le script suivant crée un dossier de travail pour chaque vidéo,  y place le fichier de titre svg spécifique à chaque conférence et l'exporte en PNG avec inkscape :

#!/bin/bash
# Script realise par Zabelle pour le FOSDEM 2010
# Mis à disposition sous licence LGPL v.3 http://www.gnu.org/licenses/lgpl-3.0.txt
# Permet de creer les dossiers de travail pour le montage avec les fichiers de titre associes sur base d'un fichier de donnees csv et d'un fichier de modele svg
# Suppose de disposer
# 1) d'un fichier de donnees data.csv (UTF8 avec points-virgules et double quotes) avec les colonnes suivantes :
#     date, titre, soustitre, auteur, salle, nom_du_dossier_a_creer
# 2) d'un fichier svg comportant les champ textes portant les noms suivants :
#      namurlugdate, namurlugtitle, namurlugsubtitle, namurlugauthor, namurlugroom
# Realise les operations suivantes :
# 1) cree un dossier appele "results" qui contient tous les elements crees
# 2) pour chaque ligne de donnees, cree un dossier du nom choisi dans la derniere colonne de data.csv
# 3) pour chaque ligne de donnees, cree le fichier de titre.svg sur base du modele fourni


# suppression double quotes avant de commencer pour faciliter le traitement
sed "s/\"//g" <data.csv >data2.csv


#creation du dossier de resultats
mkdir results

#traitement ligne par ligne des donnees et creation des dossiers et fichiers de titre
cat data2.csv | while read ligne
do
# recuperation des infos dans data2.csv
date=$(echo  "$ligne" | awk -F";" '{print $1}')
title=$(echo "$ligne" | awk -F";" '{print $2}')
subtitle=$(echo "$ligne" | awk -F";" '{print $3}')
author=$(echo "$ligne" | awk -F";" '{print $4}')
room=$(echo "$ligne" | awk -F";" '{print $5}')
folder=$(echo "$ligne" | awk -F";" '{print $6}')
#creation du dossier dans results
cd results
mkdir $folder
cd $folder
#creation du fichier svg avec les elements remplaces (en une commande !)
cp ../../titre.svg titre0.svg
sed "s/namurlugdate/$date/;s/namurlugtitle/$title/;s/namurlugsubtitle/$subtitle/;s/namurlugauthor/$author/;s/namurlugroom/$room/"  <titre0.svg >titre.svg
# Export en png avec inkscape
inkscape --export-png=titre.png --export-area-page --export-height=576 --export-width=1024 titre.svg

#nettoyage
rm titre0.svg
cd ..
cd ..
done

rm data2.csv

 

Jour J : Capture et streaming

Jours suivants : montage, encodage et mise en ligne

Encodage automatique des vidéos

Correction de certaines pistes sons de vidéos

Logiciel nécessaires

  • audacity: logiciel libre et complet d'édition de données audio numériques. Il n'est normalement pas nécéssaire, mais fut bien utile pour corriger certains parasites sonores dus à des problèmes électriques.
  • mplayer: logiciel pour visionner et manipuler des vidéos sous Linux.

Dans une des salles que nous avions en charge, le système électrique était parasité, et cela a induit des bruits de fond très génants dans les bandes son des vidéos. Nous avons donc du extraire les pistes son, et les éditer avant de pouvoir les ré-synchroniser avec les vidéos.

Extraction des bandes son en .wav

Cette extraction est effectuée en ligne de commande :

$ mplayer fichier.m2t -vc dummy -vo null -ao pcm:file=fichier.wav

Edition des bandes son avec audacity pour supprimer les parasites

Ce fichier WAV est édité en audacity. Dans notre malheur, nous avions quand même eu un peu de chance. Les caméra enregistraient en mono, mais sur deux pistes. Donc la piste droite de la bande son comportait la voix du speaker, parasitée, et la piste gauche, au lieu d'être vide, comportait le parasite seul. Il fut donc relativement facile de "nettoyer" les bandes son. Voici la procédure :

capture d'écran d'audacity

  1. Importer la bande son dans audacity : Fichier > Importer;
  2. Couper la bande son stréréo en deux bandes son mono indépendantes : dans la piste elle même, cliquer sur le nom, et sélectionner "Séparer stéréo vers mono";
  3. Sélectionner la piste contenant le parasite seul, et l'inverser : Effets > Inverser . Ainsi le parasite sur la bande gauche est l'exact inverse de celui de la bande droite. Lors d'une lecture ils s'annuleront.
  4. Ensuite, amplifier le signal inversé pour qu'il soit de même intensité que celui de droite (chez nous il y avait une différence d'amplifcation entre les deux pistes): Effets > Amplification. Tester de 2x en 2x.
  5. Exporter le tout dans un nouveau fichier .wav: Fichier> Exporter. Le fichier produit ne comportera qu'ue seule piste mono, fruit de la fusion des deux pistes précédentes.
  6. Réouvrir cette piste et détecter un endroit ou il y a une seconde de bruit de fond uniquement. Sélectionner cette zone et aller dans Effets>Réduction du bruit>Prendre l'emprunte du bruit. Puis sélectionner toute la piste et Effet>Réduction du bruit> Appliquer. Cela va soustraire ce bruit à l'ensemble de la piste.
  7. Dans notre cas les scripts d'encodage sont prévus pour du son à deux pistes dont une vide. Donc Pistes>Ajouter une nouvelle...> Piste audio. Puis fusionner ces deux pistes mono en une piste stéréo et réexporter le fichier.

Une fois les bandes son épurées, elles sont prettes à être réutilisées pour encoder avec les vidéos.

Transformation des vidéos issues des cartes SD

Une des caméra ne savait enregistrer que sur des cartes SD, en format mp4, tous coupés à 3,5Gb maximum. Voici le script qui a permis de transformer ces fihiers en mpeg, tout en les concaténant.

Logiciels et bibliothèques nécessaires :

  • gpac: framework open source multimedia.
  • mplayer: logiciel pour visionner et manipuler des vidéos sous Linux.
  • twolame: encodeur optiisé pour du MPEG Audio Layer 2 (MP2).
  • ffmpeg: collection de logiciels libres dédiés au traitement de flux audio ou vidéo (enregistrement, lecture ou conversion d'un format à un autre).

Préparation :

Mettre tous les fichiers .mp4 d'une conférence dans un même répertoire, en les nommant avec un préfixe numérique afin de les prendre dans l'ordre. Puis depuis la racine de ce répertoire lancer le script convert-mp4.sh suivant :

#!/bin/sh
# Delivered WITHOUT ANY WARRANTY under licence LGPL v3.0. See http://www.gnu.org/licenses/lgpl-3.0.txt
if [ -z $1 ] || [ -z $2 ]; then
  echo "Usage: $0 directory_to_process output_mpeg_file"
  exit 1
fi

DIRNAME=$1
OUTPUT=$2
CONCAT_VIDEO_CMD="cat"
CONCAT_AUDIO_CMD="cat"

cd $DIRNAME

for i in *MP4 *mp4; do
  MP4Box -raw 1 $i || exit 1
  mplayer -vc dummy -vo null -ao pcm:file=$i.wav $i || exit 1
  twolame $i.wav || exit 1
  rm $i.wav || exit 1

  VIDEONAME=`basename $i | cut -f 1 -d "."`"_track1.m2v"
  CONCAT_VIDEO_CMD+=" $VIDEONAME"
  CONCAT_AUDIO_CMD+=" $i.mp2"
done

$CONCAT_VIDEO_CMD > $DIRNAME.m2v || exit 1
$CONCAT_AUDIO_CMD > $DIRNAME.mp2 || exit 1

ffmpeg -loglevel quiet -i $DIRNAME.m2v -i $DIRNAME.mp2 -vcodec copy -acodec copy $OUTPUT || exit 1

cd ..

rm $DIRNAME/*m2v $DIRNAME/*mp2 || exit 1

avec la commande :

$ ./convert-mp4.sh repertoire /path_to_mpeg

ou repertoire est le nom du répertoire comprenant les fichiers mp4, et /path_to_mpeg le chemin vers le répertoire ou vous voulez que vous fichiers mpeg soient enregistrés, au format mpeg-2.

Script d'encodage automatisé

Logiciels et bibliothèques nécessaires

  • ImageMagick: puissant logiciel de manipulation d'images.
  • libquicktime : librairie pour lire et écrire des fichiers vidéos quicktime/avi/mp4.
  • Mjpeg Tools: outils pour enregistrer, éditer, et visionner des vidéos MPEG sous Linux.
  • mplayer: logiciel pour visionner et manipuler des vidéos sous Linux. Est associé à mencoder (en), qui est à la fois un outil de codage (ou transcodage) et de montage audio et vidéo. Ces deux outils sont paramétrables en ligne de commande, ce qui leur confère un grand intérêt dès lors qu'il sagit de les intégrer dans un script automatisé comme celui qui suit.

Le fichier s'intitule encode-hdv.sh :
Ce script édite tous les fichiers m2t ou mpg leur ajoutant au début et à la fin les images de titres (thème de la conférence et nom de(s) l'orateur(s)), teste si un fichier de son externe est présent (les .wav), et si oui les utilise pour remplacer les son originaux, puis encode la vidéo en Xvid et le son en mp3, dans un conteneur avi.

#!/bin/bash
# Delivered WITHOUT ANY WARRANTY under licence LGPL v3.0. See http://www.gnu.org/licenses/lgpl-3.0.txt

# Teste l'existence des paramètres obligatoires
if [ -z $1 ] || [ -z $2 ]; then
  echo "Usage: $0 path_to_hd_file maximum_size_in_mb"
  exit 1
fi
# Stoppe le script si le fichier passé en argument 1 n'existe pas
if [ ! -f $1 ]; then
  echo "File not found: $1"
  exit 1
fi

# Spécifie le répertoire ou sont les images de référence pour les intros et outros.
SCRIPT_PATH=/media/fosdem/scripts

# Spécifie le nom du fichier, sa taille maximale (sur base de l'argument 2), et son dossier de destination
NAME=`basename $1 | cut -f 1 -d "."`
MAXSIZE=$(( $2 * 1024 ))
DIRNAME=`dirname $1`

# Si un fichier start est défini, le passer en variable (défini le timecode ou commencer l'encodage au cas ou le film comporte une partie inutile en début)
if [ -f $DIRNAME/$NAME.start ]; then
  START="-ss `cat $DIRNAME/$NAME.start`"
fi

# Si un fichier .length est défini, le passer en variable (défini la durée totale de la bande vidéo à considérer pour l'encodage)
if [ -f $DIRNAME/$NAME.length ]; then
  ENDPOS="-endpos `cat $DIRNAME/$NAME.length`"
fi

# Si un fichier .wav est présent, le passer en variable (c'est le cas lorsque le son a du être nettoyé avec audacity)
if [ -f $DIRNAME/$NAME.wav ]; then
  AUDIOFILE="-audiofile $DIRNAME/$NAME.wav"
fi

# Si un fichier .left est défini, copier le canal son de gauche et le mettre à droite. C'est le cas lorsque la bande son mono est à gauche plutôt qu'à droite. Or le script final dédouble la bande droite, donc si celle-ci est vide la vidéo sera sans son.
if [ -f $DIRNAME/$NAME.left ]; then
  AFCHANNELS="-af channels=2:2:0:0:0:1"
else
  AFCHANNELS="-af channels=2:2:1:1:1:0"
fi

# Création des images jpg pour les intro et outro
convert -resize "!960x!720" $DIRNAME/$NAME.png $NAME.jpg
convert -resize "!960x!720" $SCRIPT_PATH/intro.png $NAME-intro.jpg

# Génération du fichier avi de titre
echo "Generating $NAME-title.avi"
jpeg2yuv -v 0 -n 125 -f 25 -I p -j $NAME.jpg | yuv2lav -v 0 -o $NAME-title-nosound.avi || exit 1
mplayer $SCRIPT_PATH/white_noise.wav -ao pcm:waveheader:file=$NAME-title.wav -endpos 5 -frames 125 > /dev/null || exit 1
lavaddwav $NAME-title-nosound.avi $NAME-title.wav $NAME-title.avi 2&> /dev/null || exit 1

# Génération du fichier avi d'intro
echo "Generating $NAME-intro.avi"
jpeg2yuv -v 0 -n 50 -f 25 -I p -j $NAME-intro.jpg | yuv2lav -v 0 -o $NAME-intro-nosound.avi || exit 1
mplayer $SCRIPT_PATH/white_noise.wav -ao pcm:waveheader:file=$NAME-intro.wav -endpos 2 -frames 50 > /dev/null || exit 1
lavaddwav $NAME-intro-nosound.avi $NAME-intro.wav $NAME-intro.avi 2&> /dev/null || exit

# Génération du fichier .avi d'outro
echo "Generating $NAME-outro.avi"
jpeg2yuv -v 0 -n 125 -f 25 -I p -j $NAME-intro.jpg | yuv2lav -v 0 -o $NAME-outro-nosound.avi || exit 1
mplayer $SCRIPT_PATH/white_noise.wav -ao pcm:waveheader:file=$NAME-outro.wav -endpos 5 -frames 125 > /dev/null || exit 1
lavaddwav $NAME-outro-nosound.avi $NAME-outro.wav $NAME-outro.avi 2&> /dev/null || exit 1

# Supprimer les fichiers devenus inutiles
rm $NAME.jpg $NAME-*.jpg $NAME-*.wav || exit 1

# Encoder le fichier final première passe
mencoder -passlogfile $NAME-divx2pass.log -info artist="NamurLUG  (www.namurlug.org)":name="Fosdem 2010":copyright="Creative Commons Attribution-NonCommercial-ShareAlike 2.5":comment="February 2010 ULB, Brussels, Belgium" -force-avi-aspect 1.78 -ovc xvid -xvidencopts pass=1:vhq=4:threads=1:max_key_interval=250:aspect=16/9 -oac mp3lame -lameopts vbr=3:br=96:mode=1 $AFCHANNELS -vf pp=ac,harddup,dsize=16/9 $NAME-title.avi -frames 125 $NAME-intro.avi -frames 50 $1 -vf pp=fd,hqdn3d,scale=960:720 $AUDIOFILE $START $ENDPOS $NAME-outro.avi -frames 125 -o ./$NAME.xvid.avi || exit 1

# Encoder le fichier final seconde passe
mencoder -passlogfile $NAME-divx2pass.log -info artist="NamurLUG  (www.namurlug.org)":name="Fosdem 2010":copyright="Creative Commons Attribution-NonCommercial-ShareAlike 2.5":comment="February 2010 ULB, Brussels, Belgium" -force-avi-aspect 1.78 -ovc xvid -xvidencopts pass=2:vhq=4:bitrate=-$MAXSIZE:threads=1:max_key_interval=250:aspect=16/9 -oac mp3lame -lameopts vbr=3:br=96:mode=1 $AFCHANNELS -vf pp=ac,harddup,dsize=16/9 $NAME-title.avi -frames 125 $NAME-intro.avi -frames 50 $1 -vf pp=fd,hqdn3d,scale=960:720 $AUDIOFILE $START $ENDPOS $NAME-outro.avi -frames 125 -o ./$NAME.xvid.avi || exit 1

# Supprimer les fichiers qui ne sont plus nécéssaires
rm $NAME-divx2pass.log $NAME-intro*.avi $NAME-title*.avi $NAME-outro*.avi || exit 1

Avec path_to_hd_file qui est le chemin vers le répertoire qui contient les fichiers .m2t, et maximum_size_in_mb qui est la taille maximale ciblée pour les vidéos compressées, en méga-bytes. Nous avons utilisé pour ce dernier paramètre les valeurs de 700 pour les conférences d'une heure, et de 240 pour celles de 15 minutes.

Exemple de commande:

$ ./encode-hdv.sh /media/fosdem/2010/ferrer/saturday/07-sat-tinc.m2t 240

 Durant la création des fichiers de titre, intro et outro, il est possible que mplayer affiche des messages d'erreurs :

mplayer: could not connect to socket                                                             
mplayer: No such file or directory                                                               
Failed to open LIRC support. You will not be able to use your remote control. 

ne vous affolez pas, c'est normal. De même, durant l'encodage, il est possible que des notices de duplication de frames apparaissent, pas de panique.

Capture de la vidéo en temps réel sur un disque dur

Une journée d'enregistrement correspond à environ 8 à 10h de vidéos. Pour le WE complet, ayant 3 salles à prendre en charge, cela correspond donc à presque 60 heures de vidéo. Si vous vous contentez d'uiliser des K7 mini DV c'est autant de temps perdu à capturer la vidéo sur disque dur avant de pouvoir la compresser pour la mettre en ligne. Nous détaillerons donc ici une méthode qui permet de capturer le flux vidéo original directement de la caméra au disque dur.

Montage matériel

Montage caméra-PC-disque durLa caméra est connectée en Firewire à un ordinateur portable, qui tourne bien évidemment sous Linux, et qui est lui même connecté en USB2 à un disque dur externe. Le disque dur externe doit avoir pour caractéristique de devoir tourner en 7200 rpm.

Logiciels et bibliothèques nécessaires

  • libquicktime: librairie pour lire et écrire des fichiers vidéos quicktime/avi/mp4.
  • libiec61883: librairie nécessaire pour activer la connectique Firewire.
  • libavc1394: librairie nécessaire pour activer la connectique Firewire.
  • libraw1394: librairie nécessaire pour activer la connectique Firewire.
  • dvgrab : petit utilitaire pour capturer un signal vidéo AVI-2 émis par une caméra DV en utilisant le bus IEEE-1394, mieux connus sou le nom FireWire.
  • VLC : lecteur, serveur et encodeur vidéo open-source.

Au niveau de votre Kernel Linux vous devez activer le support FireWire (IEEE 1394).

Script de capture en temps réel

Cette année le script de capture est intitulé... capture.sh.
Simplissime, celui-ci capture le flux vidéo de la caméra en HDV et l'enregistre dans un fichier .m2t, le format de fichiers généralement utilisé par les camescopes HDV. La vidéo ainsi obtenue est précompressée en MPEG-2.

Contenu de capture.sh

#!/bin/sh
dvgrab -noavc -s 0 -f hdv $1

Lancement du script capture.sh

Veuillez déposer ce script à l'endroit ou vous voulez enregistrer vos vidéos. Veuillez vérifier que ce script est exécutable. Dès le début de la conférence à enregistrer, lancer la commande suivante:

$ ./capture.sh nom_de_ma_video

Par sécurité, nom_de_la_video ne contient aucun accent, ni espaces, ni ponctuation. Cela va créer un fichier nommé nom_de_la_video001.m2t. A la fin de la conférence un CTRL+C stoppe la procédure, et le script est relancé avec le nom de la conférence suivante en paramètre.

Voici un apperçu de ce que vous avez comme retour sur votre terminal :

Photo d'un terminal avec l'exécution du script de capture

Préparation du streaming

Le fichier m2t est envoyé par réseau au serveur de streaming, qui va le réencoder dans un format permettant une diffusion. Dans notre cas ce sera en 480x272, l'image étant encodée en mpeg-2 (1Mbs de  bitrate) et le son en mp3 (44100Hz, stéréo, 16bit, 96kbps). Le but est d'avoir une image un bon rapport taille/qualité, et d'utiliser un format le plus accessible possible par la pluspart des lecteurs vidéos.

Transfert du fichier m2t au serveur de streaming

Le script stream-client.sh utilise vlc en ligne de commande (cvlc) pour envoyer le fichier en UDP vers le serveur, ici d'adresse ip 192.168.2.100, sur le port 4567.

#!/bin/sh
cvlc $1 --file-caching=20000 --sout "#std{mux=ts,access=udp,dst=192.168.2.100:4567}"

Le script est lancé juste après celui de la capture, dans un terminal différent.

user@mylaptop $ ./stream-client.sh nom_du_fichier.m2t

Notez qu'ici on met en argument le nom du fichier m2t, c'est à dire nom_de_la_video001.m2t

Encodage et streaming depuis le serveur

Sur le serveur de streaming, il y a un script par salle d'enregistrement (stream-raw-room01.sh, stream-raw-room02.sh, etc). Chaque script récurère les fichiers envoyés depuis la salle dont il dépend, les réencode, et envoye la vidéo ainsi créée qui sera streamée par VLC en UDP sur un port spécifique à la salle.

Contenu d'un des scripts stream-raw-room0x.sh :

#!/bin/sh
# Delivered under LGPL v3 licence http://www.gnu.org/licenses/lgpl-3.0.txt
if [ -z $1 ] || [ -z $2 ] || [ -z $3 ]; then
  echo "Usage: $0 server_port server_public_ip server_public_port"
  exit 1
fi

SERVER_PORT=$1
SERVER_PUBLIC_IP=$2
SERVER_PUBLIC_PORT=$3

cvlc -vv udp://@193.191.32.10:${SERVER_PORT} --sout "#transcode{vcodec=mp2v,fps=25,vb=1000,width=480,height=272,acodec=mpga,ab=96,channels=2,samplerate=44100,deinterlace}:std{access=http,mux=ts,dst=${SERVER_PUBLIC_IP}:${SERVER_PUBLIC_PORT}}"

Pour lancer le script, exécutez par exemple la ligne suivante dans un terminal :

$ stream-raw-roow0x.sh port_du_serveur ip_publique_du_serveur port_public_du serveur

ce qui dans notre cas donnerai pour la salle principale:

$ stream-raw-roow0x.sh 4567 192.168.2.100 1000

Les internautes pourront ainsi récupérer chaque flux issu de chaque salle en utilisant un client VLC et en ouvrant un flux, ici par exemple à l'URL http://streaming.onsite.fosdem.net:10000/

 

 

Fil des commentaires de ce billet

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.