dimanche 11 février 2018

Vidéo 360 degrés et stéréo 360 degrés

Un mini prototype me permet de générer des images à partir des données produites par les différents générateurs. Avec une abstraction entre la génération de contenue et le rendu, il est assez simple de travailler sur la génération de contenue utilisant un rendu simple ou inversement sur l'amélioration du rendu sans avoir à modifié le contenue.

Ceci dit, un des buts est de générer des vidéos en stéréo 360 degrés afin de pouvoir les visionner via les différents casque de réalité virtuelle. Outre la complexité de générer le contenu en 3D, et ce en double ( chaque oeil ), les formats et outils ne sont pas encore répendus ni convivials.

Les appareils mobile on encore de la difficulté à décoder du vidéo 4K, et ceux qui le peuvent sont limités à 30 images secondes. Puisque les images 4K sont gourmandes côté bande passant, une compression x265 serait la bienvenue mais la plupart des appareils ne supporte pas encore nativement le x265. Sans parler du support pour le HDR qui est présent mais limité sous x264. Je ne crois pas qu'il y ai un casque de VR dont l'écran supporte le HDR de toute manière. Je n'ai pas regardé du côté du support de VP9.

Bien que FFMPEG peut générer le stream x264 ou x265, il ne peut spécifier les métadonnée pour indiquer que le type de vidéo est 360 degrés ou stéréo 360 degrés. Youtube fourni un utilitaire permettant d'ajouter les métadonnées nécessaires à un vidéo .mp4, donc une étape de plus dans le pipeline. Pour ce qui est des images, exiftool est recommandé pour ajouter les métadonnées nécessaires. Facebook donne un peu plus d'information sur le sujet.

Enfin, ce n'est pas encore au point mais avec povray, suffit d'ajouter 'spherical' comme attribut à la caméra et spécifier un angle de 360. De ce côté, au moins, c'est simple.

Prochaines étapes avant de mettre ici un films en 360 degree via youtube:

  • Déboguer l'utilisation du texte UTF8 et POVRAY
  • Générer les images en OpenEXR ( HDR )
  • Générer le film x264 30 fps a partir des OpenEXR
  • Ajouter via appel de commande l'injection de métadonnées pour le 360 degré
Il y aura peu de nouvelles incluses car le temps de rendu sur mon vieu i5-750, bien c'est long!



dimanche 4 février 2018

POV-Ray, je ne pensais pas m'en servir de nouveau!

Chose certaine, Python ne vient pas avec une excellent librairie graphique. PIL ( ou le fork Pillow ) permet un minimum de commandes de dessins et de manipulation d'image mais c'est assez limité. Sinon plusieurs ré-écrivent des commandes de base par dessus un array en numpy.

Anyway, comme je voulais avoir un prototype assez rapidement, je n'ai pas trop porté attention et me suis dit que j'implémenterais le minimum avec PIL le temps d'avoir un pipeline de création de contenu plus solide. Cependant PIL est vraiment, mais vraiment limité. J'ai décider de regarder rapidement pour interfacer un moteur de rendu et utiliserai PIL seulement pour la composition, si nécessaire. Ceci dit, j'ai pensé prendre Appleseed mais le moteur Python est sous 2.7 alors que mon projet est sous 3.6. Sinon Lux permet un integration avec Python 3 mais seulement pour permettre l'intégration avec Blender.

Finalement, il y a POV-Ray, le vieux raytracer qui continu de faire son petit bonhomme de chemin. Ce n'est pas un système moderne mais avec vapory, une mini librairie permettant de créer des fichier de scènes et d'appeler POV-Ray afin de générer l'image, c'est finalement juste assez performant et simpliste pour que je fasse le saut au 3D tout de suite. J'ai de toute manière une abstraction qui me permettra d'intégrer un renderer plus moderne le temps venu sans trop d'efforts.

dimanche 28 janvier 2018

Config et disparission des RSS

Afin d'extraire des nouvelles et autres informations a ajouter à un vidéo, différents générateur d'évènement vont extraire selon différents protocoles réseau. Le premier qui à été développé, c'est un analyseur de flux RSS. La plupart des sites officiels de nouvelle ont un ou même plusieurs flux RSS selon certaines catégories. Non seulement différentes librairies sont disponibles pour analyser les flux, mais le contenu est encodé de manière standard et facile a décortiquer.

Cependant, je ne pensais pas qu'en dehors des sites de nouvelles, le support pour les RSS est maintenant pratiquement nul. Étrangement, ils sont encore annoncés sur les sites Web mais ils ne contiennent plus aucun contenu. J'imagine que Facebook et Twitter on remplacés le RSS. Dommage car pour la plupart des CMS, c'est extrêmement simple d'en générer.

Bien que twitter et Facebook permettent d'encapsuler des média ( images, vidéo, etc. ), le tout est enrobé dans des API dont le nombre d'appel est limité alors que les RSS, c'était tout simplement un GET HTTP.

lundi 22 janvier 2018

FFMPEG est mon ami!

Oui, FFMPEG est vraiment le couteau Suisse des outils d'encodage vidéo. Bien que la génération d'image n'est qu'a son début, déjà l'encodage en h265 ou h264, le mix avec la track audio, l'optimisation pour l'upload youtube et le scaling afin d'être facilement lu par mon ordinateur portable de près de 10 ans, et c'était loin d'être une bombe même l'époque, fonctionne a merveille.Une classe hyper simple permet de générer la commande qui devra être envoyée à FFMPEG suivi d'un appel à os.system. Ce n'est peut-être pas très élégant, mais c'est relativement efficace.

Ex: Appel ffmpeg avec de convertir le film généré en une résolution de 1280 x 720

    cmd = "c:/ffmpeg/bin/ffmpeg.exe -y -i " + resultpath + " -s 1280x720 -c:a copy " + resultpath + '.scale.mkv'
    os.system(cmd)

Je n'ai pas ajouté FFMPEG dans mes variables d'environnement mais le tout pourrait être passé en paramètre et non pas être hardcodé.

C'est pas encore jolie à regarder mais au moins le pipe de rendering est pas mal en place. Voici donc ou j'en suis rendu dans ma génération de bulletin de nouvelle.

vendredi 19 janvier 2018

Fake news! En fait, fake newscast

Puisque mon C++ à continué de prendre la poussière ( le C avec les arduino lui se porte bien ), j'ai décidé de faire un peu plus de Python. Surtout arrêter de prendre Python 2.7 et passer à Python 3.5+. Comme projet, générer des vidéos pouvant être ajoutés à youtube de manière quotidienne ou hebdomadaire.

Pour le moment, il ne s'agit de faire un mini framework permettant d'extraire l'information de différentes sources de données puis de les formatter selon un gabarit établi. Ce n'est que de générer les frames du vidéo pour ensuite encoder en x264 optimisé pour youtube.

Comme dépendances:
  • FFMPEG pour le transcodage
  • Balabolka ( ou balcon en ligne de commande ) pour la génération de la voix
  • Appleseed pour le rendu 3D
  • PIL ( Pillow ) pour la composition et les commandes graphiques
  • feedparser pour l'analyse de flux RSS
  • lxml pour la lecture de fichier RSS
Il y aura surement d'autre librairies bientôt mais il y a déjà pas mal de chose à faire avec ça! La résolution est de 3840 x 2160 ( ou UHD ) mais puisque PIL ne support que 8bit par channel, ce n'est pas HDR. Le tout est générer à 30 images/seconde mais comme c'est un paramètre, tout comme la résolution, c'est plus le temps de génération qui va décider.