Bloc analyseur de flux MPEG-TS¶
Vue d'ensemble¶
Le TSAnalyzerBlock transforme le Media Blocks SDK .NET en un moniteur MPEG-TS de qualité broadcast qui s'exécute au sein de votre propre application .NET — sans outils externes, sans lancement d'un CLI, sans analyse de sortie texte. Pointez-le vers un fichier, un flux UDP multicast en direct ou un flux SRT, et il rapporte en continu la grille des programmes, le débit par PID, la synchro PCR, l'embrouillage, les informations de service et la conformité ETSI TR 101 290 complète Priorité 1/2/3 — sous forme d'objets fortement typés que vous pouvez lier à un tableau de bord, journaliser ou utiliser pour déclencher des alertes.
Il analyse le flux de transport brut paquet par paquet (analyse PAT/PMT/PSI, compteurs de continuité, récupération d'horloge PCR, synchro PES, en-têtes de codec) et expose le tout à travers un unique TSAnalyzerReport. Le bloc s'exécute soit comme puits terminal (mode Input), soit comme passthrough en ligne (mode InputOutput), afin que vous puissiez analyser un flux pendant que vous l'enregistrez ou le relayez encore.
En bref, le bloc mesure :
- Structure — PAT/PMT/PSI, programmes/services, PID PMT/PCR, types de flux et codecs.
- Débit — débit par PID et total (moyenne glissante, instantané et crête), plus le bourrage par paquets nuls et le débit utile effectif.
- Synchro — intervalle PCR min/moy/max, discontinuités, gigue, erreurs de répétition ; présence des PTS/DTS PES et décalage de synchro audio/vidéo.
- Intégrité — erreurs de compteur de continuité, indicateur d'erreur de transport, CRC-32 des tables PSI et la liste complète des contrôles TR 101 290 P1/P2/P3.
- Informations de service — nom/fournisseur/type de service SDT, nom de réseau NIT, heure UTC du flux TDT/TOT, langue audio ISO 639, état d'embrouillage et (optionnellement) événements EIT/EPG.
- Détails de codec — résolution, profil, niveau, format de chrominance et rapport d'aspect pour la vidéo H.264, HEVC et MPEG-2.
Fonctionnement¶
En mode Input, le bloc est le terminal du pipeline — il consomme le flux de transport et produit le rapport :
graph LR;
Source["Source (fichier / UDP / SRT)"]-->TSAnalyzerBlock; En mode InputOutput, le flux intact est transféré vers le pad de sortie, ce qui vous permet d'analyser et d'enregistrer/relayer en même temps :
graph LR;
Source["Source (fichier / UDP / SRT)"]-->TSAnalyzerBlock;
TSAnalyzerBlock-->MPEGTSSinkBlock; Informations sur le bloc¶
Nom : TSAnalyzerBlock.
| Direction du pad | Type de média | Nombre de pads |
|---|---|---|
| Entrée | Flux d'octets MPEG-TS | 1 |
| Sortie | Flux d'octets MPEG-TS (passthrough) | 1 en mode InputOutput, 0 en mode Input |
Modes¶
Le constructeur prend un TSAnalyzerMode :
| Mode | Description |
|---|---|
TSAnalyzerMode.Input | Analyseur terminal. Le bloc accepte le flux et n'expose aucun pad de sortie — utilisez-le lorsque vous n'avez besoin que du rapport. |
TSAnalyzerMode.InputOutput | Analyseur passthrough. Le flux est transféré inchangé vers le pad de sortie pendant qu'il est analysé, ce qui vous permet de l'enregistrer ou de le relayer dans le même pipeline. |
TSAnalyzerBlock(TSAnalyzerMode mode = TSAnalyzerMode.Input, TSAnalyzerSettings settings = null)
Démarrage rapide¶
using System;
using System.Linq;
using VisioForge.Core;
using VisioForge.Core.MediaBlocks;
using VisioForge.Core.MediaBlocks.Sources;
using VisioForge.Core.MediaBlocks.Special;
using VisioForge.Core.Types.X;
using VisioForge.Core.Types.X.Sources;
using VisioForge.Core.Types.X.Special;
await VisioForgeX.InitSDKAsync();
var pipeline = new MediaBlocksPipeline();
// Flux MPEG-TS UDP multicast en direct (octets bruts, sans démux)
var source = new UDPRAWMPEGTSSourceBlock(new UDPRAWMPEGTSSourceSettings("udp://239.0.0.1:1234"));
// Analyseur terminal avec une cadence de capture d'une seconde
var analyzer = new TSAnalyzerBlock(
TSAnalyzerMode.Input,
new TSAnalyzerSettings { StatisticsInterval = TimeSpan.FromSeconds(1) });
analyzer.OnAnalysisUpdated += (sender, e) =>
{
TSAnalyzerReport report = e.Report; // e.IsFinal == true en fin de flux
Console.WriteLine($"{report.TotalBitrateKbps:F0} kbps, programmes : {report.Programs.Count}");
if (report.Tr101290 != null && report.Tr101290.P1Count > 0)
{
Console.WriteLine($"Erreurs TR 101 290 Priorité 1 : {report.Tr101290.P1Count}");
}
};
pipeline.Connect(source.Output, analyzer.Input);
await pipeline.StartAsync();
// ... exécuter jusqu'à la fin du flux ou un arrêt utilisateur ...
await pipeline.StopAsync();
// Vous pouvez aussi récupérer une capture à la demande à tout moment :
TSAnalyzerReport final = analyzer.GetReport();
Alimenter l'analyseur (fichier / UDP / SRT)¶
L'analyseur accepte un flux d'octets MPEG-TS brut depuis tout bloc source qui en produit un. Les trois alimentations courantes :
// 1. Fichier local (.ts / .m2ts)
var fileSource = new BasicFileSourceBlock("stream.ts");
pipeline.Connect(fileSource.Output, analyzer.Input);
// 2. UDP en direct (unicast ou multicast) — MPEG-TS brut, sans démux
var udpSource = new UDPRAWMPEGTSSourceBlock(new UDPRAWMPEGTSSourceSettings("udp://239.0.0.1:1234"));
pipeline.Connect(udpSource.Output, analyzer.Input);
// 3. SRT en direct
var srtSettings = await SRTSourceSettings.CreateAsync(new Uri("srt://server:9000"), ignoreMediaInfoReader: true);
var srtSource = new SRTRAWSourceBlock(srtSettings);
pipeline.Connect(srtSource.Output, analyzer.Input);
UDPRAWMPEGTSSourceBlock¶
UDPRAWMPEGTSSourceBlock reçoit un flux de transport UDP unicast ou multicast en direct et expose le flux d'octets MPEG-TS intact sur son pad Output — sans démultiplexage — ce qui est exactement ce dont l'analyseur a besoin. Il se configure via UDPRAWMPEGTSSourceSettings :
| Propriété | Type | Par défaut | Description |
|---|---|---|---|
Uri | Uri | — | URI source, p. ex. udp://239.0.0.1:1234 (multicast) ou udp://0.0.0.0:1234 (toutes les interfaces). |
AutoJoinMulticast | bool | true | Rejoindre/quitter automatiquement le groupe multicast pour les adresses multicast. |
MulticastInterface | string | null | Interface(s) réseau sur laquelle/lesquelles rejoindre le groupe multicast (p. ex. "eth0" ou "eth0,eth1"). |
BufferSize | int | 524288 | Taille du tampon de réception du noyau en octets ; 0 utilise la valeur par défaut de l'OS. |
PacketSize | int | 188 | Taille annoncée des paquets TS : 188 (standard) ou 192 (style M2TS avec un préfixe timecode de 4 octets). |
var settings = new UDPRAWMPEGTSSourceSettings("udp://239.0.0.1:1234")
{
AutoJoinMulticast = true,
PacketSize = 188
};
var source = new UDPRAWMPEGTSSourceBlock(settings);
Bloc associé. Si vous souhaitez que le flux soit démultiplexé en pads vidéo/audio encodés séparés (pour un enregistrement ou un remultiplexage sans réencodage) plutôt que le flux d'octets brut, utilisez plutôt
UDPRAWSourceBlock. Consultez le guide d'enregistrement UDP MPEG-TS.
Paramètres¶
TSAnalyzerSettings contrôle la cadence de capture et les étapes d'analyse activées. Les étapes les plus lourdes peuvent être désactivées lorsque vous n'en avez pas besoin.
| Propriété | Type | Par défaut | Description |
|---|---|---|---|
StatisticsInterval | TimeSpan | 1 seconde | Fréquence à laquelle une capture est produite et OnAnalysisUpdated est déclenché. |
TrackPCR | bool | true | Suivre la synchro PCR (statistiques d'intervalle et discontinuités). |
ValidateContinuity | bool | true | Valider les erreurs de compteur de continuité par PID. |
CalculateBitrate | bool | true | Calculer le débit par PID et total. |
PacketSize | TSPacketSizeMode | Auto | Gestion de la taille des paquets TS — Auto, Size188 ou Size192. |
ParseServiceInfo | bool | true | Analyser les informations de service DVB (SDT, NIT, TDT/TOT) pour les noms de service et de réseau. |
ParseEPG | bool | false | Analyser l'EIT pour les événements EPG. À activer explicitement — c'est l'étape la plus lourde. |
TrackScrambling | bool | true | Suivre l'embrouillage via les bits transport_scrambling_control. |
ValidateTR101290 | bool | true | Évaluer les contrôles ETSI TR 101 290 Priorité 1/2/3. |
TrackPtsDts | bool | true | Suivre la présence des PTS/DTS PES et la synchro audio/vidéo. |
ParseCodecDetails | bool | true | Analyser les détails de codec (résolution/profil/niveau) depuis les en-têtes SPS/séquence. |
Valeurs de TSPacketSizeMode : Auto (détecter 188 ou 192 d'après l'espacement des octets de synchronisation), Size188 (MPEG-TS standard), Size192 (M2TS / Blu-ray avec un préfixe d'horodatage de 4 octets).
Le modèle de rapport¶
Chaque capture est un TSAnalyzerReport. Les champs de premier niveau résument l'ensemble du flux ; les collections imbriquées décrivent les programmes, les PID et la synchro.
| Propriété | Type | Description |
|---|---|---|
PacketSize | int | Taille de paquet TS détectée (188 ou 192). |
TotalBitrateKbps | double | Débit total du flux (moyenne glissante depuis le début de l'analyse). |
TotalPackets | long | Total de paquets TS analysés. |
HasPAT | bool | Indique si une PAT (PID 0) a été vue. |
TransportErrors | long | Paquets dont l'indicateur d'erreur de transport est positionné. |
Programs | List<TSProgramInfo> | Programmes/services découverts depuis PAT + PMT. |
Pids | List<TSPidInfo> | Statistiques par PID. |
Pcr | List<TSPcrStats> | Statistiques de synchro PCR (une entrée par PID PCR). |
NullPacketCount | long | Nombre de paquets de bourrage nul (PID 0x1FFF). |
NullBitrateKbps | double | Débit consommé par le bourrage nul. |
EffectiveBitrateKbps | double | Débit utile effectif (total moins le bourrage nul). |
SyncByteErrors | long | Erreurs d'octet de synchronisation (0x47 absent à la position attendue). |
SyncLossEvents | long | Événements de perte de synchronisation (resynchronisations de l'analyseur). |
NetworkName | string | Nom de réseau issu du descripteur de réseau NIT, ou null. |
StreamTimeUtc | DateTime? | Heure UTC du flux issue de TDT/TOT, ou null. |
AvSyncMs | double? | Décalage de synchro audio/vidéo en ms (PTS vidéo moins PTS audio), ou null. |
Tr101290 | TSTR101290Report | Le rapport de mesure TR 101 290, ou null si la validation est désactivée. |
Events | List<TSEpgEvent> | Événements EPG issus de l'EIT (lorsque ParseEPG est activé). |
Programmes et flux élémentaires¶
TSProgramInfo (par programme/service) :
| Propriété | Type | Description |
|---|---|---|
ProgramNumber | int | Numéro de programme (ID de service). |
PmtPid | int | PID de la PMT pour ce programme. |
PcrPid | int | PID transportant le PCR pour ce programme. |
Streams | List<TSElementaryStreamInfo> | Flux élémentaires de ce programme. |
ServiceName | string | Nom de service issu de la SDT, ou null. |
ServiceProvider | string | Fournisseur de service issu de la SDT, ou null. |
ServiceType | int | Octet service_type DVB (p. ex. 0x01 = télévision numérique). |
IsScrambled | bool | Indique si le service est embrouillé (free_CA_mode de la SDT). |
TSElementaryStreamInfo (par flux élémentaire) :
| Propriété | Type | Description |
|---|---|---|
Pid | int | PID du flux élémentaire. |
StreamType | byte | Octet stream_type MPEG-TS. |
Codec | string | Nom de codec/contenu lisible. |
Kind | TSPidKind | Type de média classifié (Video, Audio, Private, …). |
Language | string | Code de langue ISO 639 issu du descripteur PMT, ou null. |
CodecDetails | TSCodecDetails | Détails de codec analysés, ou null. |
TSCodecDetails : Width, Height, FrameRateNum/FrameRateDen, Profile, Level, ChromaFormat, AspectRatio. La résolution est analysée pour H.264, HEVC et MPEG-2. Le profil, le niveau et le format de chrominance sont analysés pour H.264 et HEVC uniquement. La fréquence d'images et le rapport d'aspect sont lus dans l'en-tête de séquence MPEG-1/2 (pas encore depuis la VUI H.264/HEVC).
Statistiques par PID¶
TSPidInfo :
| Propriété | Type | Description |
|---|---|---|
Pid | int | Identifiant de paquet. |
Kind | TSPidKind | Rôle classifié du PID. |
StreamType | byte | Octet stream_type (pour les flux élémentaires). |
Codec | string | Nom de codec/contenu lisible. |
BitrateKbps | double | Débit moyen (moyenne glissante). |
InstantBitrateKbps | double | Débit le plus récent par intervalle. |
PeakBitrateKbps | double | Débit de crête par intervalle observé. |
PacketCount | long | Total de paquets sur ce PID. |
ContinuityErrors | long | Erreurs de compteur de continuité détectées. |
IsPcrPid | bool | Indique si ce PID transporte le PCR. |
IsScrambled | bool | Indique si des paquets embrouillés ont été observés. |
ScrambledPacketCount | long | Paquets avec transport_scrambling_control non nul. |
IsUnreferenced | bool | PID non référencé par PAT/PMT/PSI et non bourrage nul. |
HasPts / HasDts | bool | Indique si un PTS / DTS a été vu dans la charge utile PES. |
Synchro PCR¶
TSPcrStats : Pid, SampleCount, MinIntervalMs, AvgIntervalMs, MaxIntervalMs, Discontinuities, MaxJitterMs (plus grand écart par rapport à l'intervalle moyen glissant) et RepetitionErrors (intervalles dépassant 40 ms selon TR 101 290).
ETSI TR 101 290¶
TR 101 290 est la norme de mesure DVB pour la surveillance des flux de transport. Elle regroupe les erreurs en trois priorités — P1 (doivent être présentes pour décoder), P2 (recommandées pour une surveillance continue) et P3 (informations de service/SI optionnelles). Lorsque ValidateTR101290 est activé, l'analyseur remplit report.Tr101290 :
| Propriété | Type | Description |
|---|---|---|
Checks | List<TSTR101290Check> | Contrôles individuels sur tous les groupes de priorité. |
P1Count / P2Count / P3Count | long | Nombre total d'erreurs par groupe de priorité. |
TotalCount | long | Somme sur tous les groupes. |
AllOk | bool | true lorsque chaque contrôle a réussi (TotalCount == 0). |
Chaque TSTR101290Check possède un Name (p. ex. PAT_error, CRC_error), une Priority (1/2/3), un Count et un Ok. Les contrôles évalués comprennent :
- Priorité 1 : TS_sync_loss, Sync_byte_error, PAT_error, Continuity_count_error, PMT_error, PID_error.
- Priorité 2 : Transport_error, CRC_error, PCR_error, PCR_repetition_error (>40 ms), PCR_discontinuity_indicator_error, PCR_accuracy_error, PTS_error (>700 ms), CAT_error.
- Priorité 3 : NIT_error, SI_repetition_error, Unreferenced_PID, SDT_error, EIT_error, TDT_error.
var tr = report.Tr101290;
if (tr != null && !tr.AllOk)
{
foreach (var check in tr.Checks.Where(c => c.Count > 0))
{
Console.WriteLine($"P{check.Priority} {check.Name}: {check.Count}");
}
}
Pourquoi c'est important. Un flux peut se lire dans un lecteur multimédia tout en restant non conforme — un PCR qui se répète plus lentement que 40 ms, un saut de CC, une PMT manquante. TR 101 290 est la manière dont les opérateurs broadcast quantifient cela. Le
TSAnalyzerBlockvous donne les mêmes verdicts structurés P1/P2/P3 qu'un analyseur matériel dédié, directement en code managé.
Mises à jour en direct vs captures à la demande¶
Il y a deux façons de lire le rapport :
OnAnalysisUpdated— déclenché à chaqueStatisticsIntervalavec une capture fraîche, et une fois de plus en fin de flux avecIsFinal == true. Les mises à jour périodiques s'exécutent sur un thread de minuteur en arrière-plan ; le rapport final s'exécute sur le thread GStreamer. Marshalez vers le thread d'interface utilisateur avant de toucher aux éléments d'interface.GetReport()— retourne la capture courante à la demande (ounullsi le bloc n'a pas été construit). Elle ne perturbe pas la comptabilité périodique du débit instantané/de crête.
analyzer.OnAnalysisUpdated += (sender, e) =>
{
// e.IsFinal distingue les mises à jour périodiques du rapport de fin de flux.
Dispatcher.BeginInvoke(() => UpdateUI(e.Report)); // WPF : marshaler vers le thread d'interface
};
Exemples d'applications¶
- WPF — TS Analyzer Demo : une interface complète avec une grille par PID, un panneau TR 101 290 et une ligne de synthèse (nom de service, débit nul/effectif, nom de réseau, UTC du flux, synchro A/V). Parcourir le code source.
- Console — TS Analyzer CLI : analyse un fichier ou un flux
udp:///srt://en direct et affiche le rapport complet. Parcourir le code source.
Disponibilité¶
Appelez TSAnalyzerBlock.IsAvailable() pour vérifier que l'analyseur est disponible dans l'environnement courant avant de créer une instance.
Plateformes¶
Windows, macOS, Linux, iOS, Android.
Voir aussi¶
- Analyse MPEG-TS en C# : VisioForge vs ffprobe — comment le bloc se compare à ffprobe et aux analyseurs broadcast professionnels.
- Analyser et valider un flux MPEG-TS en C# — un guide de tâche pas à pas.
- Enregistrement UDP MPEG-TS sans réencodage.