Vous connaissez le 1Seg ? Probablement pas. Cette norme de télévision japonaise (utilisée aussi en Amérique du Sud) permet de diffuser de la télévision pour les appareils mobiles, et j’ai un jour décidé d’essayer de diffuser (et capter) cette norme. Avec plus ou moins de succès.
Le développement de ce sujet est assez long, parce que j’ai eu cette idée il y a très longtemps en regardant ce que EyeTV (un programme pour Mac que j’aime bien) supportait. Au fil du temps, j’ai testé pas mal de choses (on va en parler) et je suis arrivé à un résultat montrable. Mais pas exactement ce que je voulais. Durant l’année, j’ai essayé de faire fonctionner un point précis sans réussir, j’ai un peu abandonné, laissé le tout sur le côté. Puis comme je trie mes brouillons et que je ne trouve pas de solution, j’ai décidé de le publier en l’état. Il va manquer certains points, pour une raison idiote : j’ai généré certains trucs il y a plusieurs mois sans réellement noter tout ce que je faisais…
1Seg, c’est quoi ?
Pour expliquer le 1Seg, il faut d’abord comprendre comment marche la télévision. Au 20e siècle, la diffusion passait par des normes analogiques, qui différaient selon les territoires, avec essentiellement trois choix (qui pouvaient varier de façon mineure). Le PAL en Europe (sauf la France), le SECAM en France et dans quelques pays de l’Est, le NTSC aux Etats-Unis et au Japon (notamment). Au 21e siècle, on est passé en numérique, avec un petit changement : d’un côté un standard pour la diffusion elle-même, de l’autres les données qui passent dedans. Pour les données, le fonctionnement est à peu près le même partout : on a commencé par de la SD en MPEG2 (comme les DVD) avant de passer sur de la HD en H.264. Il y a quelques exceptions (certains pays utilisent le H.265 pour la HD, d’autres le H.264 en SD, etc.) et les choix pour l’audio peuvent varier, mais dans l’ensemble on part sur les mêmes technologies. Mais pour la diffusion, c’est différent.
Premièrement, il existe plusieurs normes, en fonction des territoires. Les pays européens utilisent essentiellement les normes DVB, les Etats-Unis l’ATSC et le Japon, ainsi que les pays sud-américains, l’ISDB. L’idée dans tous les cas reste la même : diffuser un flux numérique avec un débit de plusieurs mégabits/s pour mettre de la vidéo en MPEG (au sens large) dedans. Il y a ensuite des variations en fonction du type de diffusion. En Europe, on trouve les DVB-T pour le terrestre (hertzien), très populaire en France, le DVB-C pour le câble (en Belgique, par exemple), le DVB-S pour le satellite, etc.
On en arrive au 1Seg, qui est une variante de l’ISDB-T (la version hertzienne, donc). D’un point de vue pratique, en ISDB-T, un canal est divisé en 13 segments et la vidéo (SD ou HD) en prend 12. Et le treizième ? C’est le fameux 1Seg (1 segment). Et ce segment contient de la vidéo, tout comme les autres, mais avec une qualité évidemment bien plus faible. Du coup, on a décidé de l’utiliser pour la TV mobile. Le flux offre à peu près 400 kb/s, ce qui ne permet pas de miracles. Au Japon, la vidéo est en MPEG2 en 320 x 240 à 15 fps, et l’audio en HE-AAC. Dans les pays d’Amérique du Sud, la diffusion reste en 320 x 240, mais en H.264 à 30 fps (le codec est un peu plus efficace). Le résultat n’est pas fou, mais la norme est prévue pour une bonne réception en mobilité. Et il existe des périphériques dédiés : voitures, téléphones et consoles (je vais y revenir). De ce que j’ai compris, le Japon a diffusé pendant un temps exactement la même chose que le canal principal (Full Seg) mais ce n’est plus obligatoire depuis un moment.
Recevoir un flux 1Seg
Le choix de base, c’est un téléphone ou un récepteur dédié, mais c’est assez rare au Japon, et les vieux téléphones sont parfois compliqués à faire fonctionner. Mais il existe d’autres solution, et pour commencer je suis parti sur des accessoires de console. Le premier est un tuner 1Seg pour la PSP de Sony (PSP-S310). C’est un accessoire officiel qui se branche sur le port USB de la console (comme la caméra) et permet de recevoir la TV mobile. Il nécessite une console de la seconde génération (PSP 2000, parfois nommée Slim) et – surtout – une console japonaise.
Pour être clair, j’ai l’accessoire en question, mais je n’ai pas réussi à capter de la vidéo, j’expliquerais pourquoi dans la suite. Je ne vais pas détailler la méthode mais si vous avez – comme moi – une PSP européenne, il faut la hacker. De cette façon, il sera possible de changer le pays de la console pour faire reconnaître le tuner TV. Rien de bien compliqué, il suffit de suivre les tutos qui se trouvent sur le Net.
Nintendo a proposé la même chose pour les Nintendo DS, avec un tuner qui se branche directement dans le port cartouche. Comme pour la PSP, je n’ai pas réussi à capter la vidéo, mais il fonctionner directement sur une console européenne, même si l’interface reste en japonais. Rien de spécial à dire dessus, c’est assez gros avec deux antennes mais l’interface est efficace grâce aux deux écrans.
Ma troisième solution, c’est EyeTV. Le logiciel d’Elgato supporte en effet pas mal de tuners différents et quelques modèles prennent en charge le 1Seg. Les versions mobiles, notamment, supportent la norme. Et la variante Android (en Micro USB) est compatible avec les Mac avec un simple câble Micro USB femelle vers USB-A (mâle). Mais même chose, après quelques essais : impossible d’obtenir une image, même si le tuner est bien vu comme un modèle 1Seg. Je me suis donc tourné vers un autre tuner, le Logitec (sans le h
) LDT-1S302U. Ce modèle japonais fonctionne bien au Brésil, et aussi chez moi, et a surtout l’avantage d’être directement compatible avec EyeTV.
Emettre en 1Seg
On en arrive à la partie compliquée, l’émission. La partie software, d’abord. J’ai utilisé gr-isdbt, un logiciel développé par des gens très sympas (j’ai pu discuter un peu avec eux par mail, et ils sont sur Twitter). C’est open source, bien documenté, et ça permet d’émettre un flux ISDB-T (et dans mon cas, plus précisément 1Seg) en utilisant GNU Radio, sous Linux. J’ai eu un peu de mal à l’installer – il faut notamment une ancienne version d’Ubuntu, ça ne fonctionnait pas sur une version 20/21, j’ai une 18.04 en machine virtuelle – et je ne suis pas du tout familier avec ce genre d’outils.
Comme expliqué plus haut, j’ai travaillé par itération, en testant des trucs, et je n’ai pas gardé toutes les étapes et lignes de commandes tapées. Après, GNU Radio fonctionne par blocs, et je pense qu’une personne motivée peut comprendre comment ça fonctionne à peu près (je l’ai fait).
Si le sujet vous intéresse, le projet a un site, qui propose quelques fichiers et explications. Il est par exemple possible de transmettre par webcam, vers un téléviseur compatible, avec un émetteur hacké depuis un adaptateur USB 3.0 vers VGA, de recevoir en RTL-SDR, etc. Il y a même une vidéo qui présente le projet.
La seconde partie logicelle, qui m’a un peu bloqué, c’est la vidéo. Pour émettre, il faut un fichier TS
qui contient la vidéo, l’audio et des données multiplexées. Ces dernières contiennent les paramètres, notamment utilisés par les tuners. Pour la vidéo, je suis parti de Big Buck Bunny, en limitant le débit manuellement et en mettant les bons paramètres. En pratique, avec EyeTV au moins, ce n’est pas trop strict. Du MPEG2 ou du H.264 à bas débit et avec une fréquence d’image standard va passer. Le problème principal est de bien limiter le débit maximal : dans un fichier classique, on peut travailler avec un bitrate variable, mais pour de la diffusion c’est évidemment impossible. Il faut donc bien limiter le débit maximal. Pour l’audio, passer par un Mac a un avantage : l’encodeur HE-AAC d’Apple fonctionne bien, alors que celui de FFMPEG est buggé. Je vais vous mettre un fichier pour vous donner une idée, mais forcément du MPEG2 à bas débit et avec une définition plutôt basse ne donne pas des résultats impressionnants.
Maintenant, pourquoi est-ce que ça bloque ? Techniquement, le tuner ISDB attend visiblement une table qui contient les données présentes dans le flux vidéo, et notamment tout ce qui est lié au 1Seg. Et je n’ai pas réussi à générer une table totalement valide. Et malheureusement, le seul fichier TS
issu d’une varie diffusion que j’ai trouvé n’est pas totalement valide non plus. Le fichier en question semble indiquer qu’il n’y a pas de vidéo (alors que le flux vidéo est bien présent), ce qui pose des soucis. Les deux consoles détectent bien un canal quand j’utilise le fichier TS
en question mais n’affichent rien, et quand j’utilise un fichier TS
que j’ai fait moi-même… le canal n’est pas détecté. Le problème est malheureusement largement au-delà de mes compétences, et je n’ai pas réussi à faire un fichier hybride contenant les bonnes données.
Vous vous demandez peut-être pourquoi ça fonctionne avec EyeTV alors, et bien… je n’en sais rien. Je suppose, sans convictions, que EyeTV (ou le tuner lui-même) est plus souple et moins stricte. Dans la pratique, ce que j’envoie fonctionne parfaitement avec EyeTV et le tuner Logitec (mais pas l’Elgato, d’ailleurs) mais pas avec la PSP ou avec la Nintendo DS.
Enfin, la partie matérielle. Pour émettre, il n’y a pas des milliers de solutions. Les auteurs du logiciel utilisent un appareil assez cher (hors de portée de ce blog, en tout cas pour un article comme ça) et au départ, je voulais utiliser un adaptateur USB vers VGA bidouillé, mais ma commande eBay n’est jamais arrivée. Finalement, j’ai craqué pour un HackRF chinois, moins onéreux que le vrai modèle (trouvé en promotion pour ~70 $ sur Aliexpress). C’est un petit appareil qui peut émettre dans une large gamme de fréquences et qui fonctionne assez bien dans mon cas, même si j’ai dû acheter une de leurs antennes pour un résultat optimal. Pour mon usage, la version chinoise suffit amplement, même si je sais parfaitement que le modèle d’origine est probablement (un peu) plus efficace et mieux fini.
Le résultat
Franchement, le post est beaucoup trop long, donc j’ai fait une petite vidéo pour montrer ce que ça donne. L’émetteur est une machine virtuelle Ubuntu sur un MacBook Pro 2017, le récepteur un MacBook Air sous Mojave (pour lancer EyeTV en version 3). On voit bien que la vidéo de Big Buck Bunny fonctionne bien, même si la qualité de l’image est évidemment assez faible. Il faut bien comprendre que l’ensemble est plutôt prévu pour être reçu sur des appareils avec un petit écran (3 ou 4 pouces) du milieu des années 2000 : les attentes ne sont pas les mêmes qu’en 2021 ou le moindre smartphone a un écran de 6 pouces qui affiche du 1080p.