[Stage] Développement d’une application de streaming sous Android

Ce projet de déve­loppement Android, effectué à Hexabyte et encadré par Rached Ben Hassine du Service Développement, s’insère dans  le projet de commercialisation d’un nouveau boitier qui connecte la télé du salon au modem ADSL : la Net Box .

netbox

hexaaaa

Grâce à ce boitier, on peut naviguer sur Internet avec un fureteur basique installé dans la box, lire les infos sur les sites, consulter facebook ou regarder les vidéos en streaming en SD ou HD. Basé sur l’OS Android, cette Net Box peut télécharger tous les logiciels et jeux disponibles sur l’Android Market (à l’instar de Skype ou Angrybirds) pour pouvoir les utiliser sur son téléviseur.

sedea-android-boxsedea-android-box (1)
5-best-android-apps-for-streaming-from-pc-to-phone-header

Pour le lancement de la NetBox, Hexabyte a fixé l’objectif d’enrichir le soft de ce boitier par un service de streaming vidéo où le client a un libre accès à une base d’une centaine de films et une dizaine de séries et quelques chaînes télévisées.

Le but étant de proposer des vidéos de haute qualité regardables sans coupure même pour des connexions  à faible débit, en utilisant le protocole MMS.

L’application proposera une véritable plateforme de vidéo à la demande de haute qualité.

La première étape de notre travail avec l’environnement Android a été d’appré­hender le SDK, l’architecture et le déve­loppement d’une application ainsi que son déploiement sur un terminal embarquant Android.

1.   Présentation du SDK

Google a mis en place un grand nombre d’outils pour aider les développeurs Android.

1.1.            Le portail des développeurs

La première chose à visiter est le portail des développeurs Android, mis en place par Google.

http://developer.android.com/

eee

Très complet, ce site présente Android, ex­plique comment installer et utiliser les différents outils (SDK, NDK etc.), propose un ensemble de tutoriels et articles concernant le développe­ment d’applications Android, expose la réfé­rence de l’API Android ainsi que les actualités liées à Android.

1.1.2.            Le SDK Android

L’outil le plus important est le SDK Android. Facile à installer, il permet de télécharger tous les outils indispensables au développement d’applications. Un petit logiciel permet d’abord de télécharger les différentes versions du SDK (une version du SDK par version d’Android : 1.4, 1.5, 1.6, 2.0 etc.). Il permet également de télé­charger les différentes versions des Google APIs (APIs pour intégrer des fonctionnalités liées aux services Google tels que Maps etc.) ou de la do­cumentation JavaDoc. Son fonctionnement est similaire aux gestionnaires de paquets de Linux.

22

1.3.            ADT pour Eclipse

Eclipse est l’Environement de Développe­ment Intégré (ou IDE) le plus largement utilisé pour la programmation Java; très performant, il est de plus gratuit et open source.

http://www.eclipse.org/

zeee

Le langage privilégié pour le développe­ment d’applications Android est justement Java. Google a donc tout naturellement conçu un plugin pour Eclipse (un plugin est un module qui complète un logiciel hôte pour lui apporter de nouvelles fonctionnalités).

Android Development Tools, ou ADT, est très complet et surtout très pratique : concep­tion graphique d’interfaces utilisateur, debug distant sur un téléphone, gestion de l’architec­ture de fichiers d’une application etc.

1.4.            Emulateur

Le SDK pro­pose un émulateur Android. Il permet de lancer sur la machine du développeur un terminal vir­tuel représentant à l’écran un téléphone embar­quant Android. C’est bien évidemment un outil indispensable pour le développement mobile. A chaque version d’Android est associée une ver­sion de l’émulateur, permettant au développeur de voir exactement à quoi ressemblera son ap­plication sur un matériel réel. Nous rappellons  cependant que l’émulateur ne propose pas toutes les fonctionnalités d’un vrai téléphone.

efefe

2.   Architecture d’Android

Pour bien comprendre comment accéder à ce profil, nous allons commencer par détailler l’architec­ture du système Android. Le portail des déve­loppeurs Android présente l’architecture du système avec le schéma ci-contre.

archi

2.1.            Linux Kernel

Android s’appuie sur le noyau Linux 2.6 pour les services système de base tels que la sé­curité, la gestion de la mémoire et des proces­sus, le réseau et la gestion des drivers. Le noyau sert de couche d’abstraction entre le matériel et le reste de la pile logicielle.

2.2.            Android Runtime

Android inclut un ensemble de librairies fournissant la plupart des fonctionnalités des librairies standard de Java. Chaque application Android s’exécute dans un processus, avec sa propre instance de la machine virtuelle Java, appelée Dalvik. Dalvik a été écrit pour optimi­ser l’exécution d’une multitude d’instances de la machine virtuelle, avec une empreinte mé­moire réduite. Dalvik s’appuie sur le noyau Linux pour les fonctionnalités bas-niveau tels que les threads ou la gestion de la mémoire.

2.3.            Librairies

