Vidéo Sonic Visualiser
Transcription
Vidéo Sonic Visualiser
MASTER 2 PRO MITIC Université RENNES 1 2006-2007 Vidéo Sonic Visualiser Arthur DIBON, Damien LE BERRIGAUD, Laurent POIRIER, Mickaël SIMON Table des matières 1 Introduction 4 1.1 Présentation du projet PELOPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2 Cahier des charges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2 IHM 7 2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2 Les points faibles de Sonic Visualiser . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2.1 Un outil trop complexe : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2.2 Gestion des onglets : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2.3 Gestion des panneaux : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Les points forts de Sonic Visualiser . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.3.1 La vue globale du signal audio . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.3.2 Les icônes représentant les types de descripteurs . . . . . . . . . . . . . . . . . 10 2.3.3 La gestion du zoom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.3.4 La barre de chargement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.3.5 La notion de session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Inspiration de divers logiciels de montage audio/vidéo . . . . . . . . . . . . . . . . . . 11 2.4.1 Intégration d’un chrono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.4.2 Implémentation du drag and drop . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.4.3 Déportation des boutons de gestion de la lecture . . . . . . . . . . . . . . . . . 13 2.4.4 Une interface entièrement redimensionnable . . . . . . . . . . . . . . . . . . . 13 Les fonctionnalités non implémentées : . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.3 2.4 2.5 3 Intégration de la Vidéo 15 3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.2 Videolan vs Mplayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.2.1 16 Versions testées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3.2.2 3.3 3.4 Etapes de tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Utilisation de Mplayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.3.1 Utilisation d’un QProcess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.3.2 Lancement du Processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.3.3 Gestion des communications . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.3.4 Fin de processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Lecture de sélections multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.4.1 Mécanisme de recherche de Mplayer . . . . . . . . . . . . . . . . . . . . . . . . 18 3.4.2 Synchronisation de la vidéo sur la bande son . . . . . . . . . . . . . . . . . . . 19 4 Query Descriptor 22 4.1 L’objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.2 Aspects techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.3 L’outil - Query Descriptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 4.4 Les formats d’exportation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 4.5 Le langage de requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 4.5.1 incrEnd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.5.2 incrStart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.5.3 getStart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.5.4 getEnd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.5.5 before . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.5.6 after . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.5.7 isIn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.5.8 cover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.5.9 meet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.5.10 union . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.5.11 inter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Fonctionnalités non-implémentées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 4.6 5 Import des fichiers descripteurs 5.1 29 Format de fichier de Sonic Visualiser . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 5.1.1 Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 5.1.2 Dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 5.1.3 Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 5.1.4 Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2 5.2 Format de fichier projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 5.2.1 Descripteur symbolique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 5.2.2 Descripteur numérique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 5.3 Intégration des descripteurs dans Sonic Visualiser . . . . . . . . . . . . . . . . . . . . 33 5.4 Taux d’échantillonnage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 6 Conclusion 38 7 Informations générales 39 7.1 Serveur Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 7.2 Responsables IRISA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 7.3 Equipe MITIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3 1 Introduction 1.1 Présentation du projet PELOPS PELOPS, ITEA-IP-04010 Cadre des travaux : Le projet PELOPS se positionne dans le domaine de la production de contenu dans les situations de capture et de distribution d’informations évènementielles ; le projet se rapporte donc aux études de studios de production en réseau et aux outils associés d’analyse de contenu pour la production et la publication temps réel avec exploitation ultérieure des contenus existants. Le projet vise plus spécifiquement à développer le marché d’exploitation des contenus audiovisuels sportifs. Dans ce contexte, il est nécessaire de générer, collecter et exploiter des métadonnées à chaque étape du processus. Ce processus doit par conséquent être mis en oeuvre de façon aussi efficace que possible et en évitant autant que faire se peut aux opérateurs des manipulations laborieuses et sources d’erreurs. C’est ce qui plaide en faveur d’une extraction automatique de ces métadonnées et d’une organisation structurée pour une réutilisation aisée et minimisant les erreurs de montage. PELOPS propose une investigation des axes d’études suivants : – Extraction et utilisation de différents types de métadonnées (métadonnées issues du contexte et métadonnées issues de l’analyse du contenu) avec une orientation de standardisation pour faciliter et accélérer la production et la publication en temps réel pendant le déroulement de l’évènement couvert mais aussi en temps décalé pour la production ultérieure de résumés, documentaires, etc. – Faciliter les échanges de contenus dans un environnement de production mobile, et entre tous les acteurs de la production grâce à une approche pragmatique dans le sens de la standardisation. – Prise en compte de l’arrivée et du déploiement de technologies informatiques dans les 4 environnements de production de contenu audiovisuel (en particulier, les interconnexions et réseaux basés sur les protocoles IP - Internet Protocol) . – Démontrer en parallèle avec un canal de diffusion TV traditionnel, les moyens supplémentaires offerts grâce aux infrastructures s’appuyant sur les protocoles IP pour la publication et la distribution des médias. Fig. 1.1 – Pelops Market 1.2 Cahier des charges Dans le cadre du projet PELOPS, il a été demandé la mise en place d’outils permettant à l’équipe d’exploiter et de vérifier à l’aide de la vidéo, la pertinence des descripteurs audios générés, ainsi que la création de nouveaux descripteurs à partir de l’existant. Définition d’un descripteur : Un descripteur est une manière formel de décrire un signal donné, il y a deux types de descripteurs : – Les descripteurs symboliques, qui permettent, dans une durée, de signifier un évènement. – Les descripteurs numériques, qui permettent de quantifier une information durant un évènement. 5 Aprés décision de prendre Sonic Visualiser comme basse des travaux, nous avons dresser une liste des fonctionnalités à améliorer et à ajouter dans l’application existante. – – – – – – – – – Importation de descripteurs symboliques et numériques. Visualisation et manipulation des descripteurs. Sauvegarde des descripteurs dans une session de travail. Modification de l’IHM pour faciliter l’utilisation du produit. Intégration d’un outil de requêtage pour exploiter les descripteurs. Extraire et générer un résultat à partir d’une requête exprimée. Ré-importation d’un résultat dans une session. Intégration de la vidéo dans l’IHM. Conversion automatique d’un descripteur pour l’adapté au taux d’échantillonnage du flux sonore étudié. 6 2 IHM 2.1 Introduction L’interface est la partie avec laquelle l’utilisateur va interagir pour réaliser les opérations offertes par le logiciel. Les maquettes que nous avons réalisées d’après le cahier des charges font apparaı̂tre qu’il y aura beaucoup d’informations à afficher à l’écran. L’organisation de l’interface aura donc un rôle primordial pour maximiser l’utilisabilité du logiciel. Nous sommes donc partis d’un logiciel existant permettant de visualiser et d’analyser des signaux audios : Sonic Visualiser. Fig. 2.1 – Interface d’origine de Sonic Visualiser 7 2.2 Les points faibles de Sonic Visualiser Lors de la prise en main de Sonic Visualiser, conjointement avec M. Gonon, M. Ben et M. Marie-Dessoude, nous avons pu mettre en avant divers points de l’interface à améliorer. 2.2.1 Un outil trop complexe : – L’outil offre à l’utilisateur tout un tas de fonctionnalités qui ne sont pas utiles pour notre utilisation. Il est possible de : – gérer la rapidité de la lecture du fichier sonore, – d’afficher plusieurs types de spectrogrammes (simple, gamme mélodique, pics de fréquence), – gérer plusieurs sons simultanément, – d’afficher des notes musicales. De plus, l’utilisation de spectrogramme provoque un bog d’affichage, le panneau s’affiche en inverse vidéo et il est impossible de revenir en mode normal même après suppression de la couche spectrogramme. → Dans un soucis de rendre l’application la plus simple possible et d’éviter la surcharge de fonctionnalités, l’accès à ces fonctions par les menus a été supprimé. 2.2.2 Gestion des onglets : Fig. 2.2 – Gestion des onglets de Sonic Visualiser – Chaque onglet correspond à une couche sur un panneau donné. On peut en ajouter autant qu’on le désire mais la manière dont ils sont gérés rend leur utilisation très difficile. En effet, chaque onglet est nommé par un numéro attribué incrémentalement. Il est donc difficile de savoir à quoi il se rapporte. Pour connaı̂tre le nom réel du descripteur auquel l’onglet correspond, il faut le survoler et attendre l’affichage d’une info-bulle. → Afin de simplifier la navigation dans les onglets, le nom de chaque descripteur apparaı̂t dorénavant directement sur l’onglet. Nous avons intégré un bouton qui permet de mas8 quer/démasquer l’intégralité des onglets de chaque panneau simultanément. Le but étant de permettre le redimensionnement des panneaux à volonté afin d’en voir le plus grand nombre possible à l’écran. 2.2.3 Gestion des panneaux : Les panneaux permettent d’afficher autant de couches que souhaité. Une couche peut-être un signal audio ou un descripteur (numérique ou symbolique) représentant des informations issues de l’analyse du fichier sonore. – Tout d’abord, la manière d’indiquer le panneau courant n’est pas satisfaisante. En effet, une barre noire, peu visible, est positionnée sur la gauche de celui-ci. Ensuite, il est possible d’ajouter autant de panneaux qu’on le souhaite, or au-delà de 4, l’application devient trop petite pour tous les contenir et certains panneaux demeurent invisibles puisqu’il n’y a pas de barre de défilement d’implémenter. → L’indicateur de panneau courant a été supprimé et le panneau courant est maintenant mis en évidence grâce à un cadre. Nous avons mis en place une barre de défilement qui permet de visualiser un nombre quelconque de panneaux. Fig. 2.3 – Mauvaise gestion des panneaux 9 2.3 Les points forts de Sonic Visualiser Si nous avons décidé de prendre Sonic Visualiser comme base, c’est bien parce qu’il proposait des fonctionnalités intéressantes pour notre projet. Voici les points forts que nous avons décidé de conserver pour Video Sonic Visualiser. 2.3.1 La vue globale du signal audio – La vue globale du signal audio permet de se situer aisément dans le temps. Elle indique la position du curseur et grâce à une lucarne, la partie du signal affichée dans les panneaux (notion de zoom). Le signal miniaturisé qu’elle contient permet en un coup d’oeil de répérer les zones plus ou moins ’actives’. 2.3.2 Les icônes représentant les types de descripteurs – Chaque onglet contient une icône représentative du type du descripteur associé. Ainsi d’un coup d’oeil, l’utilisateur peut prendre connaissance de ce qu’il manipule (descripteur numérique ou symbolique). 2.3.3 La gestion du zoom – La gestion du zoom et la navigation dans les panneaux grâce à la souris ou aux flèches directionnelles est intuitive et très fluide. 2.3.4 La barre de chargement – Lors du chargement d’un son dans Sonic Visualiser, une fenêtre contenant une barre de progression s’ouvre et indique à l’utilisateur que le son est en cours de décodage. Cette fenêtre est non bloquante, l’utilisateur peut ainsi charger sa vidéo en parallèle. 2.3.5 La notion de session – Sonic Visualiser intègre la notion de session. Ainsi, l’état de l’application peut être sauvegardé et restauré à l’identique très simplement. Celà offre à l’utilisateur un confort indéniable. 10 2.4 Inspiration de divers logiciels de montage audio/vidéo Tout d’abord, Sonic Visualiser est un outil exclusivement destiné à l’analyse sonore. Notre but étant d’intégrer la vidéo à l’application, nous nous sommes intéressés à différents logiciels de montage vidéo, notamment SONY Vegas et ADOBE Première. ADOBE Première a été pour nous un exemple de ce qu’il ne fallait pas faire. L’interface est surchargée par des barres d’outils et l’utilisateur doit consacrer beaucoup de temps à la gestion des fenêtres. Nous avons testé divers logiciels de montage audio comme Audacity, qui propose à l’utilisateur une interface complexe et peu intuitive et Sound Forge qui quant à lui, dispose d’une interface simple, épurée qui nous a paru intéressante. De tous ces logiciels, celui offrant l’interface la plus aboutie est SONY Vegas. Voici les concepts intéressants que nous avons adaptés à Sonic Visualiser. Fig. 2.4 – Sony Vegas 11 Fig. 2.5 – Adobe Premiere 2.4.1 Intégration d’un chrono – Les fichiers audios/vidéos analysés pourront être des fichiers de plusieurs minutes voir plusieurs heures (évènements sportifs). Il nous a donc paru évident qu’il fallait proposer à l’utilisateur un chrono digne de ce nom, lui permettant de se repérer rapidement dans le temps. Les indications temporelles fournies par Sonic Visualiser à l’origine sont pauvres et se mélangent avec le contenu des couches et deviennent illisibles. → Nous avons mis en place un chrono (au format h :mm :ss) qui indique à l’utilisateur la position courante de la tête de lecture. Le chrono est volontairement gros et placé entre le flux audio et la vidéo pour que l’utilisateur ne perde pas de temps à le chercher à chaque fois. 2.4.2 Implémentation du drag and drop – La mise en place de la session de travail (chargement du son et de la vidéo) par le menu ’Fichier’ n’est pas très pratique. A chaque fois l’utilisateur doit re-naviguer depuis la racine vers les répertoires contenant ses documents. Nous avons donc souhaité intégrer à l’interface un explorateur de fichiers pour que l’utilisateur puisse naviguer simplement au sein de son arborescence de fichiers. La mise en place du drag and drop facilite le chargement de la vidéo et du fichier audio à analyser. Le répertoire de travail de l’utilisateur est toujours ’disponible’ directement. Le lecteur vidéo 12 Fig. 2.6 – Intégration du chrono et le panneau chargé de recevoir le fichier audio sont paramétrés individuellement pour n’accepter que les types de fichiers supportés par l’un au l’autre. On évite ainsi toutes erreurs possibles lors de la lecture. 2.4.3 Déportation des boutons de gestion de la lecture – Les boutons gérant la lecture ont été déportés afin de les séparer clairement des barres d’outils. Ils ont été placé près du flux pour réduire les déplacements de la souris et pour que ça soit intuitif pour l’utilisateur. Fig. 2.7 – Boutons de lecture repositionnés 2.4.4 Une interface entièrement redimensionnable – La prise en charge de la vidéo a été implémentée et le lecteur a été placé à droite du navigateur de fichiers. L’utilisation de la vidéo étant facultative lors de l’analyse d’un fichier sonore, le lecteur de la vidéo peut-être complètement masqué (tout comme chaque 13 composant de l’interface). A l’inverse, la vidéo peut-être agrandie à volonté afin de faciliter le contrôle de la ’vérité terrain’. 2.5 Les fonctionnalités non implémentées : – Drag and drop de descripteurs entre panneaux. – Drag and drop de descripteurs depuis l’explorateur de descripteurs vers les panneaux. 14 3 Intégration de la Vidéo 3.1 Introduction Une des étapes primordiales du développement de notre application consiste à intégrer un lecteur vidéo dans l’application Sonic Visualiser. Nous avons donc intégré un visionneur de vidéo basé sur Mplayer directement dans l’application. Je vais donc vous détailler dans cette partie quelles sont les raisons de ce choix et comment nous avons pu nous adapter à l’application déjà existante. Pour obtenir l’ensemble des fonctionnalités nécessaires à notre application, nous devons permettre de lire une vidéo et d’en analyser la bande son. Etant donné que nous avons choisi d’utiliser Sonic Visualiser, il nous faut prendre en compte ses fonctionnalités pour rendre ce travail moins fastidieux et surtout faisable dans le temps qui nous était imparti à la réalisation de l’application. Nous nous sommes donc mis d’accord pour utiliser la fonction déjà existante de playback des fichiers sons en utilisant deux fichiers : le fichier son sera lu par les fonctionnalités déjà implémentées de Sonic Visualiser, et nous allons nous charger de lire un fichier vidéo sans sa bande son et de le synchroniser avec le fichier audio. S’il nous avait fallu une synchronisatoin absolument parfaite entre l’image et le son nous n’aurions pas adopté cette solution et nous aurions eu beaucoup plus de travail, mais ça n’est tout de même pas des plus simples. 3.2 Videolan vs Mplayer La première démarche suivie a été de rechercher quels sont les lecteurs vidéos Open Source avec lesquels nous pouvons travailler sans avoir de contraintes de codecs. Au départ j’ai retenu deux possibilités : Videolan qui intègre directement les codecs dont il a besoin, et Mplayer qui utilise libavcodec et qui peut également utiliser des codecs binaires non libres lorsque l’équivalent libre n’est pas disponible. 15 3.2.1 Versions testées Le premier Widget Qt permettant de lire les vidéos s’est donc basé sur libvlc dans sa version la plus récente (0.90) uniquement disponible sur serveur subversion. Cette nouvelle mouture de libvlc est beaucoup plus poussée que les versions précédentes et permet beaucoup plus de contrôle. Je m’attarderai ici essentiellement sur les fonctionalités qui nous intéressent et surtout sur la manière d’utiliser Videolan dans le but de synchroniser la vidéo qu’il lit avec le bande sonore elle-même lue par Sonic Visualiser. La deuxième Widget de lecture de vidéo est basé sur Mplayer. Il s’agit de la version 1.0 rc111(disponible sur debian testing). Le numéro de version importe peu mais il se peut que toutes les fonctionnalitées utilisées ne fonctionnent pas aussi bien sur les versions antérieures. Chacun des ces deux lecteurs a connu plusieurs versions pour pouvoir tester les capacités de sycnhronisation et la facilité de mise en oeuvre avec l’environnement déjà fourni par Sonic Visualiser. 3.2.2 Etapes de tests Dans une première version du lecteur on se contentait de lancer la lecture de la bande son et de la vidéo de manières simultanées. Les pauses se faisaient egalément de manière synchronisées pour toujours faire avancer ensemble la bande son et la vidéo ensemble. On ne pouvait pas alors parler de synchronisatoin étant donné qu’on ne pouvait que lire le média avec éventuellement des pauses au milieu. Très vite il a fallu en faire plus, effectivement il ne nous faut pas seulement nous contenter de lire une vidéo de bout en bout mais on doit pouvoir naviguer dans celle-ci... sans perdre la synchronisation. Les fonctionnalités de recherche fournies par Videolan et Mplayer sont par conséquent très importantes, d’autant que, plus ces fonctions seront rapides, plus le lecteur sera agréable à utiliser. L’API externe de Videolan que nous avons utilisée permet de se positionner sur le flux soit par le biais d’un pourcentage (ce qui n’est pas très pratique) soit en indiquant un temps en millisecondes. Ce niveau de précision pourrait être intéressant, mais le déplacement dans la bande son fourni par Sonic Visualiser n’est effectif qu’à la seconde près. Mplayer quand à lui ne permet que de se déplacer en indiquant un temps absolu ou relatif en secondes. Cette étape de test nous a permis de nous fixer sur Mplayer qui est beaucoup plus rapide dans sa phase de recherche même s’il paraı̂t moins précis au premier abord. 16 3.3 Utilisation de Mplayer 3.3.1 Utilisation d’un QProcess L’utilisation de Mplayer dans un Widget Qt est assez simple et se révèle très pratique même s’il faut faire attention à la manière de procéder. Contrairement à Videolan qui s’intègre par le biais d’une bibliothèque externe, Mplayer s’intègre en utilisant un processus externe à notre application. On impbrique alors celui-ci dans un object QProcess fourni par la bibliothèque Qt que nous utilisons. Cet objet nous permet de communiquer facilement avec le processus : il nous donne le moyen d’écrire sur son flux d’entrée pour lui envoyer des ordres ; il nous donne également la possibilité de lire sa sortie standard et sa sortie d’erreur pour récupérer les infos nécessaires à un bon fonctionnement. Par conséquent il ne suffit, pour l’utiliser, que d’avoir une version de Mplayer sur la machine, pas besoin d’installer de bibliothèques supplémentaire avec ses headers pour le développement. 3.3.2 Lancement du Processus Pour lancer le processus il suffit de connaı̂tre l’emplacement de l’executable et du lui passer les bons paramètres. Dans notre cas nous utilisons Mplayer en mode esclave et nous voulons qu’il se rattache à un Widget Qt, pour cela nous devons lui passer en argument l’identifiant du Widget utilisé pour le rendu. 3.3.3 Gestion des communications La communication entre les processus a été rendu très simple grâce à Qt. En effet pour pouvoir lire tout ce qui arrive sur la sortie standard d’un processus il suffit de connecter le signal du processus readyReadStandardOutput à une procédure de traitement. Cette procédure lit toutes les lignes disponibles et si elle trouve une ligne qui correspond à une information attendue elle traite l’information. Par exemple si on veut savoir la position actuelle de la vidéo on procèdera comme suit : A la création du lecteur on aura connecté les événements suivants comme ceci : connect(mplayerProcess, this, SIGNAL(readyReadStandardOutput()), SLOT(catchOutput())); On demande à Mplayer où il en est : mplayerProcess->write("get_time_pos\n"); Mplayer va alors écrire sur sa sortie standard et le mécanisme de connection de Qt va recevoir un signal et lancer la procédure apropriée. On trouvera alors une ligne dans le flux de sortie de ce 17 type : ANS_TIME_POSITION=2.4 Il faut bien faire attention à se débarasser des retours à la ligne et retours chariot (”n” et ”r”). La position récupérée est en secondes. 3.3.4 Fin de processus Un autre facilité par rapport à l’utilisation de libvlc est la facilité de gérer les arrêts du processus Mplayer. Si on arrive en fin de vidéo ou même lors d’une erreur inattendue il est très facile de détecter la fin du processus grâce à QProcess qui nous indique lorsque Mplayer se termine et le code de sortie indiqué par le processus. On peut alors traiter le cas et relancer la vidéo si nécessaire. 3.4 Lecture de sélections multiple Le lecteur de vidéo doit être capable de lire plusieurs séquences. Etant donné que le but de notre application est de vérifier la pertinences de descripteurs symboliques et numérique. Je ne vais pas décrire ici le détail de cette fonctionnalité mais lire plusieurs séquences d’une vidéo mis bout à bout en fait partie. Pour cela nous utilisons la fonction de lecture de sélection offerte par Sonic Visualiser. Une sélection pouvant être multiple, cela permet de lire plusieurs séquences de la bande sonore. Il suffit alors de pouvoir synchroniser la vidéo avec le son en cours de lecture. 3.4.1 Mécanisme de recherche de Mplayer Lorsque nous avons testé Videolan et Mplayer pour la rechercher à l’intérieur d’une vidéo nous avions remarqué qu’il y avait assez souvent des décalages entre la vidéo et le son. Ces décalages paraissaient d’autant plus étranges qu’ils pouvaient être infimes sur certaines vidéos comme ils peuvent être très grands sur d’autres. Finalement après quelques recherches sur Internet on a fini par trouver la raison. Un codec vidéo de type MPEG-x utilise un système de compression temporel. Certaines frames ne sont pas codées intégralement dans la vidéo, au lieu de stocker l’intégralité de chaque frame, on préfère calculer certaines images à partir d’images précédentes et/ou suivantes. Un codec utilise en faite une succession d’images de type (( I P B B B P I )) par exemple. I est une image stockée intégralement, P est caculée à partir de l’image I précédente et B peut se baser sur la précédente et la suivante. 18 Mplayer base sa recherche uniquement sur les images I. Cela permet une excellente rapidité étant donné que l’image I est plus rapidement lue qu’une image P ou B, mais cela peut être au détriment de la précision. En effet si on intercale beaucoup d’images de type P ou B entre les images I on aura plus de difficultés à se positionner précisément dans la vidéo. Il faut donc mettre en place un mécanisme permettant de re-synchroniser la vidéo avec le son lorsque celle-ci ne peut se positionner à l’endroit exact de la bande son. 3.4.2 Synchronisation de la vidéo sur la bande son Pour que le mécanisme de synchronisation soit simple et fonctionne sur tous types de lecture de la bande son (lecture simple avec recherche pendant la lecture ou lecture de sélection multiple) nous avons choisi de synchroniser la vidéo sur le son. Encore une fois s’il nous avait fallu une synchronisation parfaite ce système aurait été loin d’être parfait. Dans notre cas il est simple et très efficace. Fig. 3.1 – Synchronisation de la vidéo. A intervalle régulier (toutes les 500ms), la lecteur vidéo va demander à Sonic Visualiser la position de la piste audio, il va la comparer avec sa position actuelle et réagir selon le cas : – Si l’intervalle entre la position dans le flux sonore et la position dans la vidéo est inférieur 19 à 1 seconde, il ne fait rien. – S’il y a un décallage et que la vidéo a du retard il va re-lancer une recherche de la vidéo au temps indiqué par la bande son. – Si la vidéo a de l’avance elle se met en pause pour se relancer uniquement lorsque le son aura rattrapé son retard. De cette manière on se synchronise très bien et de manière automatique lorsqu’on fait une recherche à une position particulière ou lorsqu’on essaie de lire une sélection multiple. Il se peut que la synchronisation prenne du temps avec des codecs particuliers, dans ce cas nous indiquons à l’utilisateur une estimation du temps de synchronisation. 20 Fig. 3.2 – Diagramme de séquence typique de synchronisation. 21 4 Query Descriptor 4.1 L’objectif L’objectif de cet outil, est de permettre à l’équipe PELOPS de raffiner les descripteurs symboliques, en vue d’extraire des résumés vidéos des manifestations sportives traitées. A partir des descripteurs symboliques et numériques générés par leurs outils de reconnaissance de situations. On met à disposition, un moteur de requêtes, permettant de comparer efficacement les corrélations entres les descripteurs. La première version proposée était basée sur l’exploitation du fichier xml Sonic Visualiser, avec un moteur XQuery. Très vite, nous nous sommes heurtés à l’incapacité de pouvoir décrire convenablement les requêtes demandées en XQuery. Après étude, nous nous sommes orientés vers un outil de type interpréteur de commandes, plus apte à répondre aux requêtes susceptibles d’être demandées. La solution proposée est basée sur un analyseur lexical / syntaxique du type Lex et Yacc. Cette méthode nous permet d’être totalement autonomes sur les spécificités des fonctions de comparaison, ainsi que sur notre capacité d’enrichissement des fonctions de comparaison. 4.2 Aspects techniques Concernant l’interpréteur du Query Descriptor, nous avons été confrontés à des problèmes d’intégration avec la version C de Flex et Bison (Lex /Yacc sous linux) avec l’environnement QT 4.2 en C++. Après maintes tentatives de résolution du problème, nous nous sommes décidés à passer à une version sous java. Plus simple, à mettre en oeuvre et assez performante au demeurant. Pour la mise au point de l’intégrateur, nous tenons à remercier le professeur ROBIN Sophie, pour son aide précieuse et efficace. Cette décision d’utiliser Java plutôt que C pour la réalisation du moteur de requêtes, n’a pas été sans soucis majeurs. Il nous a fallu aussi trouvé, rapidement, une bi- 22 bliothèque en java, susceptible de communiquer avec les composants Widgets de Qt TrollTech. Et ceux pour un respect de cohérence graphique avec Sonic Visualiser. Cette contrainte nous a permis entre autre, de découvrir la bibliothèque QtJambi, développée par TrollTech. http ://www.trolltech.com/developer/downloads/qt/qtjambi-techpreview. Cette bibliothèque offre un accès natif aux widgets graphiques des bibliothèques QT 4.2., avec l’utilisation massive de JNI, (Java Native Interface). Multiplateforme et respectant totalement l’interface des objets Qt, cette bibliothèque offre également tous les mécanismes d’interaction système/utilisateur développés chez TrollTech. En somme, une alternative réellement bleufante, capable de rivaliser avec SWT de chez IBM. 23 4.3 L’outil - Query Descriptor Son interface se compose de quatre modules de travail et est principalement axée sur une zone de texte (Query), qui permet à l’utilisateur de spécifier sa requête sur les descripteurs présents dans sa session de travail. Fig. 4.1 – Query Descriptor Les fonctionnalités du produit : – le Menu permet, le chargement d’un fichier session Sonic Visualiser. Il offre la possibilité d’enregistrer les résultats obtenus dans un format reconnu comme un nouveau descripteur dans la session de Sonic Visualiser. Ainsi que la possibilité d’exporter le résultat pour l’extraction du futur résumé vidéo – Query, L’éditeur de requêtes offre une coloration syntaxique, permettant à l’utilisateur de vérifier l’exactitude de ses commandes, et éviter par la même occasion, d’exécuter des requêtes erronées. – Descriptors, composant permettant l’affichage des différents descripteurs symboliques présents, dans la session, ainsi que ceux que l’utilisateurs aurait créé avec le module Numeric Descriptors. Un descripteur est affiché avec sa liste de segments rattachés. – Result, permet l’affichage des résultats obtenus après exécution d’une requête, sous la même forme que les descripteurs utilisés pour formuler la requête. 24 – Numeric Descriptors, ce cadre permet la création de nouveaux descripteurs symboliques à partir des descripteurs numériques présents dans la session. La création des nouveaux descripteurs symboliques se fait par seuillage des descripteurs numériques, plus ou moins un delta temporel. Fig. 4.2 – Technique de seuillage 4.4 Les formats d’exportation Le format d’enregistrement du résultat est conforme au format d’importation des descripteurs symboliques mis en place dans Sonic Visualiser (cf. Import des fichiers descripteurs). 4.5 Le langage de requête Le langage est basé sur onze commandes, et devrait être, à terme, enrichi. Liste des commandes : incrEnd, incrStart, getStart, getEnd, before, after, isIn, cover, meet, union, inter. Toutes les opérations sont faites sur les segments des descripteurs symboliques. Exemple de requête demandée : ((NOMDESC incrEnd 1) cover (getStart DESC2)) union DESC3 ; 25 Pour les fonctions de traitement des segments, nous nous sommes inspirés de l’article suivant : Explaining preferred mental models in Allen inferences with a metrical model imagery, dont est extrait le tableau suivant : Fig. 4.3 – Liste des fonctions de traitement de segments 4.5.1 incrEnd Permet d’incrémenter la fin des segments d’un descripteur. Exemple : NOMDESC incrEnd 1 4.5.2 incrStart Permet d’incrémenter le début des segments d’un descripteur. Exemple : NOMDESC incrStart 1 4.5.3 getStart Permet d’extraire la première seconde des segments d’un descripteur. Exemple : getStart NOMDESC 26 4.5.4 getEnd Permet d’extraire la dernière seconde des segments d’un descripteur. Exemple : getEnd NOMDESC 4.5.5 before Permet d’extraire les segments de NOMDESC1 se trouvant avant ceux de NOMDESC2. Exemple : NOMDESC1 before NOMDESC2 4.5.6 after Permet de récupérer tous les segments de NOMDESC1 qui se trouvent après ceux de NOM- DESC2. Exemple : NOMDESC1 after NOMDESC2 4.5.7 isIn Permet d’extraire les segments de NOMDESC1 contenus dans ceux de NOMDESC2. Exemple : NOMDESC1 isIn NOMDESC2 4.5.8 cover Permet d’extraire les segments de NOMDESC1 qui recouvre ceux de NOMDESC2. Exemple : NOMDESC1 cover NOMDESC2 4.5.9 meet Permet d’extraire les segments de NOMDESC1 qui sont mitoyens avec ceux de NOMDESC2. Exemple : NOMDESC1 meet NOMDESC2 4.5.10 union Permet de récupérer l’union de tous les segments mitoyens. Exemple : NOMDESC1 union NOMDESC2 27 4.5.11 inter Permet d’extraire l’intersection de tous les segments. Exemple : NOMDESC1 inter NOMDESC2 4.6 Fonctionnalités non-implémentées Il serait intéressant, à terme, d’ajouter d’autres fonctionnalités dans cet outil. Par exemple, la possibilité d’enregistrer les travaux en cours, avec la session de travail, les requêtes qui ont été testées, ainsi que leurs différents résultats. Offrir, la possibilité de gérer les résultats sous une forme plus globale, permettant de préserver la démarche utilisée pour rafiner les requêtes. Ajouter un nouveau type de descripteur, un descripteur numérique multi-dimensionnel, appelé vectoriel. L’idée, serait d’offrir plusieurs valeurs pour un point donnée de la courbe des relevés. 28 5 Import des fichiers descripteurs 5.1 Format de fichier de Sonic Visualiser L’application Sonic Visualiser permet de visualiser et d’analyser un flux audio. Le travail peut être enregistré dans une session sur un disque sous la forme d’un fichier sv. Ce fichier sv est un fichier XML compressé avec BZip. Ce fichier de sauvegarde contient le détail de la session de l’utilisateur à savoir le ou les noms des fichiers sons utilisés, les types d’analyseurs utilisés pour le traitement du signal ainsi que leurs résultats. Les principales balises contenu dans le fichier sont les balises model, dataset, point et layer. Exemple de fichier sv : <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sonic-Visualiser> <sv> <data> <model id="0" name="hihat.wav" sampleRate="44100" start="0" end="13888" type="wavefile" file="/home/arthur/workspace/videosonic/samples/hihat.wav" mainModel="true"/> <model id="2" name="EmptyModel" sampleRate="44100" start="37888" end="37888" type="sparse" dimensions="4" resolution="1" notifyOnAdd="true" dataset="1" valueQuantization="1" minimum="178" maximum="178" units=""/> <dataset id="1" dimensions="4"> <point frame="37888" value="178" duration="163840" label="New Point" /> </dataset> <layer id="3" type="waveform" name="Waveform" model="0" gain="1" colour="#000000" showMeans="1" greyscale="1" channelMode="0" channel="-1" scale="0" aggressive="0" autoNormalize="0"/> <layer id="4" type="timeruler" name="Ruler" model="0" colour="#000000"/> <layer id="5" type="symbolic" name="Symbolic" model="2" colour="#008000" 29 verticalScale="1"/> </data> <display> <window width="1193" height="736"/> <view centre="0" zoom="1024" followPan="1" followZoom="1" tracking="page" light="1" type="pane" centreLineVisible="1" height="208" > <layer id="4" type="timeruler" name="Ruler" model="0" colour="#000000"/> <layer id="3" type="waveform" name="Waveform" model="0" gain="1" colour="#000000" showMeans="1" greyscale="1" channelMode="0" channel="-1" scale="0" aggressive="0" autoNormalize="0"/> <layer id="5" type="symbolic" name="Symbolic" model="2" colour="#008000" verticalScale="1"/> </view> </display> <selections > </selections> </sv> 5.1.1 Model La balise model contient les informations sur les sons (wavefile) utilisés ou les informations sur les des descripteurs appliqués à ces sons. Elle peut aussi contenir les différents autres types de modèles utilisés dans l’application. Les modèles présents dans l’application sont les modèles Text, Notes, etc. <model id="0" name="son.wav" sampleRate="44100" start="0" end="13888" type="wavefile" file="../samples/hihat.wav" mainModel="true"/> 5.1.2 Dataset La balise dataset contient les points d’interaction des descripteurs. Les balises de type dataset sont rattachés à un seul modèle mais un modèle peut définir plusieurs balises dataset. <dataset id="1" dimensions="4"> 30 5.1.3 Point La balise point contient les informations de chaque point. Les points ont une image de départ, une durée, une valeur ou une hauteur de positionnement sur le signal, ainsi qu’un label contenant le nom du point. <point frame="37888" value="178" duration="163840" label="New Point" /> 5.1.4 Layer La balise layer contient les couches graphiques qui seront affichées ou non dans l’interface graphique. Chaque couche est reliée à son modèle. Elle permet en autre de définir la couleur d’affichage du modèle, le texte affiché et son type de lecture. <layer id="4" type="timeruler" name="Ruler" model="0" 5.2 colour="#000000"/> Format de fichier projet Les fichiers clients sont de forme textuelle. Nous les avons formaté au format xml et proposé une extension de nom desc. Pour importer ses fichiers dans Sonic Visualiser, nous avons choisi d’utiliser les mêmes nom de balise de Sonic Visualiser pour faciliter l’insertion dans le code. Le client désire deux types de descripteur à rajouter et à pouvoir manipuler. Les descripteurs numérique et symbolique. Fig. 5.1 – Objectif L’objectif est de pouvoir importer des fichiers du client dans l’application existante, de les sauvegarder au format prédéfini et de pouvoir les lire et ré-afficher tel qu’ils ont été importé. 31 5.2.1 Descripteur symbolique Le type symbolique représente une action pendant un temps donné. Par exemple, les cris de la foule lors d’un match de football. Ce type de descripteur n’existait pas dans l’application et nous avons du le créer. Nous nous sommes inspirés du modèle NotesModel qui s’en rapprochait le plus. Nous avons créer un nouveau modèle symbolique et une nouvelle couche graphique pour ce modèle. Voici un exemple de descripteur symbolique. Fig. 5.2 – Exemple de descripteur symbolique, les cris de foule. Voici le code XML représentant un descripteur symbolique : <model name="nomDescripteurSymbolique" type="symbolic" sampleRate="44010" dataset=" <dataset id="2"> <point frame="1550" duration="2000" /> <point frame="7000" duration="500" /> </dataset> 5.2.2 Descripteur numérique Le type numérique représente un ensemble de points définis qui forment visuellement une courbe. Le modèle SparseTimeValue de Sonic Visualiser proposait un modèle se rapprochant du type numérique. Nous l’avons adapté et réutilisé pour l’affichage graphique. Voici un exemple de descripteur numérique : Voici le code générique XML représentant un descripteur numérique. <model name="nomDescripteurnumerique" type="numeric" sampleRate="44100" dataset="numeroDat 32 Fig. 5.3 – Exemple de descripteur numérique <dataset id="numero"> <point frame="0" value="27.2283" /> <point frame="64" value="27.9402" /> <point frame="128" value="27.7351" /> .... </dataset> 5.3 Intégration des descripteurs dans Sonic Visualiser Nous avons crée des fichiers gérant le balayage (parsing en anglais) des descripteurs pour récupérer les valeurs et les insérer dans le code et dans le fichier de sauvegarde de la session en cours. Ce fichiers sont DescriptorFileReader.h et DescriptorFileReader.cpp. 33 Voici un schéma représentant l’insertion des fichiers dans les classes existantes. Fig. 5.4 – Intégration du descripteur numérique La classe DescriptorFileReader balaye le fichier XML, détermine le type de descripteur et crée un nouveau modèle de type SparseTimeValue puis une nouvelle couche TimeValueLayer qui est insérée dans le panneau graphique courant (Classe Pane) du document (Classe Document) de la session. La couche est ensuite insérée visuellement dans l’interface graphique de l’application. L’implémentation du balayage XML est facilité par la classe fournit par QT, QXmlDefaultHandler. La fonctionnalité qui permet de modifier et de récupérer le nom du descripteur a due être rajoutée aussi bien dans la classe DescriptorFileReader que dans SVFileReader qui le lecteur de fichier session de Sonic Visualiser. Les classes définissant le modèle symbolique ainsi que la couche graphique n’existant pas nous les avons rajouté. Nous avons aussi modifié le programme d’origine pour qu’il accepte et intègre ces fichiers à l’avenir. 34 Fig. 5.5 – Intégration du descripteur symbolique La classe FactoryLayer a été modifié pour intégrer la nouvelle couche SymbolicLayer. Cette classe permet la fabrication de toutes les couches graphiques. La classe MainWindow a été modifié pour insérer un bouton permettant de charger un descripteur symbolique. La classe SVFileReader a été changé pour pouvoir inclure des fichiers de session contenant le nouveau modèle symbolique permettant ainsi un chargement du nouveau type par la suite. Nous nous sommes inspirés des classes NotesModel et NotesLayer pour les nouvelles classes. Il est possible graphiquement de créer un nouveau descripteur symbolique en le dessinant la zone du signal audio. Il est possible de modifié la place du descripteur, de le supprimer, de changer son nom et sa couleur. Un fichier descripteur peut comporter soit un descripteur symbolique, soit numérique ou les deux en même temps. 5.4 Taux d’échantillonnage Lors de l’importation d’un descripteur textuel, l’application Sonic Visualiser propose à l’utilisateur de convertir les données au taux d’échantillonnage qu’il souhaite ainsi que le taux d’incrémentation entre deux images. Cet outil ne propose pas la possibilité de choisir le type de descripteur que l’on souhaite obtenir avec ces données et ne prend pas en compte le taux d’échantillonnage de la session en cours. 35 Fig. 5.6 – Outil de conversion de Sonic Visualiser Nous avons donc facilité cette étape en convertissant automatiquement le taux d’échantillonnage des descripteurs symbolique et numérique au taux d’échantillonnage de la session en cours. Le taux d’incrémentation entre les images est également calculé et nous modifions la valeur des images en fonction de ce taux Voici un exemple illustrant cette fonctionnalité. Si nous importons un descripteur symbolique dont le taux d’échantillonnage est de 22050 dans une session dont le taux d’échantillonnage est de 44100 tel que celui-ci : <model name="nomDescripteurSymbolique" type="symbolic" sampleRate="22050" dataset="2"/> <dataset id="2"> <point frame="750" duration="2000" /> <point frame="3500" duration="500" /> </dataset> Nous obtenons : <model name="nomDescripteurSymbolique" type="symbolic" sampleRate="44100" dataset="2"/> 36 <dataset id="2"> <point frame="1500" duration="4000" /> <point frame="7000" duration="1000" /> </dataset> 37 6 Conclusion Ce projet, nous a permis de prendre contact avec de nouveaux outils de développement tels que : – Les widgets Qt de Trolltech, bibliothèque professionnelle efficace en terme de productivité de code, de facilité de prise en main, de rapidité de développement, ainsi que par la richesse des fonctionnalités proposées, et d’outils graphiques disponibles. – JFlex et BYacc/J, outils d’analyse lexical et syntaxique, adaptés au monde Java. La phase d’études des produits existants, nous a permis de mieux spécifier, et cerner les besoins de l’équipe PELOPS, en ce qui concerne les fonctionnalités de base du projet. Nous sommes arrivés conjointement à la conclusion qu’un produit comme Sonic Visualiser offrait déjà une bonne base de départ. Au terme des modifications et évolutions apportées, cela nous permettrait de fournir un produit exploitable plus rapidement par l’équipe PELOPS. Pour conclure, nous pouvons dire qu’une grande partie des objectifs ont été atteints : – Modification et amélioration de l’ergonomie du produit initial qu’est Sonic Visualiser. – Ajout de la vidéo, avec synchronisation du son, point important, permettant à l’équipe PELOPS, d’opérer des vérifications terrain plus efficaces. – Mise en place d’un moteur de requêtes permettant d’affiner la pertinence des descripteurs générés. Il a pour but de produire un résultat exploitable, à terme, pour la création du résumé vidéo de l’évènement sportif étudié. 38 7 Informations générales 7.1 Serveur Subversion http ://forge.ifsic.univ-rennes1.fr/projects/videosonic 7.2 7.3 Responsables IRISA [email protected] Mathieu BEN [email protected] Gilles GONON Equipe MITIC [email protected] [email protected] [email protected] [email protected] Arthur DIBON 06 21 88 23 10 Damien LE BERRIGAUD 06 60 21 38 80 Laurent POIRIER 06 86 78 15 59 Mickaël SIMON 06 23 12 19 56 39