Blocs de pont¶
Les ponts permettent de relier deux pipelines et de basculer dynamiquement entre eux. Par exemple, vous pouvez basculer entre différents fichiers ou caméras dans le premier Pipeline sans interrompre la diffusion dans le second Pipeline.
Pour relier une source et un puits, attribuez-leur le même nom. Chaque paire de pont possède un nom de canal unique.
Puits et source audio Bridge¶
Les ponts permettent de connecter différents pipelines multimédias et de les utiliser indépendamment. BridgeAudioSourceBlock est utilisé pour se connecter à BridgeAudioSinkBlock et prend en charge l'audio non compressé.
Informations sur le bloc¶
Informations BridgeAudioSourceBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Sortie audio | audio non compressé | 1 |
Informations BridgeAudioSinkBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée audio | audio non compressé | 1 |
Pipelines d'exemple¶
Premier pipeline avec une source audio et un puits audio de pont¶
graph LR;
VirtualAudioSourceBlock-->BridgeAudioSinkBlock; Second pipeline avec une source audio de pont et un moteur de rendu audio¶
graph LR;
BridgeAudioSourceBlock-->AudioRendererBlock; Exemple de code¶
Le pipeline source avec une source audio virtuelle et un puits audio de pont.
// créer le pipeline source
var sourcePipeline = new MediaBlocksPipeline();
// créer la source audio virtuelle et le puits audio de pont
// BridgeAudioSinkSettings requiert (string channel, AudioInfoX audioInfo) — pas de ctor sans paramètres
var audioInfo = new AudioInfoX(AudioFormatX.S16LE, 48000, 2);
var audioSourceBlock = new VirtualAudioSourceBlock(new VirtualAudioSourceSettings());
var bridgeAudioSink = new BridgeAudioSinkBlock(new BridgeAudioSinkSettings("audio-bridge", audioInfo));
// connecter la source et le puits
sourcePipeline.Connect(audioSourceBlock.Output, bridgeAudioSink.Input);
// démarrer le pipeline
await sourcePipeline.StartAsync();
Le pipeline puits avec la source audio de pont et le moteur de rendu audio.
// créer le pipeline puits
var sinkPipeline = new MediaBlocksPipeline();
// créer la source audio de pont et le moteur de rendu audio
// BridgeAudioSourceSettings requiert (string channel, AudioInfoX audioInfo) — doit correspondre au puits ci-dessus
var audioInfo = new AudioInfoX(AudioFormatX.S16LE, 48000, 2);
var bridgeAudioSource = new BridgeAudioSourceBlock(new BridgeAudioSourceSettings("audio-bridge", audioInfo));
var audioRenderer = new AudioRendererBlock();
// connecter la source et le puits
sinkPipeline.Connect(bridgeAudioSource.Output, audioRenderer.Input);
// démarrer le pipeline
await sinkPipeline.StartAsync();
Puits et source vidéo Bridge¶
Les ponts permettent de connecter différents pipelines multimédias et de les utiliser indépendamment. BridgeVideoSinkBlock sert à se connecter à BridgeVideoSourceBlock et prend en charge la vidéo non compressée.
Informations sur les blocs¶
Informations BridgeVideoSinkBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée vidéo | vidéo non compressée | 1 |
Informations BridgeVideoSourceBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Sortie vidéo | vidéo non compressée | 1 |
Pipelines d'exemple¶
Premier pipeline avec une source vidéo et un puits vidéo de pont¶
graph LR;
VirtualVideoSourceBlock-->BridgeVideoSinkBlock; Second pipeline avec une source vidéo de pont et un moteur de rendu vidéo¶
graph LR;
BridgeVideoSourceBlock-->VideoRendererBlock; Exemple de code¶
Pipeline source avec une source vidéo virtuelle et un puits vidéo de pont.
// créer le pipeline source
var sourcePipeline = new MediaBlocksPipeline();
// créer la source vidéo virtuelle et le puits vidéo de pont
var videoSourceBlock = new VirtualVideoSourceBlock(new VirtualVideoSourceSettings());
var bridgeVideoSink = new BridgeVideoSinkBlock(new BridgeVideoSinkSettings());
// connecter la source et le puits
sourcePipeline.Connect(videoSourceBlock.Output, bridgeVideoSink.Input);
// démarrer le pipeline
await sourcePipeline.StartAsync();
Pipeline puits avec une source vidéo de pont et un moteur de rendu vidéo.
// créer le pipeline puits
var sinkPipeline = new MediaBlocksPipeline();
// créer la source vidéo de pont et le moteur de rendu vidéo
var bridgeVideoSource = new BridgeVideoSourceBlock(new BridgeVideoSourceSettings());
var videoRenderer = new VideoRendererBlock(sinkPipeline, VideoView1);
// connecter la source et le puits
sinkPipeline.Connect(bridgeVideoSource.Output, videoRenderer.Input);
// démarrer le pipeline
await sinkPipeline.StartAsync();
Puits et source de sous-titres Bridge¶
Les ponts permettent de connecter différents pipelines multimédias et de les utiliser indépendamment. BridgeSubtitleSourceBlock est utilisé pour se connecter à BridgeSubtitleSinkBlock et prend en charge le type de média texte.
Informations sur le bloc¶
Informations BridgeSubtitleSourceBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Sortie vidéo | texte | 1 |
Informations BridgeSubtitleSinkBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Sortie vidéo | texte | 1 |
Source proxy¶
La paire de blocs source proxy/puits proxy permet de connecter différents pipelines multimédias et de les utiliser indépendamment.
Informations sur le bloc¶
Nom : ProxySourceBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Sortie | Tout type non compressé | 1 |
Pipelines d'exemple¶
Premier pipeline avec une source vidéo et un puits vidéo proxy¶
graph LR;
VirtualVideoSourceBlock-->ProxySinkBlock; Second pipeline avec une source vidéo proxy et un moteur de rendu vidéo¶
graph LR;
ProxySourceBlock-->VideoRendererBlock; Exemple de code¶
// ProxySink et ProxySource sont appariés par la chaîne pairID — choisissez une valeur unique par paire.
const string pairID = "video-proxy-1";
// pipeline source avec source vidéo virtuelle et puits proxy
var sourcePipeline = new MediaBlocksPipeline();
var videoSourceBlock = new VirtualVideoSourceBlock(new VirtualVideoSourceSettings());
var proxyVideoSink = new ProxySinkBlock(pairID);
sourcePipeline.Connect(videoSourceBlock.Output, proxyVideoSink.Input);
// pipeline puits avec source vidéo proxy et moteur de rendu vidéo — un pairID correspondant les relie
var sinkPipeline = new MediaBlocksPipeline();
var proxyVideoSource = new ProxySourceBlock(pairID);
var videoRenderer = new VideoRendererBlock(sinkPipeline, VideoView1);
sinkPipeline.Connect(proxyVideoSource.Output, videoRenderer.Input);
// démarrer les pipelines
await sourcePipeline.StartAsync();
await sinkPipeline.StartAsync();
Plateformes¶
Tous les blocs de pont sont pris en charge sous Windows, macOS, Linux, iOS et Android.
Puits et source BridgeBuffer¶
Les blocs BridgeBuffer fournissent une communication haute performance entre pipelines basée sur des tampons mémoire, idéale pour partager des images vidéo sans surcharge d'encodage.
Informations sur le bloc¶
Informations BridgeBufferSinkBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée vidéo | vidéo non compressée | 1 |
Informations BridgeBufferSourceBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Sortie | auto | 1 |
Exemple de code¶
// Premier pipeline avec source vidéo et puits bridge buffer
var sourcePipeline = new MediaBlocksPipeline();
var videoSource = new SystemVideoSourceBlock(videoSettings);
var videoInfo = new VideoFrameInfoX(1920, 1080, VideoFormatX.NV12, new VideoFrameRate(30));
var bufferSink = new BridgeBufferSinkBlock("buffer-channel", videoInfo);
sourcePipeline.Connect(videoSource.Output, bufferSink.Input);
// Second pipeline avec source bridge buffer et moteur de rendu
var sinkPipeline = new MediaBlocksPipeline();
var bufferSource = new BridgeBufferSourceBlock("buffer-channel");
var videoRenderer = new VideoRendererBlock(sinkPipeline, VideoView1);
sinkPipeline.Connect(bufferSource.Output, videoRenderer.Input);
await sourcePipeline.StartAsync();
await sinkPipeline.StartAsync();
Puits et source InterPipe¶
Les blocs InterPipe utilisent les éléments interpipesink/interpipesrc de GStreamer pour une communication inter-pipelines efficace, prenant en charge l'audio et la vidéo.
Informations sur le bloc¶
Informations InterPipeSinkBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée | audio ou vidéo | 1 |
Informations InterPipeSourceBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Sortie | audio ou vidéo | 1 |
Exemple de code¶
// Premier pipeline avec source vidéo et puits interpipe
var sourcePipeline = new MediaBlocksPipeline();
var videoSource = new SystemVideoSourceBlock(videoSettings);
var videoInfo = new VideoFrameInfoX(1920, 1080, VideoFormatX.NV12, new VideoFrameRate(30));
var interpipeSink = new InterPipeSinkBlock("interpipe-channel", videoInfo);
sourcePipeline.Connect(videoSource.Output, interpipeSink.Input);
// Second pipeline avec source interpipe et moteur de rendu
var sinkPipeline = new MediaBlocksPipeline();
var interpipeSource = new InterPipeSourceBlock("interpipe-channel", MediaBlockPadMediaType.Video);
var videoRenderer = new VideoRendererBlock(sinkPipeline, VideoView1);
sinkPipeline.Connect(interpipeSource.Output, videoRenderer.Input);
await sourcePipeline.StartAsync();
await sinkPipeline.StartAsync();
Puits et source RS Inter¶
Les blocs RSInter utilisent le plugin GStreamer rsinter basé sur Rust pour une communication inter-pipelines à hautes performances.
Informations sur le bloc¶
Informations RSInterSinkBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée | audio ou vidéo | 1 |
Informations RSInterSourceBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Sortie | audio ou vidéo | 1 |
Exemple de code¶
// Premier pipeline avec source vidéo et puits rsinter
var sourcePipeline = new MediaBlocksPipeline();
var videoSource = new SystemVideoSourceBlock(videoSettings);
var rsinterSink = new RSInterSinkBlock(MediaBlockPadMediaType.Video, "rsinter-channel");
sourcePipeline.Connect(videoSource.Output, rsinterSink.Input);
// Second pipeline avec source rsinter et moteur de rendu
var sinkPipeline = new MediaBlocksPipeline();
var rsinterSource = new RSInterSourceBlock(MediaBlockPadMediaType.Video, "rsinter-channel");
var videoRenderer = new VideoRendererBlock(sinkPipeline, VideoView1);
sinkPipeline.Connect(rsinterSource.Output, videoRenderer.Input);
await sourcePipeline.StartAsync();
await sinkPipeline.StartAsync();
AppBridge vidéo et audio¶
Les blocs AppBridge utilisent les éléments appsink et appsrc de GStreamer pour fournir un transfert direct de tampons entre pipelines avec horodatages préservés. Contrairement aux autres types de ponts qui peuvent régénérer les horodatages, AppBridge conserve les valeurs originales de PTS (Presentation Timestamp), DTS (Decode Timestamp) et de durée.
AppBridge est idéal pour :
- Sorties matérielles comme les cartes Decklink qui exigent une synchronisation temporelle précise
- Diffusion en direct où la précision des horodatages est essentielle
- Architectures multi-pipelines où la synchronisation d'horloge entre pipelines est importante
Fonctionnement¶
- Le bloc puits (
AppBridgeVideoSinkBlockouAppBridgeAudioSinkBlock) capture les tampons viaappsinkavecsync=falsepour éviter les délais basés sur l'horloge - Les tampons sont transmis directement à la source liée avec leurs horodatages d'origine préservés
- Le bloc source (
AppBridgeVideoSourceBlockouAppBridgeAudioSourceBlock) injecte les tampons viaappsrcavecis-live=trueetdo-timestamp=false - L'élément en aval (par ex. Decklink) reçoit des tampons correctement horodatés pour la synchronisation d'horloge matérielle
Informations sur le bloc¶
AppBridgeVideoSinkBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée | vidéo non compressée | 1 |
AppBridgeVideoSourceBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Sortie | vidéo non compressée | 1 |
AppBridgeAudioSinkBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée | audio non compressé | 1 |
AppBridgeAudioSourceBlock¶
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Sortie | audio non compressé | 1 |
Paramètres¶
AppBridgeVideoSinkSettings / AppBridgeAudioSinkSettings¶
| Propriété | Type | Par défaut | Description |
|---|---|---|---|
| Channel | string | requis | Nom de canal unique à apparier avec la source |
| Info | VideoFrameInfoX / AudioInfoX | requis | Spécification du format de média |
| MaxBuffers | int | 5 (vidéo) / 10 (audio) | Taille maximale de la file de tampons |
| Sync | bool | false | Synchronisation sur l'horloge du pipeline (false pour sources en direct) |
AppBridgeVideoSourceSettings / AppBridgeAudioSourceSettings¶
| Propriété | Type | Par défaut | Description |
|---|---|---|---|
| Channel | string | requis | Nom de canal correspondant au puits |
| Info | VideoFrameInfoX / AudioInfoX | requis | Spécification du format de média |
| IsLive | bool | true | Marque la source comme « live » pour un comportement de pipeline correct |
| DoTimestamp | bool | false | Définir à false pour préserver les horodatages d'origine |
Génération de noms de canaux sécurisés¶
Pour la sécurité, utilisez la méthode d'aide GenerateUniqueChannel() pour créer des noms de canaux basés sur des GUID :
var channel = AppBridgeVideoSinkSettings.GenerateUniqueChannel("decklink_video");
// Renvoie : "decklink_video_a1b2c3d4e5f6..."
Pipelines d'exemple¶
Pipeline principal avec tee vidéo/audio et puits AppBridge¶
graph LR;
VideoSource-->VideoTee;
VideoTee-->VideoRenderer;
VideoTee-->AppBridgeVideoSinkBlock;
AudioSource-->AudioTee;
AudioTee-->AudioRenderer;
AudioTee-->AppBridgeAudioSinkBlock; Pipeline de sortie avec sources AppBridge et sortie Decklink¶
graph LR;
AppBridgeVideoSourceBlock-->DecklinkVideoAudioSinkBlock;
AppBridgeAudioSourceBlock-->VolumeBlock;
VolumeBlock-->DecklinkVideoAudioSinkBlock; Exemple de code¶
Exemple complet illustrant la sortie Decklink utilisant AppBridge pour une gestion correcte des horodatages :
// Pipeline principal avec sources vidéo/audio
var mainPipeline = new MediaBlocksPipeline();
// Définition des formats vidéo et audio
var videoInfo = new VideoFrameInfoX(1920, 1080, new VideoFrameRate(60));
var audioInfo = new AudioInfoX(AudioFormatX.S16LE, 48000, 2);
// Créer des tees pour diviser les flux
var videoTee = new TeeBlock(2, MediaBlockPadMediaType.Video);
var audioTee = new TeeBlock(2, MediaBlockPadMediaType.Audio);
// Puits AppBridge dans le pipeline principal
var videoSinkSettings = new AppBridgeVideoSinkSettings("decklink_video", videoInfo);
var appBridgeVideoSink = new AppBridgeVideoSinkBlock(videoSinkSettings);
var audioSinkSettings = new AppBridgeAudioSinkSettings("decklink_audio", audioInfo);
var appBridgeAudioSink = new AppBridgeAudioSinkBlock(audioSinkSettings);
// Connecter les sorties tee aux puits AppBridge
mainPipeline.Connect(videoTee.Outputs[1], appBridgeVideoSink.Input);
mainPipeline.Connect(audioTee.Outputs[1], appBridgeAudioSink.Input);
// Pipeline de sortie Decklink
var decklinkPipeline = new MediaBlocksPipeline();
// Sources AppBridge — mêmes noms de canaux que les puits
var videoSourceSettings = new AppBridgeVideoSourceSettings("decklink_video", videoInfo);
var appBridgeVideoSource = new AppBridgeVideoSourceBlock(videoSourceSettings);
var audioSourceSettings = new AppBridgeAudioSourceSettings("decklink_audio", audioInfo);
var appBridgeAudioSource = new AppBridgeAudioSourceBlock(audioSourceSettings);
// Sortie Decklink
var decklinkVideoSettings = new DecklinkVideoSinkSettings(0, DecklinkMode.HD1080p60);
var decklinkAudioSettings = new DecklinkAudioSinkSettings(0);
var decklinkOutput = new DecklinkVideoAudioSinkBlock(decklinkVideoSettings, decklinkAudioSettings);
// Connecter les sources AppBridge à Decklink
decklinkPipeline.Connect(appBridgeVideoSource.Output, decklinkOutput.VideoInput);
decklinkPipeline.Connect(appBridgeAudioSource.Output, decklinkOutput.AudioInput);
// Démarrer les pipelines
await mainPipeline.StartAsync();
await decklinkPipeline.StartAsync();
// Nettoyage en fin d'utilisation
await decklinkPipeline.StopAsync();
appBridgeVideoSource.Dispose();
appBridgeAudioSource.Dispose();
appBridgeVideoSink.Dispose();
appBridgeAudioSink.Dispose();
Quand utiliser AppBridge par rapport aux autres ponts¶
| Type de pont | Idéal pour | Gestion des horodatages |
|---|---|---|
| AppBridge | Decklink, sorties matérielles, timing précis | Préserve les PTS/DTS d'origine |
| Pont standard | Rendu logiciel, usage général | Peut régénérer les horodatages |
| InterPipe | Plusieurs consommateurs, routage flexible | Dépend de la configuration |
| RSInter | Hautes performances, basé sur Rust | Dépend de la configuration |
| BridgeBuffer | Partage mémoire, zéro-copie | Basé sur les tampons |
Plateformes¶
Tous les blocs de pont sont pris en charge sous Windows, macOS, Linux, iOS et Android.
Remarque : les blocs InterPipe et RSInter nécessitent l'installation des plugins GStreamer correspondants.