Android fournit un ensemble de librairies C/C++ utilisées par différents composants du système. Ces fonctionnalités sont rendues disponibles aux développeurs au travers du fra­mework d’application d’Android. On trouve parmi ces librairies: librairie C standard, moteurs d’affichage 2D et 3D, SQLite, rendu des polices de caractères etc.

2.4.            Application Framework

Le framework d’application est la couche qui nous intéresse tout particulièrement. C’est elle qui fait le lien, grâce à un ensemble d’APIs Java, entre le système et l’application. Étant un système ouvert, Android permet aux dé­veloppeurs de concevoir des applications très riches et de tirer partie d’un maximum de fonc­tionnalités. Les développeurs ont donc accès aux même fonctionnalités que celles utilisées par les applications fournies avec Android. Toute application Android repose sur un ensemble de services et systèmes parmi lesquels :

»»Un ensemble de «Views» permettant de construire l’interface graphique de l’ap­plication : listes, grilles, champs textes, images, et même intégration d’un navi­gateur web ou d’une vue Google Maps

»»Des «Content Providers» qui permettent aux applications d’accéder à des don­nées d’autres applications ou de parta­ger ses propres données

»»Un «Ressource Manager» pour accéder à des éléments autres que du code : don­nées textuelles traduites, images, des­criptions XML d’interfaces graphiques etc.

»»Un «Activity Manager» pour gérer le cycle de vie de l’application

Ce rapide survol de l’architecture du sys­tème permet de mieux comprendre com­ment fonctionne une application Android. Confinée dans la couche la plus haute, elle ac­cède au système uniquement via les APIs Java exposées par la couche Application Framework. Ainsi, si une fonctionnalité est présente dans le noyau Linux (couche rouge sur le schéma) ou dans les libraires système (couche verte), mais qu’elle n’est pas reliée au framework d’applica­tion, elle ne sera pas utilisable directement dans une application Android.

3.   Présentation du NDK

L’API d’Android propose un lecteur (une classe) qui peut être utilisé pour contrôler la lecture de fichiers audio / vidéo et des flux.: android.media.MediaPlayer

Malheureusement, ce lecteur native d’android ne supporte que les format mp4 et 3gp, et les flux http. Alors que les fichiers du serveur de streaming sont au format WMV (Windows Media Video) et le protocole de streaming utilisé est MMS(Microsoft Media Services ). Ces deux exigences ne nous laisse pas le choix que d’implémenter notre propre lecteur.

Pour ce fait, nous avons dû introduire des librairies third-party en utilisant le framework JNI, essentiellement FFMPEG qui est dédiée au traitement de flux audio ou vidéo (enregistrement, lecture ou conversion d’un format à un autre), mais aussi Simple DirectMedia Layer (SDL) qui gère  le multithreading, l’affichage vidéo et l’utilisation de timers précis, et uchardet qui permet la détection du codage, qui prend une séquence d’octets dans un codage de caractères inconnu sans aucune information supplémentaire, et tente de déterminer l’encodage du texte.

200px-FFmpeg-logo.svg

3.1.            JNI

D’après http://fr.wikipedia.org/wiki/Java_Native_ Interface

Le JNI (Java Native Interface) est un fra­mework qui permet à du code Java s’exécutant à l’intérieur de la JVM d’appeler et d’être appe­lé par des applications natives (c’est-à-dire des programmes spécifiques au matériel et au sys­tème d’exploitation de la plate-forme concernée), ou avec des bibliothèques logicielles basées sur d’autres langages (C, C++, assembleur, etc.). Voici quelques exemples d’utilisation de la JNI :

»»Implémentation de fonctions du système d’exploitation qui ne sont pas présentes dans la bibliothèque Java

»»Interfaçage avec des applications écrites dans d’autres langages

»»Amélioration des performances, un lan­gage compilé (c’est-à-dire du code natif ) étant plus  rapide que de passer par le bytecode de Java.

3.2.            NDK

efzefz

Le NDK pour Android (Native Development Toolkit) propose un ensemble d’outils pour per­mettre aux développeurs d’utiliser le framework JNI dans leurs applications. Alors qu’une appli­cation s’éxécute au sein de la machine virtuelle Dalvik, le NDK permet d’implémenter une partie de l’application en utilisant du code natif tel que C ou C++.

Cette technique permet d’une part d’améliorer les performances de certains algo­rithmes ou programmes, et d’autre part d’avoir accès à plus de fonctionnalités que ce que pro­pose l’Application Framework. Le NDK fournit:

»»Un ensemble d’outils pour compiler du code source C ou C++ pour Android

»»Une manière de déployer ce code com­pilé sur un matériel Android et de l’inté­grer à une application Android écrite en Java

»»De la documentation, des exemples et des tutoriels

1.3.3.            Pratique

Nous avons téléchargé et installé dans un premier temps le NDK Android. La configuration s’est faite sans pro­blème. Nous avons pu rapidement concevoir et développer une application permettant de tester le NDK en faisant appel à une fonction écrite en C++ depuis notre application Android écrite en Java. Les premiers tests furent donc concluants.

L’étape suivante a alors été de récupérer le code des fonctions qui nous intéressaient et de les incorporer dans notre application. Nous avons donc téléchargé le code source de la librairie FFMPEG et regardé les sources. Malheureusement, FFmpeg est un projet peu documenté avec un code source non commenté et assez obscur. Il nous a donc fallu un certain temps pour com­prendre la structure du code et isoler la partie concernant le décodage des fichiers videos de format wmv. Une fois cette partie isolée, il ne restait plus qu’à la recopier dans notre projet NDK et de compiler le tout pour Android.

Mais bien entendu, la compilation s’est avé­rée assez difficile sous windows. En effet, de nombreuses fonc­tions déclarées dans ce code étaient en réalité définies dans d’autres fichiers. A l’édition des liens, nous avons obtenu donc de nombreux mes­sages d’erreur signalant des fonctions introu­vables. Aucune documentation n’étant dispo­nible, il a fallu pour chacune de ces fonctions rechercher le fichier la définissant, l’incorporer au projet, puis corriger toutes les nouvelles er­reurs de syntaxe et de dépendance liées à l’arri­vée de ces nouveaux fichiers dans le projet. Ce fut donc un travail long et fastidieux.

En faisant le tour des forums de développement, nous avons découvert une nouvelle solution pour la compilation avec NDK . En effet,  il est recommandé d’utiliser une version récente de Linux pour la compilation tel que ubuntu  12, étant donné qu’il présente un environnement assez riche pour le NDK en termes de librairies. L’extraction du code qui nous intéresse dans la librairie FFMPEG ne se fait pas manuellement comme dans le cas de compilation sous windows , il faut écrire un script en y spécifiant la configuration espérée (les fonctionnalités, la version du cpu hote, la version d’Android…)

Cependant, nous avons fini par réussir à éli­miner toutes les erreurs de compilation et d’édi­tion des liens et à compiler la libraire FFMPEG. Le résultat est un fichier d’extension ‘.so’ (libffmpeg.so) que nous avons déplacé vers le dossier « libs/armv5te » sous notre projet.

Remarque : Nous avons utilisé la machine virtuelle de Oracle ( VM VirtualBox ) avec l’OS ubuntu 12, le déplacement du fichier « libffmpeg.so » de la machine virtuelle à l’OS hote (windows 7) est assuré par la fonction de partage de dossier.

Nous avons aussi réussi à compiler les autres librairies (SDL, iconv, universalchardet..) sous windows. Il suffit de placer le code sous le dossier JNI du projet et de compiler avec la commande ndk-build du NDK, les fichiers ‘.so’ sont automatiquement créés dans le dossier ‘libs’.

4.   Protocole MMS

Les flux de données du serveur streaming d’Hexabyte sont transférés selon le protocole MMS (Microsoft Media Services ). C’est un protocole propriétaire mis en place par Microsoft. Il est utilisé pour transférer des données en unicast, depuis un serveur de flux (Windows Media Services, initialement appelé NetShow Services) vers un client multimédia (Windows Media Player ou Totem, par exemple). MMS peut être utilisé en UDP ou en TCP. Le port par défaut utilisé par MMS est : UDP/TCP 1755.

Ceci pose un problème car les API d’Android, et la librairie FFMPEG ne supportent pas ce protocole.

Il fallait patcher FFMPEG pour qu’elle soit compatible avec le protocole MMS malgré le manque de documentation, puis recompiler la librairie et l’introduire de nouveau dans le projet.

5.   Interface Graphique

L’application présente une interface simple et moderne, composée essentiellement d’un menu pour le choix de la section (cinema, séries  ou chaines télévisées). Dans la section cinema, le client a accès à une large base de  films qui sera mise à jour continuellement. Il peut filtrer la liste par genre( Action, comédie, suspense, romantique…) ou par date de sortie (2012, 2005, 1980…). Chaque film propose un bref descriptif avec le nom du réalisateur, les stars, et une barre de classement. Pour lancer le streaming, il suffit de cliquer sur le bouton « regarder » :

interface 1

Le lecteur présente un affichage du temps total et du temps écoulé en haut, un bouton pour changer d’aspect ratio (dimensions d’écran: 16/9 ou 4/3) en bas à gauche, un bouton pour mettre en pause et jouer, et enfin un bouton pour revenir au menu en bas à droite :

interface 2

6. Conclusion

Un des principaux avantages de ce stage à été pour nous de découvrir Android dans sa globalité. Nous avons pu toucher à de nombreuses facettes du Framework et donc profiter pleinement des  possibilités qui sont offertes aux développeurs.

En effet, nous avons pu nous familiariser avec le protocole MMS  et le décodage vidéo sous Android. Ce monde nous était étranger et n’en voyons jusque-là pas la portée. Désormais, notre vision des choses s’est éclaircie et nous pouvons  en mesurer l’étendue.

Enfin, il nous parait de plus judicieux de remarquer qu’un lecteur compatible avec le format WMV sera probablement implémenté, dans le futur, dans l’API Java Media d’Android. En effet, chaque nouvelle version d’Android apporte son lot de nouveautés ; plusieurs fonctionnalités ont ainsi été implémentés depuis Android 1.0. Aucune date n’est cepen­dant officiellement prévue concernant l’intégration d’un nouveau lecteur à Android.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s