Puits¶
Les puits sont des blocs qui enregistrent ou diffusent les données. Ce sont les derniers blocs du pipeline. Optionnellement, certains puits peuvent avoir des pins de sortie pour transmettre les données au bloc suivant dans le pipeline.
Le SDK fournit de nombreux puits différents pour différents usages.
Puits fichier
Les puits fichier suivants sont disponibles :
Streaming réseau
Les puits de streaming réseau suivants sont disponibles :
- DASH
- Facebook Live
- HLS
- MJPEG over HTTP
- NDI
- SRT
- SRT MPEG-TS
- RTMP
- Shoutcast
- WHIP
- YouTube Live
- RIST MPEG-TS
Puits utilitaires
Les puits utilitaires suivants sont disponibles :
Puits fichier¶
ASF¶
ASF (Advanced Systems Format) : un format de conteneur numérique de Microsoft utilisé pour stocker des données multimédias, conçu pour être indépendant de la plateforme et prendre en charge des types de médias évolutifs tels que l'audio et la vidéo.
Utilisez la classe ASFSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : ASFSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un ou plusieurs |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/x-wma | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| image/jpeg | ||
| video/x-divx | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-dv | ||
| video/x-huffyuv | ||
| video/x-wmv | ||
| video/x-jpc | ||
| video/x-vp8 | ||
| image/png |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->WMVEncoderBlock;
UniversalSourceBlock-->WMAEncoderBlock;
WMVEncoderBlock-->ASFSinkBlock;
WMAEncoderBlock-->ASFSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioEncoderBlock = new WMAEncoderBlock(new WMAEncoderSettings());
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
var videoEncoderBlock = new WMVEncoderBlock(new WMVEncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
var sinkBlock = new ASFSinkBlock(new ASFSinkSettings(@"output.wmv"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
AVI¶
AVI (Audio Video Interleave) est un format de conteneur multimédia introduit par Microsoft. Il permet la lecture simultanée de l'audio et de la vidéo en alternant des segments de données audio et vidéo.
Utilisez la classe AVISinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : AVISinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un ou plusieurs |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| image/jpeg | ||
| video/x-divx | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-dv | ||
| video/x-huffyuv | ||
| image/png |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->MP3EncoderBlock;
UniversalSourceBlock-->DIVXEncoderBlock;
MP3EncoderBlock-->AVISinkBlock;
DIVXEncoderBlock-->AVISinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioEncoderBlock = new MP3EncoderBlock(new MP3EncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
var videoEncoderBlock = new DIVXEncoderBlock(new DIVXEncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
var sinkBlock = new AVISinkBlock(new AVISinkSettings(@"output.avi"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
Fichier RAW¶
Sortie universelle vers un fichier. Ce puits est utilisé à l'intérieur de tous les autres puits de plus haut niveau, par ex. MP4Sink. Il peut être utilisé pour écrire de la vidéo ou de l'audio RAW dans un fichier.
Informations sur le bloc¶
Nom : FileSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée | Tout format de flux | 1 |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->MP3EncoderBlock;
MP3EncoderBlock-->AVISinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp3";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var mp3EncoderBlock = new MP3EncoderBlock(new MP3EncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, mp3EncoderBlock.Input);
var fileSinkBlock = new FileSinkBlock(@"output.mp3");
pipeline.Connect(mp3EncoderBlock.Output, fileSinkBlock.Input);
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
MKV¶
MKV (Matroska) est un format de conteneur libre et standard ouvert, similaire à MP4 et AVI mais offrant davantage de flexibilité et de fonctionnalités avancées.
Utilisez la classe MKVSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : MKVSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un ou plusieurs |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/x-wma | ||
| audio/x-vorbis | ||
| audio/x-opus | ||
| audio/x-flac | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| image/jpeg | ||
| video/x-divx | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 | ||
| video/x-dv | ||
| video/x-huffyuv | ||
| video/x-wmv | ||
| video/x-jpc | ||
| video/x-vp8 | ||
| video/x-vp9 | ||
| video/x-theora | ||
| image/png |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->VorbisEncoderBlock;
UniversalSourceBlock-->VP9EncoderBlock;
VorbisEncoderBlock-->MKVSinkBlock;
VP9EncoderBlock-->MKVSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioEncoderBlock = new VorbisEncoderBlock(new VorbisEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
var videoEncoderBlock = new VP9EncoderBlock(new VP9EncoderSettings() { Bitrate = 2000 });
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
var sinkBlock = new MKVSinkBlock(new MKVSinkSettings(@"output.mkv"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
MOV¶
MOV (QuickTime File Format) est un format de conteneur multimédia développé par Apple pour stocker de la vidéo, de l'audio et d'autres médias temporels. Il prend en charge divers codecs et est largement utilisé pour le contenu multimédia sur les plateformes Apple, ainsi qu'en édition vidéo professionnelle.
Utilisez la classe MOVSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : MOVSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un ou plusieurs |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| image/jpeg | ||
| video/x-divx | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 | ||
| video/x-dv | ||
| video/x-huffyuv | ||
| image/png |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->AACEncoderBlock;
UniversalSourceBlock-->H264EncoderBlock;
AACEncoderBlock-->MOVSinkBlock;
H264EncoderBlock-->MOVSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioEncoderBlock = new AACEncoderBlock(new AACEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
var videoEncoderBlock = new H264EncoderBlock(new OpenH264EncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
var sinkBlock = new MOVSinkBlock(new MOVSinkSettings(@"output.mov"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
MP4¶
MP4 (MPEG-4 Part 14) est un format de conteneur multimédia numérique utilisé pour stocker de la vidéo, de l'audio et d'autres données telles que des sous-titres et des images. Il est largement utilisé pour le partage de contenu vidéo en ligne et est compatible avec une large gamme d'appareils et de plateformes.
Utilisez la classe MP4SinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : MP4SinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un ou plusieurs |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| image/jpeg | ||
| video/x-divx | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 | ||
| video/x-dv | ||
| video/x-huffyuv | ||
| image/png |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->AACEncoderBlock;
UniversalSourceBlock-->H264EncoderBlock;
AACEncoderBlock-->MP4SinkBlock;
H264EncoderBlock-->MP4SinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioEncoderBlock = new AACEncoderBlock(new AACEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
var videoEncoderBlock = new H264EncoderBlock(new OpenH264EncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
var sinkBlock = new MP4SinkBlock(new MP4SinkSettings(@"output.mp4"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
MPEG-PS¶
MPEG-PS (MPEG Program Stream) est un format de conteneur permettant le multiplexage d'audio, de vidéo et d'autres données numériques. Il est conçu pour des supports raisonnablement fiables, tels que les DVD, CD-ROM et autres supports disques.
Construisez via new MPEGPSSinkBlock(string filename) — le bloc est livré avec un seul constructeur n'acceptant qu'un nom de fichier ; il n'y a pas de classe de paramètres séparée.
Informations sur le bloc¶
Nom : MPEGPSSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un ou plusieurs |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| image/jpeg | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->MP2EncoderBlock;
UniversalSourceBlock-->MPEG2EncoderBlock;
MP2EncoderBlock-->MPEGPSSinkBlock;
MPEG2EncoderBlock-->MPEGPSSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioEncoderBlock = new MP2EncoderBlock(new MP2EncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
var videoEncoderBlock = new MPEG2EncoderBlock(new MPEG2VideoEncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
var sinkBlock = new MPEGPSSinkBlock(@"output.mpg");
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
MPEG-TS¶
MPEG-TS (MPEG Transport Stream) est un format de conteneur numérique standard pour la transmission et le stockage de données audio, vidéo et PSIP (Program and System Information Protocol). Il est utilisé dans les systèmes de diffusion tels que DVB, ATSC et IPTV.
Utilisez la classe MPEGTSSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : MPEGTSSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un ou plusieurs |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| image/jpeg | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->AACEncoderBlock;
UniversalSourceBlock-->H264EncoderBlock;
AACEncoderBlock-->MPEGTSSinkBlock;
H264EncoderBlock-->MPEGTSSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioEncoderBlock = new AACEncoderBlock(new AACEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
var videoEncoderBlock = new H264EncoderBlock(new OpenH264EncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
var sinkBlock = new MPEGTSSinkBlock(new MPEGTSSinkSettings(@"output.ts"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
MXF¶
MXF (Material Exchange Format) est un format de conteneur pour les médias vidéo et audio numériques professionnels, développé pour résoudre des problèmes tels que l'échange de fichiers et l'interopérabilité, et pour améliorer les flux de production entre maisons de production et fournisseurs de contenu/équipement.
Utilisez la classe MXFSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : MXFSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un ou plusieurs |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| image/jpeg | ||
| video/x-divx | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 | ||
| video/x-dv | ||
| image/png |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->PCMEncoderBlock;
UniversalSourceBlock-->DIVXEncoderBlock;
PCMEncoderBlock-->MXFSinkBlock;
DIVXEncoderBlock-->MXFSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioBlock = new PCMEncoderBlock(new PCMEncoderSettings());
pipeline.Connect(fileSource.AudioOutput, audioBlock.Input);
var videoEncoderBlock = new DIVXEncoderBlock(new DIVXEncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
var sinkBlock = new MXFSinkBlock(new MXFSinkSettings(@"output.mxf"));
pipeline.Connect(audioBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
OGG¶
OGG est un format de conteneur libre et ouvert conçu pour le streaming et la manipulation efficaces de contenu multimédia numérique de haute qualité. Il est développé par la Xiph.Org Foundation et prend en charge des codecs audio comme Vorbis, Opus et FLAC, ainsi que des codecs vidéo comme Theora.
Utilisez la classe OGGSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : OGGSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un ou plusieurs |
| audio/x-vorbis | ||
| audio/x-flac | ||
| audio/x-speex | ||
| audio/x-celt | ||
| audio/x-opus | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| video/x-theora | ||
| video/x-dirac |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->VorbisEncoderBlock;
UniversalSourceBlock-->TheoraEncoderBlock;
VorbisEncoderBlock-->OGGSinkBlock;
TheoraEncoderBlock-->OGGSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioEncoderBlock = new VorbisEncoderBlock(new VorbisEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
var videoEncoderBlock = new TheoraEncoderBlock(new TheoraEncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
var sinkBlock = new OGGSinkBlock(new OGGSinkSettings(@"output.ogg"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
WAV¶
WAV (Waveform Audio File Format) est un standard de format de fichier audio développé par IBM et Microsoft pour stocker des flux audio sur PC. C'est le format principal utilisé sur les systèmes Windows pour l'audio brut et typiquement non compressé.
Le puits est configuré via son argument de nom de fichier — il n'y a pas de classe WAVSinkSettings séparée ; le format des échantillons provient des paramètres du PCMEncoderBlock en amont.
Informations sur le bloc¶
Nom : WAVSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un |
| audio/x-alaw | ||
| audio/x-mulaw |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->PCMEncoderBlock;
PCMEncoderBlock-->WAVSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp3";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioBlock = new PCMEncoderBlock(new PCMEncoderSettings());
pipeline.Connect(fileSource.AudioOutput, audioBlock.Input);
var sinkBlock = new WAVSinkBlock(@"output.wav");
pipeline.Connect(audioBlock.Output, sinkBlock.Input);
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
WebM¶
WebM est un format de fichier multimédia ouvert, libre de droits, conçu pour le web. WebM définit la structure du conteneur ainsi que les formats vidéo et audio. Les fichiers WebM se composent de flux vidéo compressés avec les codecs vidéo VP8 ou VP9 et de flux audio compressés avec les codecs audio Vorbis ou Opus.
Utilisez la classe WebMSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : WebMSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un ou plusieurs |
| audio/x-vorbis | ||
| audio/x-opus | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| video/x-vp8 | ||
| video/x-vp9 |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->VorbisEncoderBlock;
UniversalSourceBlock-->VP9EncoderBlock;
VorbisEncoderBlock-->WebMSinkBlock;
VP9EncoderBlock-->WebMSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioEncoderBlock = new VorbisEncoderBlock(new VorbisEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
var videoEncoderBlock = new VP9EncoderBlock(new VP9EncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
var sinkBlock = new WebMSinkBlock(new WebMSinkSettings(@"output.webm"));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
Puits de streaming réseau¶
RTMP¶
RTMP (Real-Time Messaging Protocol) : développé par Adobe, RTMP est un protocole utilisé pour diffuser de l'audio, de la vidéo et des données sur Internet, optimisé pour une transmission à hautes performances. Il permet une communication efficace à faible latence, couramment utilisée en diffusion en direct comme les événements sportifs et les concerts.
Utilisez la classe RTMPSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : RTMPSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/mpeg [1,2,4] | un |
| audio/x-adpcm | ||
| PCM [U8, S16LE] | ||
| audio/x-speex | ||
| audio/x-mulaw | ||
| audio/x-alaw | ||
| audio/x-nellymoser | ||
| Vidéo en entrée | video/x-h264 | un |
Exemple de pipeline¶
graph LR;
VirtualVideoSourceBlock-->H264EncoderBlock;
VirtualAudioSourceBlock-->AACEncoderBlock;
H264EncoderBlock-->RTMPSinkBlock;
AACEncoderBlock-->RTMPSinkBlock; Exemple de code¶
// Pipeline
var pipeline = new MediaBlocksPipeline();
// sources vidéo et audio
var virtualVideoSource = new VirtualVideoSourceSettings
{
Width = 1280,
Height = 720,
FrameRate = VideoFrameRate.FPS_25,
};
var videoSource = new VirtualVideoSourceBlock(virtualVideoSource);
var virtualAudioSource = new VirtualAudioSourceSettings
{
Channels = 2,
SampleRate = 44100,
};
var audioSource = new VirtualAudioSourceBlock(virtualAudioSource);
// encodeurs H264/AAC
var h264Encoder = new H264EncoderBlock(new OpenH264EncoderSettings());
var aacEncoder = new AACEncoderBlock();
pipeline.Connect(videoSource.Output, h264Encoder.Input);
pipeline.Connect(audioSource.Output, aacEncoder.Input);
// puits RTMP
var sink = new RTMPSinkBlock(new RTMPSinkSettings());
pipeline.Connect(h264Encoder.Output, sink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(aacEncoder.Output, sink.CreateNewInput(MediaBlockPadMediaType.Audio));
// Démarrer
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
Facebook Live¶
Facebook Live est une fonctionnalité qui permet la diffusion vidéo en direct sur Facebook. Le direct peut être publié sur des profils personnels, des pages ou des groupes.
Utilisez la classe FacebookLiveSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : FacebookLiveSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/mpeg [1,2,4] | un |
| audio/x-adpcm | ||
| PCM [U8, S16LE] | ||
| audio/x-speex | ||
| audio/x-mulaw | ||
| audio/x-alaw | ||
| audio/x-nellymoser | ||
| Vidéo en entrée | video/x-h264 | un |
Exemple de pipeline¶
graph LR;
VirtualVideoSourceBlock-->H264EncoderBlock;
VirtualAudioSourceBlock-->AACEncoderBlock;
H264EncoderBlock-->FacebookLiveSinkBlock;
AACEncoderBlock-->FacebookLiveSinkBlock; Exemple de code¶
// Pipeline
var pipeline = new MediaBlocksPipeline();
// sources vidéo et audio
var virtualVideoSource = new VirtualVideoSourceSettings
{
Width = 1280,
Height = 720,
FrameRate = VideoFrameRate.FPS_25,
};
var videoSource = new VirtualVideoSourceBlock(virtualVideoSource);
var virtualAudioSource = new VirtualAudioSourceSettings
{
Channels = 2,
SampleRate = 44100,
};
var audioSource = new VirtualAudioSourceBlock(virtualAudioSource);
// encodeurs H264/AAC
var h264Encoder = new H264EncoderBlock(new OpenH264EncoderSettings());
var aacEncoder = new AACEncoderBlock();
pipeline.Connect(videoSource.Output, h264Encoder.Input);
pipeline.Connect(audioSource.Output, aacEncoder.Input);
// puits Facebook Live — FacebookLiveSinkSettings n'accepte que la CLÉ de flux.
var sink = new FacebookLiveSinkBlock(new FacebookLiveSinkSettings("your_stream_key"));
pipeline.Connect(h264Encoder.Output, sink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(aacEncoder.Output, sink.CreateNewInput(MediaBlockPadMediaType.Audio));
// Démarrer
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
HLS¶
HLS (HTTP Live Streaming) est un protocole de communication de streaming adaptatif basé sur HTTP développé par Apple. Il permet le streaming à débit adaptatif en découpant le flux en une séquence de petits segments de fichiers basés sur HTTP.
Le puits HLS prend en charge plusieurs implémentations : - hlssink3 (recommandé) : implémentation la plus récente avec des segments MPEG-TS et des fonctionnalités avancées - hlsmultivariantsink : streaming adaptatif multi-débit avec génération automatique de la playlist principale - hlscmafsink : segments CMAF/fMP4 pour une meilleure compatibilité avec les lecteurs modernes - hlssink2 (hérité) : implémentation d'origine avec des segments MPEG-TS
Utilisez la classe HLSSinkSettings pour configurer les paramètres. Par défaut, le puits sélectionne automatiquement la meilleure implémentation disponible.
Informations sur le bloc¶
Nom : HLSSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/mpeg | un ou plusieurs |
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| image/jpeg | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->AACEncoderBlock;
UniversalSourceBlock-->H264EncoderBlock1;
UniversalSourceBlock-->H264EncoderBlock2;
UniversalSourceBlock-->H264EncoderBlock3;
AACEncoderBlock-->HLSSinkBlock;
H264EncoderBlock1-->HLSSinkBlock;
H264EncoderBlock2-->HLSSinkBlock;
H264EncoderBlock3-->HLSSinkBlock; Exemple de code¶
Streaming HLS de base (mode Auto)¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioEncoderBlock = new AACEncoderBlock(new AACEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
// 3 encodeurs vidéo avec des débits différents pour le streaming adaptatif
var videoEncoderBlock1 = new H264EncoderBlock(new OpenH264EncoderSettings { Bitrate = 3000, Width = 1920, Height = 1080 });
var videoEncoderBlock2 = new H264EncoderBlock(new OpenH264EncoderSettings { Bitrate = 1500, Width = 1280, Height = 720 });
var videoEncoderBlock3 = new H264EncoderBlock(new OpenH264EncoderSettings { Bitrate = 800, Width = 854, Height = 480 });
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock1.Input);
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock2.Input);
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock3.Input);
// Configurer le puits HLS avec sélection automatique (préfère hlssink3)
var hlsSettings = new HLSSinkSettings()
{
Location = @"c:\inetpub\wwwroot\hls\segment_%05d.ts",
PlaylistLocation = @"c:\inetpub\wwwroot\hls\playlist.m3u8",
PlaylistRoot = "http://localhost/hls/",
TargetDuration = TimeSpan.FromSeconds(6),
PlaylistLength = 5,
MaxFiles = 10,
PlaylistType = HLSPlaylistType.Event,
Custom_HTTP_Server_Enabled = true,
Custom_HTTP_Server_Port = 8080
};
var sinkBlock = new HLSSinkBlock(hlsSettings);
// Connecter l'audio
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
// Connecter les variantes vidéo
pipeline.Connect(videoEncoderBlock1.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(videoEncoderBlock2.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(videoEncoderBlock3.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Streaming CMAF/fMP4 (pour une meilleure compatibilité)¶
// Configurer le puits HLS avec des segments CMAF/fMP4
var hlsSettings = new HLSSinkSettings()
{
SinkType = HLSSinkType.HlsCmafSink,
Location = @"c:\inetpub\wwwroot\hls\segment_%05d.m4s",
InitLocation = @"c:\inetpub\wwwroot\hls\init_%03d.mp4",
PlaylistLocation = @"c:\inetpub\wwwroot\hls\playlist.m3u8",
TargetDuration = TimeSpan.FromSeconds(6),
PlaylistType = HLSPlaylistType.Event,
EnableProgramDateTime = true,
Sync = true // Requis pour le streaming en direct avec CMAF
};
var sinkBlock = new HLSSinkBlock(hlsSettings);
// Connecter les flux comme dans l'exemple de base
Streaming VOD (vidéo à la demande)¶
// Configurer le puits HLS pour la VOD
var hlsSettings = new HLSSinkSettings()
{
SinkType = HLSSinkType.HlsSink3,
Location = @"c:\videos\hls\segment_%05d.ts",
PlaylistLocation = @"c:\videos\hls\playlist.m3u8",
TargetDuration = TimeSpan.FromSeconds(10),
PlaylistType = HLSPlaylistType.Vod, // mode VOD
EnableEndlist = true, // Ajoute la balise #EXT-X-ENDLIST
PlaylistLength = 0 // Conserver tous les segments pour la VOD
};
var sinkBlock = new HLSSinkBlock(hlsSettings);
// Connecter les flux comme dans l'exemple de base
Streaming adaptatif multi-variantes (playlist principale)¶
// Configurer le puits HLS avec la prise en charge multi-variantes pour un véritable streaming à débit adaptatif
var hlsSettings = new HLSSinkSettings()
{
SinkType = HLSSinkType.HlsMultivariantSink,
PlaylistLocation = @"c:\inetpub\wwwroot\hls\master.m3u8",
TargetDuration = TimeSpan.FromSeconds(6)
};
var sinkBlock = new HLSSinkBlock(hlsSettings);
// Connecter plusieurs variantes vidéo de qualités différentes
// hlsmultivariantsink crée automatiquement les playlists de variantes et la playlist principale
pipeline.Connect(videoEncoderBlock1.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(videoEncoderBlock2.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(videoEncoderBlock3.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
Fonctionnalités du puits HLS¶
Types de puits¶
- Auto (par défaut) : sélectionne automatiquement la meilleure implémentation disponible (préfère hlssink3 → hlsmultivariantsink → hlscmafsink → hlssink2)
- HlsSink3 : implémentation la plus récente avec des segments MPEG-TS, prend en charge les types de playlist, la date et heure du programme, et des fonctionnalités améliorées
- HlsMultivariantSink : streaming adaptatif multi-débit avec génération automatique de la playlist principale pour plusieurs variantes de qualité
- HlsCmafSink : segments CMAF/fMP4 pour une meilleure compatibilité avec les navigateurs et lecteurs modernes
- HlsSink2 : implémentation héritée pour la rétrocompatibilité
Types de playlist¶
- Unspecified : streaming en direct sans balise de type de playlist explicite
- Event : playlist de type événement où les segments ne sont pas supprimés. #EXT-X-ENDLIST est ajoutée à la fin
- Vod : playlist vidéo à la demande. Se comporte comme Event mais définit #EXT-X-PLAYLIST-TYPE:VOD à la fin
Paramètres clés¶
| Propriété | Description | Puits pris en charge |
|---|---|---|
SinkType | Choisir l'implémentation du puits (Auto, HlsSink2, HlsSink3, HlsCmafSink, HlsMultivariantSink) | Tous |
Location | Modèle de fichier de segment (par ex., segment_%05d.ts ou .m4s) | Tous sauf HlsMultivariantSink |
InitLocation | Modèle de segment d'initialisation pour CMAF (par ex., init_%03d.mp4) | HlsCmafSink |
PlaylistLocation | Chemin du fichier de playlist en sortie (.m3u8, master.m3u8 pour multivariant) | Tous |
PlaylistRoot | URL de base pour les segments dans la playlist | Tous sauf HlsMultivariantSink |
TargetDuration | Durée cible d'un segment (TimeSpan) | Tous |
PlaylistLength | Nombre de segments dans la playlist (0 = illimité) | Tous sauf HlsMultivariantSink |
MaxFiles | Nombre maximum de fichiers à conserver sur le disque | Tous sauf HlsMultivariantSink |
PlaylistType | Type de playlist (Unspecified, Event, Vod) | HlsSink3, HlsCmafSink |
EnableProgramDateTime | Ajouter les balises #EXT-X-PROGRAM-DATE-TIME | HlsSink3, HlsCmafSink |
EnableEndlist | Ajouter #EXT-X-ENDLIST à la fin | HlsSink3, HlsCmafSink |
IFramesOnly | Créer une playlist composée uniquement d'images I | HlsSink3 |
Sync | Synchroniser avec l'horloge (requis pour le CMAF en direct) | HlsCmafSink |
Latency | Latence (TimeSpan) | HlsCmafSink |
SendKeyframeRequests | Demander des images clés à l'encodeur | HlsSink2, HlsSink3 |
Plateformes¶
Windows, macOS, Linux, iOS, Android.
MJPEG over HTTP¶
HTTP MJPEG (Motion JPEG) Live est un format de streaming vidéo où chaque image vidéo est compressée séparément sous forme d'image JPEG et transmise sur HTTP. Il est largement utilisé dans les caméras IP et les webcams en raison de sa simplicité, bien qu'il soit moins efficace que les codecs modernes.
Construisez via new HTTPMJPEGLiveSinkBlock(int port) — le bloc est livré avec un constructeur n'acceptant qu'un port ; le chemin de l'URL est fixe (http://<host>:<port>/). Il n'y a pas de classe de paramètres séparée.
Informations sur le bloc¶
Nom : HTTPMJPEGLiveSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Vidéo en entrée | video/x-raw | un |
| image/jpeg |
Exemple de pipeline¶
graph LR;
VirtualVideoSourceBlock-->MJPEGEncoderBlock;
MJPEGEncoderBlock-->HTTPMJPEGLiveSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
// Créer une source vidéo virtuelle
var virtualVideoSource = new VirtualVideoSourceSettings
{
Width = 1280,
Height = 720,
FrameRate = VideoFrameRate.FPS_30,
};
var videoSource = new VirtualVideoSourceBlock(virtualVideoSource);
// Encodeur MJPEG
var mjpegEncoder = new MJPEGEncoderBlock(new MJPEGEncoderSettings { Quality = 80 });
pipeline.Connect(videoSource.Output, mjpegEncoder.Input);
// Serveur HTTP MJPEG (port uniquement — écoute sur http://<host>:8080/)
var sink = new HTTPMJPEGLiveSinkBlock(8080);
pipeline.Connect(mjpegEncoder.Output, sink.Input);
// Démarrer
await pipeline.StartAsync();
Console.WriteLine("MJPEG stream available at http://localhost:8080/stream");
Console.WriteLine("Press any key to stop...");
Console.ReadKey();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
NDI¶
NDI (Network Device Interface) est un standard de transport vidéo libre de droits développé par NewTek qui permet aux produits compatibles vidéo de communiquer, fournir et recevoir de la vidéo de qualité broadcast avec une haute qualité et une faible latence sur des réseaux Ethernet standard.
Utilisez la classe NDISinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : NDISinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un |
| Vidéo en entrée | video/x-raw | un |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->NDISinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var sinkBlock = new NDISinkBlock(new NDISinkSettings("My NDI Stream"));
// NDISinkBlock expose des pads dynamiques via CreateNewInput — pas de propriétés AudioInput/VideoInput fixes.
pipeline.Connect(fileSource.AudioOutput, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(fileSource.VideoOutput, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux.
SRT¶
SRT (Secure Reliable Transport) est un protocole de transport vidéo open source qui permet la livraison de vidéo sécurisée, à faible latence et de haute qualité sur des réseaux imprévisibles comme l'Internet public. Il a été développé par Haivision.
Utilisez la classe SRTSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : SRTSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée | Tout format de flux | 1 |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->SRTSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
// Créer le puits SRT en mode appelant (se connecte à un listener).
// SRTSinkBlock transporte du MPEG-TS en interne — connectez directement des flux élémentaires encodés.
var srtSettings = new SRTSinkSettings
{
Host = "srt-server.example.com",
Port = 1234,
Mode = SRTMode.Caller,
Latency = 200, // millisecondes
Passphrase = "optional-encryption-passphrase"
};
var srtSink = new SRTSinkBlock(srtSettings);
pipeline.Connect(fileSource.AudioOutput, srtSink.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(fileSource.VideoOutput, srtSink.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
SRT MPEG-TS¶
SRT MPEG-TS est la combinaison du protocole de transport SRT avec le format de conteneur MPEG-TS. Cela permet le transport sécurisé et fiable de flux MPEG-TS sur des réseaux publics, ce qui est utile pour la diffusion et les flux de production vidéo professionnels.
Utilisez la classe SRTMPEGTSSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : SRTMPEGTSSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un ou plusieurs |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| image/jpeg | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->AACEncoderBlock;
UniversalSourceBlock-->H264EncoderBlock;
AACEncoderBlock-->SRTMPEGTSSinkBlock;
H264EncoderBlock-->SRTMPEGTSSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioEncoderBlock = new AACEncoderBlock(new AACEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
var videoEncoderBlock = new H264EncoderBlock(new OpenH264EncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Configurer le puits SRT MPEG-TS
var srtMpegtsSinkSettings = new SRTMPEGTSSinkSettings
{
Host = "srt-server.example.com",
Port = 1234,
Mode = SRTMode.Caller,
Latency = 200,
Passphrase = "optional-encryption-passphrase"
};
var sinkBlock = new SRTMPEGTSSinkBlock(srtMpegtsSinkSettings);
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
YouTube Live¶
YouTube Live est un service de streaming en direct fourni par YouTube. Il permet aux créateurs de diffuser des vidéos en direct à leur audience via la plateforme YouTube.
Utilisez la classe YouTubeSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : YouTubeSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/mpeg [1,2,4] | un |
| audio/x-adpcm | ||
| PCM [U8, S16LE] | ||
| audio/x-speex | ||
| audio/x-mulaw | ||
| audio/x-alaw | ||
| audio/x-nellymoser | ||
| Vidéo en entrée | video/x-h264 | un |
Exemple de pipeline¶
graph LR;
VirtualVideoSourceBlock-->H264EncoderBlock;
VirtualAudioSourceBlock-->AACEncoderBlock;
H264EncoderBlock-->YouTubeSinkBlock;
AACEncoderBlock-->YouTubeSinkBlock; Exemple de code¶
// Pipeline
var pipeline = new MediaBlocksPipeline();
// sources vidéo et audio
var virtualVideoSource = new VirtualVideoSourceSettings
{
Width = 1920,
Height = 1080,
FrameRate = VideoFrameRate.FPS_30,
};
var videoSource = new VirtualVideoSourceBlock(virtualVideoSource);
var virtualAudioSource = new VirtualAudioSourceSettings
{
Channels = 2,
SampleRate = 48000,
};
var audioSource = new VirtualAudioSourceBlock(virtualAudioSource);
// encodeurs H264/AAC
var h264Settings = new OpenH264EncoderSettings
{
Bitrate = 4000, // 4 Mbps pour 1080p
KeyframeInterval = 2 // Image clé toutes les 2 secondes
};
var h264Encoder = new H264EncoderBlock(h264Settings);
var aacSettings = new AACEncoderSettings
{
Bitrate = 192 // 192 kbps pour l'audio
};
var aacEncoder = new AACEncoderBlock(aacSettings);
pipeline.Connect(videoSource.Output, h264Encoder.Input);
pipeline.Connect(audioSource.Output, aacEncoder.Input);
// puits YouTube Live — YouTubeSinkSettings n'accepte que la CLÉ de flux.
var sink = new YouTubeSinkBlock(new YouTubeSinkSettings("your_youtube_stream_key"));
pipeline.Connect(h264Encoder.Output, sink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(aacEncoder.Output, sink.CreateNewInput(MediaBlockPadMediaType.Audio));
// Démarrer
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
Shoutcast¶
Shoutcast est un service permettant de diffuser des médias sur Internet vers des lecteurs multimédias, à l'aide de son propre logiciel propriétaire multiplateforme. Il permet de diffuser du contenu audio numérique, principalement aux formats MP3 ou HE-AAC (High-Efficiency Advanced Audio Coding). L'usage le plus courant de Shoutcast consiste à créer ou écouter des diffusions audio sur Internet.
Utilisez la classe ShoutcastSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : ShoutcastSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/mpeg | un |
| audio/aac | ||
| audio/x-aac |
Exemple de pipeline¶
graph LR;
subgraph MainPipeline
direction LR
A[Source audio par ex. UniversalSourceBlock ou VirtualAudioSourceBlock] --> B{Encodeur audio optionnel par ex. MP3EncoderBlock};
B --> C[ShoutcastSinkBlock];
end
subgraph AlternativeIfSourceEncoded
A2[Source audio encodée] --> C2[ShoutcastSinkBlock];
end Exemple de code¶
// Pipeline
var pipeline = new MediaBlocksPipeline();
// Source audio (par ex. depuis un fichier MP3/AAC ou audio brut)
var universalSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("input.mp3")));
// Ou utilisez VirtualAudioSourceBlock pour une entrée audio brute en direct :
// var audioSource = new VirtualAudioSourceBlock(new VirtualAudioSourceSettings { Channels = 2, SampleRate = 44100 });
// Optionnel : encodeur audio (si la source est audio brut ou nécessite un ré-encodage pour Shoutcast)
// Exemple : MP3EncoderBlock si le serveur Shoutcast attend du MP3
var mp3Encoder = new MP3EncoderBlock(new MP3EncoderSettings() { Bitrate = 128000 }); // Débit en bps
pipeline.Connect(universalSource.AudioOutput, mp3Encoder.Input);
// Si vous utilisez VirtualAudioSourceBlock : pipeline.Connect(audioSource.Output, mp3Encoder.Input);
// Puits Shoutcast
// Configurer les détails de connexion au serveur Shoutcast/Icecast
var shoutcastSettings = new ShoutcastSinkSettings
{
IP = "your-shoutcast-server-ip", // Nom d'hôte ou adresse IP du serveur
Port = 8000, // Port du serveur
Mount = "/mountpoint", // Point de montage (par ex., "/stream", "/live.mp3")
Password = "your-password", // Mot de passe source pour le serveur
Protocol = ShoutProtocol.ICY, // ShoutProtocol.ICY pour Shoutcast v1/v2 (par ex., icy://)
// ShoutProtocol.HTTP pour Icecast 2.x (par ex., http://)
// ShoutProtocol.XAudiocast pour les anciens Shoutcast/XAudioCast
// Métadonnées du flux
StreamName = "My Radio Stream",
Genre = "Various",
Description = "My awesome internet radio station",
URL = "https://my-radio-website.com", // URL de la page d'accueil de votre flux (apparaît dans les métadonnées d'annuaire)
Public = true, // Mettre à true pour figurer dans les annuaires publics (si le serveur le prend en charge)
Username = "source" // Nom d'utilisateur pour l'authentification (souvent "source" ; vérifiez la config du serveur)
// Les autres paramètres du flux comme le débit audio, la fréquence d'échantillonnage et les canaux sont généralement déterminés
// par les propriétés du flux audio d'entrée encodé fourni au ShoutcastSinkBlock.
};
var shoutcastSink = new ShoutcastSinkBlock(shoutcastSettings);
// Connecter la sortie de l'encodeur (ou la sortie audio de la source si déjà encodée et compatible) au puits Shoutcast
pipeline.Connect(mp3Encoder.Output, shoutcastSink.Input);
// Si la source est déjà encodée et compatible (par ex. fichier MP3 vers Shoutcast MP3) :
// pipeline.Connect(universalSource.AudioOutput, shoutcastSink.Input);
// Démarrer le pipeline
await pipeline.StartAsync();
// À des fins d'affichage, vous pouvez construire une chaîne représentant la connexion :
string protocolScheme = shoutcastSettings.Protocol switch
{
ShoutProtocol.ICY => "icy",
ShoutProtocol.HTTP => "http",
ShoutProtocol.XAudiocast => "xaudiocast", // Remarque : le schéma réel peut être http pour XAudiocast
_ => "unknown"
};
Console.WriteLine($"Streaming to Shoutcast server: {protocolScheme}://{shoutcastSettings.IP}:{shoutcastSettings.Port}{shoutcastSettings.Mount}");
Console.WriteLine($"Stream metadata URL (for directories): {shoutcastSettings.URL}");
Console.WriteLine("Press any key to stop the stream...");
Console.ReadKey();
// Arrêter le pipeline (important pour une déconnexion propre et la libération des ressources)
await pipeline.StopAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
DASH¶
Le DASHSinkBlock produit une sortie MPEG-DASH (Dynamic Adaptive Streaming over HTTP) — un manifeste MPD et des segments multimédias — compatible avec tout lecteur capable de lire le DASH. Il prend en charge à la fois les modes VOD (statique) et direct (dynamique). Plusieurs flux vidéo et audio peuvent être connectés simultanément pour créer des manifestes à débit adaptatif.
Informations sur le bloc¶
Nom : DASHSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Vidéo en entrée | video/x-h264 | un ou plusieurs |
| video/x-h265 | ||
| video/x-vp9 | ||
| video/x-av1 | ||
| Audio en entrée | audio/mpeg | un ou plusieurs |
| audio/x-aac | ||
| audio/x-opus |
Paramètres¶
Utilisez DASHSinkSettings pour configurer la sortie DASH :
| Propriété | Type | Par défaut | Description |
|---|---|---|---|
MPDFilename | string | c:\inetpub\wwwroot\dash\manifest.mpd | Chemin complet du fichier manifeste MPD |
MPDBaseURL | string | "" | URL de base ajoutée en préfixe aux noms de segments dans le manifeste |
TargetDuration | TimeSpan | 5 s | Durée cible par segment multimédia |
MinBufferTime | TimeSpan | 2 s | Temps minimum de tampon annoncé dans le manifeste |
Dynamic | bool | false | false = VOD/statique ; true = flux en direct |
PresentationDelay | TimeSpan | 0 | Délai de présentation (direct uniquement) |
MinimumUpdatePeriod | TimeSpan | 0 | Intervalle de rafraîchissement du MPD (direct uniquement) |
TimeShiftBufferDepth | TimeSpan | 0 | Profondeur de la fenêtre DVR (direct uniquement) |
SendKeyframeRequests | bool | true | Demander des images clés aux limites de segments |
Custom_HTTP_Server_Enabled | bool | false | Activer le serveur HTTP intégré pour servir les segments |
Custom_HTTP_Server_Port | int | 80 | Port du serveur HTTP intégré |
Appelez settings.CheckAndCreateFolders() avant de démarrer le pipeline pour vous assurer que le répertoire de sortie existe.
Les pads d'entrée sont créés dynamiquement : appelez dashSink.CreateNewInput(MediaBlockPadMediaType.Video) ou dashSink.CreateNewInput(MediaBlockPadMediaType.Audio) pour obtenir un pad, puis connectez-y la sortie de votre encodeur.
Exemple de pipeline¶
graph LR;
UniversalSourceBlock -- Vidéo brute --> H264EncoderBlock;
UniversalSourceBlock -- Audio brut --> AACEncoderBlock;
H264EncoderBlock -- Vidéo H.264 --> DASHSinkBlock;
AACEncoderBlock -- Audio AAC --> DASHSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var dashSettings = new DASHSinkSettings
{
MPDFilename = @"c:\output\dash\manifest.mpd",
MPDBaseURL = "http://localhost/dash/",
TargetDuration = TimeSpan.FromSeconds(5),
Dynamic = false // mode VOD/statique ; mettre à true pour le streaming en direct
};
dashSettings.CheckAndCreateFolders();
var dashSink = new DASHSinkBlock(dashSettings);
var universalSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("input.mp4")));
var h264Encoder = new H264EncoderBlock(new OpenH264EncoderSettings());
var aacEncoder = new AACEncoderBlock();
pipeline.Connect(universalSource.VideoOutput, h264Encoder.Input);
pipeline.Connect(universalSource.AudioOutput, aacEncoder.Input);
pipeline.Connect(h264Encoder.Output, dashSink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(aacEncoder.Output, dashSink.CreateNewInput(MediaBlockPadMediaType.Audio));
await pipeline.StartAsync();
Disponibilité¶
Vérifiez la disponibilité avec DASHSinkBlock.IsAvailable(). Nécessite le plugin GStreamer dash et le paquet de redistribution VisioForge SDK approprié.
Plateformes¶
Windows, macOS, Linux.
WHIP¶
Le WHIPSinkBlock diffuse des médias vers des serveurs WebRTC en utilisant WHIP (WebRTC-HTTP Ingestion Protocol), permettant un streaming en direct à faible latence vers des services tels que MediaMTX, Janus, Cloudflare Stream et d'autres points de terminaison compatibles WHIP. La vidéo doit être encodée en H.264 et l'audio en Opus — l'encapsulation RTP est gérée en interne par le bloc.
Informations sur le bloc¶
Nom : WHIPSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Vidéo en entrée | video/x-h264 | 1 |
| Audio en entrée | audio/x-opus | 1 |
Paramètres¶
Utilisez WHIPSinkSettings pour configurer le point de terminaison WHIP :
| Propriété | Type | Par défaut | Description |
|---|---|---|---|
Location | string | http://localhost:8889/stream/whip | URL du point de terminaison WHIP |
AuthToken | string | null | Jeton Bearer envoyé dans l'en-tête HTTP Authorization |
StunServer | string | null | URL du serveur STUN (format : stun://hostname:port) |
TurnServer | string | null | URL du serveur TURN (format : turn(s)://username:password@host:port) |
UseLinkHeaders | bool | true | Configurer automatiquement les serveurs ICE à partir des en-têtes Link de la réponse du serveur WHIP |
Timeout | TimeSpan | 15 s | Délai d'expiration des requêtes HTTP WHIP |
IceTransportPolicy | WHIPIceTransportPolicy | All | All = utiliser STUN et TURN ; Relay = relais TURN uniquement |
Les pads d'entrée sont créés dynamiquement : appelez whipSink.CreateNewInput(MediaBlockPadMediaType.Video) et whipSink.CreateNewInput(MediaBlockPadMediaType.Audio) pour obtenir les pads, puis connectez vos encodeurs.
Exemple de pipeline¶
graph LR;
UniversalSourceBlock -- Vidéo brute --> H264EncoderBlock;
UniversalSourceBlock -- Audio brut --> OPUSEncoderBlock;
H264EncoderBlock -- Vidéo H.264 --> WHIPSinkBlock;
OPUSEncoderBlock -- Audio Opus --> WHIPSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var whipSettings = new WHIPSinkSettings
{
Location = "http://localhost:8889/live/whip",
AuthToken = "your-bearer-token", // optionnel
StunServer = "stun://stun.l.google.com:19302"
};
var whipSink = new WHIPSinkBlock(whipSettings);
var universalSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("input.mp4")));
var h264Encoder = new H264EncoderBlock(new OpenH264EncoderSettings());
var opusEncoder = new OPUSEncoderBlock();
pipeline.Connect(universalSource.VideoOutput, h264Encoder.Input);
pipeline.Connect(universalSource.AudioOutput, opusEncoder.Input);
pipeline.Connect(h264Encoder.Output, whipSink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(opusEncoder.Output, whipSink.CreateNewInput(MediaBlockPadMediaType.Audio));
await pipeline.StartAsync();
Disponibilité¶
Vérifiez la disponibilité avec WHIPSinkBlock.IsAvailable(). Nécessite le plugin GStreamer webrtc et le paquet de redistribution VisioForge SDK approprié.
Plateformes¶
Windows, macOS, Linux.
RIST MPEG-TS¶
Le RISTMPEGTSSinkBlock multiplexe les flux audio et vidéo en MPEG-TS, encapsule le transport dans RTP et l'envoie via RIST (Reliable Internet Stream Transport). RIST ajoute une retransmission basée sur ARQ sur UDP, offrant une livraison de médias fiable à faible latence sans la surcharge de TCP.
Plusieurs pads d'entrée audio et vidéo sont pris en charge. Appelez CreateNewInput(MediaBlockPadMediaType.Video) et CreateNewInput(MediaBlockPadMediaType.Audio) pour obtenir des pads avant de connecter les encodeurs.
Informations sur le bloc¶
Nom : RISTMPEGTSSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Vidéo en entrée | Vidéo encodée | Dynamique |
| Audio en entrée | Audio encodé | Dynamique |
Paramètres¶
Utilisez RISTSinkSettings pour configurer la destination :
| Propriété | Type | Par défaut | Description |
|---|---|---|---|
Address | string | "localhost" | Adresse IPv4 ou IPv6 de destination |
Port | uint | 5004 | Port RTP de destination (doit être pair ; RTCP utilise Port + 1) |
SenderBuffer | TimeSpan | 1200 ms | Taille de la file d'attente de retransmission |
BondingAddresses | string | null | Paires address:port séparées par des virgules pour le bonding ; remplace Address/Port |
BondingMethod | RISTBondingMethod | Broadcast | Broadcast = envoyer à toutes les destinations ; RoundRobin = alterner |
MulticastInterface | string | null | Interface réseau pour le multicast |
MulticastTTL | int | 1 | Time-to-live multicast |
DropNullTSPackets | bool | false | Supprimer les paquets de bourrage MPEG-TS nuls |
SequenceNumberExtension | bool | false | Ajouter l'extension de numéro de séquence RTP |
MinRTCPInterval | uint | 100 | Intervalle minimal entre paquets RTCP (ms) |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock -- Vidéo brute --> H264EncoderBlock;
UniversalSourceBlock -- Audio brut --> AACEncoderBlock;
H264EncoderBlock --> RISTMPEGTSSinkBlock;
AACEncoderBlock --> RISTMPEGTSSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var source = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("input.mp4")));
var h264Encoder = new H264EncoderBlock(new OpenH264EncoderSettings());
var aacEncoder = new AACEncoderBlock();
pipeline.Connect(source.VideoOutput, h264Encoder.Input);
pipeline.Connect(source.AudioOutput, aacEncoder.Input);
var ristSettings = new RISTSinkSettings
{
Address = "192.168.1.100",
Port = 5004,
SenderBuffer = TimeSpan.FromMilliseconds(1200)
};
var ristSink = new RISTMPEGTSSinkBlock(ristSettings);
pipeline.Connect(h264Encoder.Output, ristSink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(aacEncoder.Output, ristSink.CreateNewInput(MediaBlockPadMediaType.Audio));
await pipeline.StartAsync();
Disponibilité¶
RISTMPEGTSSinkBlock.IsAvailable() renvoie true si le plugin GStreamer rist est présent.
Plateformes¶
Windows, macOS, Linux.
UDP¶
UDP (User Datagram Protocol) est un protocole de transport léger et sans connexion qui offre un streaming à faible latence avec une surcharge minimale. Contrairement aux protocoles basés sur TCP, UDP ne garantit pas la livraison des paquets, ce qui le rend idéal pour les applications temps réel où la rapidité est cruciale.
Utilisez la classe UDPSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : UDPSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée | Tout format de flux | 1 |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->UDPMPEGTSSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
// UDPMPEGTSSinkBlock encapsule le multiplexeur MPEG-TS en interne —
// connectez directement les flux élémentaires encodés via CreateNewInput.
var udpSettings = new UDPSinkSettings
{
Host = "192.168.1.100",
Port = 5004
};
var udpSink = new UDPMPEGTSSinkBlock(udpSettings);
pipeline.Connect(fileSource.AudioOutput, udpSink.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(fileSource.VideoOutput, udpSink.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
UDP MPEG-TS¶
UDP MPEG-TS combine le multiplexage MPEG-TS avec le transport UDP. Cela permet la livraison à faible latence de flux audio et vidéo multiplexés sur UDP, ce qui est largement utilisé dans les flux de production de diffusion, IPTV et vidéosurveillance.
Utilisez la classe UDPSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : UDPMPEGTSSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un ou plusieurs |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| image/jpeg | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 |
Paramètres¶
| Propriété | Type | Par défaut | Description |
|---|---|---|---|
Host | string | "localhost" | Hôte/IP/groupe multicast de destination |
Port | int | 5004 | Port de destination |
TTL | int | 64 | Time-to-live unicast |
MulticastTTL | int | 1 | Time-to-live multicast |
AutoMulticast | bool | true | Rejoindre/quitter automatiquement les groupes multicast |
MulticastInterface | string | null | Interface réseau pour le multicast |
Loop | bool | true | Bouclage multicast |
BufferSize | int | 0 | Taille du tampon d'envoi du noyau (0 = valeur par défaut) |
QosDscp | int | -1 | Valeur DSCP (-1 = valeur par défaut) |
BindAddress | string | null | Adresse locale à lier |
BindPort | int | 0 | Port local à lier (0 = auto) |
MuxerLatency | TimeSpan | 1000 ms | Latence de l'agrégateur du multiplexeur MPEG-TS |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->AACEncoderBlock;
UniversalSourceBlock-->H264EncoderBlock;
AACEncoderBlock-->UDPMPEGTSSinkBlock;
H264EncoderBlock-->UDPMPEGTSSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
var audioEncoderBlock = new AACEncoderBlock(new AACEncoderSettings() { Bitrate = 192 });
pipeline.Connect(fileSource.AudioOutput, audioEncoderBlock.Input);
var videoEncoderBlock = new H264EncoderBlock(new OpenH264EncoderSettings());
pipeline.Connect(fileSource.VideoOutput, videoEncoderBlock.Input);
// Configurer le puits UDP MPEG-TS
var udpSettings = new UDPSinkSettings
{
Host = "192.168.1.100",
Port = 5004,
TTL = 64
};
var sinkBlock = new UDPMPEGTSSinkBlock(udpSettings);
pipeline.Connect(audioEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(videoEncoderBlock.Output, sinkBlock.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Disponibilité¶
UDPMPEGTSSinkBlock.IsAvailable() renvoie true si le plugin GStreamer udp est présent.
Plateformes¶
Windows, macOS, Linux, iOS, Android.
UDP multi-destinations¶
Le MultiUDPSinkBlock envoie des données brutes via UDP à un ou plusieurs destinataires simultanément. Les destinations sont spécifiées sous forme de paires host:port séparées par des virgules et peuvent être gérées à l'aide de méthodes d'aide sur la classe de paramètres.
Utilisez la classe MultiUDPSinkSettings pour définir les paramètres.
Informations sur le bloc¶
Nom : MultiUDPSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée | Tout format de flux | 1 |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->MultiUDPMPEGTSSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
// MultiUDPMPEGTSSinkBlock encapsule le multiplexeur MPEG-TS en interne —
// enregistrez les destinations via AddClient, connectez les flux élémentaires via CreateNewInput.
var multiUdpSettings = new MultiUDPSinkSettings();
multiUdpSettings.AddClient("192.168.1.100", 5004);
multiUdpSettings.AddClient("192.168.1.101", 5004);
var multiUdpSink = new MultiUDPMPEGTSSinkBlock(multiUdpSettings);
pipeline.Connect(fileSource.AudioOutput, multiUdpSink.CreateNewInput(MediaBlockPadMediaType.Audio));
pipeline.Connect(fileSource.VideoOutput, multiUdpSink.CreateNewInput(MediaBlockPadMediaType.Video));
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux, iOS, Android.
UDP MPEG-TS multi-destinations¶
Le MultiUDPMPEGTSSinkBlock multiplexe les flux audio et vidéo en MPEG-TS et envoie le résultat sur UDP à une ou plusieurs destinations simultanément. C'est utile pour diffuser le même flux à plusieurs récepteurs, serveurs d'enregistrement ou points de terminaison redondants.
Plusieurs pads d'entrée audio et vidéo sont pris en charge. Appelez CreateNewInput(MediaBlockPadMediaType.Video) et CreateNewInput(MediaBlockPadMediaType.Audio) pour obtenir les pads avant de connecter les encodeurs.
Informations sur le bloc¶
Nom : MultiUDPMPEGTSSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Audio en entrée | audio/x-raw | un ou plusieurs |
| audio/mpeg | ||
| audio/x-ac3 | ||
| audio/x-alaw | ||
| audio/x-mulaw | ||
| audio/AAC | ||
| Vidéo en entrée | video/x-raw | un ou plusieurs |
| image/jpeg | ||
| video/x-msmpeg | ||
| video/mpeg | ||
| video/x-h263 | ||
| video/x-h264 | ||
| video/x-h265 |
Paramètres¶
Utilisez MultiUDPSinkSettings pour configurer les destinations :
| Propriété | Type | Par défaut | Description |
|---|---|---|---|
Clients | string | "" | Paires host:port séparées par des virgules |
SendDuplicates | bool | true | Envoyer des doublons lorsque la même destination est ajoutée plusieurs fois |
TTL | int | 64 | Time-to-live unicast |
MulticastTTL | int | 1 | Time-to-live multicast |
AutoMulticast | bool | true | Rejoindre/quitter automatiquement les groupes multicast |
MulticastInterface | string | null | Interface réseau pour le multicast |
Loop | bool | true | Bouclage multicast |
BufferSize | int | 0 | Taille du tampon d'envoi du noyau (0 = valeur par défaut) |
QosDscp | int | -1 | Valeur DSCP (-1 = valeur par défaut) |
BindAddress | string | null | Adresse locale à lier |
BindPort | int | 0 | Port local à lier (0 = auto) |
MuxerLatency | TimeSpan | 1000 ms | Latence de l'agrégateur du multiplexeur MPEG-TS |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock -- Vidéo brute --> H264EncoderBlock;
UniversalSourceBlock -- Audio brut --> AACEncoderBlock;
H264EncoderBlock --> MultiUDPMPEGTSSinkBlock;
AACEncoderBlock --> MultiUDPMPEGTSSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var source = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("input.mp4")));
var h264Encoder = new H264EncoderBlock(new OpenH264EncoderSettings());
var aacEncoder = new AACEncoderBlock();
pipeline.Connect(source.VideoOutput, h264Encoder.Input);
pipeline.Connect(source.AudioOutput, aacEncoder.Input);
var multiUdpSettings = new MultiUDPSinkSettings();
multiUdpSettings.AddClient("192.168.1.100", 5004);
multiUdpSettings.AddClient("192.168.1.101", 5004);
var multiUdpSink = new MultiUDPMPEGTSSinkBlock(multiUdpSettings);
pipeline.Connect(h264Encoder.Output, multiUdpSink.CreateNewInput(MediaBlockPadMediaType.Video));
pipeline.Connect(aacEncoder.Output, multiUdpSink.CreateNewInput(MediaBlockPadMediaType.Audio));
await pipeline.StartAsync();
Disponibilité¶
MultiUDPMPEGTSSinkBlock.IsAvailable() renvoie true si le plugin GStreamer udp est présent.
Plateformes¶
Windows, macOS, Linux, iOS, Android.
Puits utilitaires¶
Puits flux¶
Le StreamSinkBlock écrit des données multimédias vers n'importe quel objet Stream .NET, ce qui permet une sortie flexible vers des tampons mémoire, des fichiers, des connexions réseau, des couches de chiffrement, ou tout autre flux accessible en écriture.
Le flux doit rester ouvert et accessible en écriture pendant toute la durée de vie du pipeline. Le bloc ne libère pas le flux lorsque le pipeline s'arrête.
Informations sur le bloc¶
Nom : StreamSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée | Tout | 1 |
Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
using var outputStream = new FileStream("output.raw", FileMode.Create, FileAccess.Write);
var streamSink = new StreamSinkBlock(outputStream);
pipeline.Connect(fileSource.VideoOutput, streamSink.Input);
await pipeline.StartAsync();
Disponibilité¶
StreamSinkBlock.IsAvailable() renvoie true si l'élément GStreamer appsink est disponible.
Plateformes¶
Windows, macOS, Linux, iOS, Android.
Puits descripteur de fichier¶
Le FDSinkBlock écrit des données multimédias vers un descripteur de fichier Unix (un handle entier). C'est utile pour produire une sortie vers des pipes, des sockets ou l'entrée standard d'un processus enfant.
Passez addQueue: true (par défaut) pour ajouter une file d'attente de mise en tampon qui empêche le pipeline de bloquer sur des écritures lentes du descripteur.
Le descripteur doit être ouvert et accessible en écriture avant le démarrage du pipeline. Le bloc ne le ferme pas lorsque le pipeline s'arrête.
Informations sur le bloc¶
Nom : FDSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée | Tout | 1 |
Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var filename = "test.mp4";
var fileSource = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri(filename)));
// Écrire vers stdout (fd 1)
var fdSink = new FDSinkBlock(descriptor: 1);
pipeline.Connect(fileSource.VideoOutput, fdSink.Input);
await pipeline.StartAsync();
Disponibilité¶
FDSinkBlock.IsAvailable() renvoie true si l'élément GStreamer fdsink est disponible.
Plateformes¶
Linux, macOS. Prise en charge limitée sur Windows.
Puits fichier KLV¶
Le KLVFileSinkBlock écrit des flux de métadonnées KLV (Key-Length-Value) dans un fichier. KLV est utilisé dans les applications conformes à MISB/STANAG 4609 — y compris la vidéo de drones, la surveillance et l'aérospatiale — pour intégrer des métadonnées géospatiales avec la vidéo.
Le bloc accepte des données meta/x-klv sur son entrée et les écrit directement dans le fichier spécifié via l'élément GStreamer filesink.
Informations sur le bloc¶
Nom : KLVFileSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée | meta/x-klv | 1 |
Exemple de code¶
// Le SDK ne fournit pas de bloc source KLV dédié — les flux KLV sont produits
// par des sources MPEG-TS / compatibles MISB en amont ou par l'application elle-même, puis acheminés
// vers KLVFileSinkBlock pour le stockage sur fichier.
var pipeline = new MediaBlocksPipeline();
var klvFileSink = new KLVFileSinkBlock("output_metadata.klv");
pipeline.Connect(klvProducer.Output, klvFileSink.Input); // klvProducer = votre bloc émettant du KLV
await pipeline.StartAsync();
Plateformes¶
Windows, macOS, Linux.
Puits tampon¶
Le BufferSinkBlock capture les données multimédias en mémoire et les délivre image par image via des rappels d'événements, au lieu de les écrire dans un fichier ou sur le réseau. Il prend en charge les flux vidéo, audio et de données arbitraires.
Trois constructeurs couvrent les scénarios courants :
BufferSinkBlock(VideoFormatX, bool allowFrameDrop)— capture vidéo avec conversion de format optionnelleBufferSinkBlock(AudioFormatX, bool allowFrameDrop)— capture audio avec rééchantillonnage optionnelBufferSinkBlock()— détecte automatiquement le type de média à partir de l'élément amont connecté
Événements clés :
OnVideoFrameBuffer— déclenché pour chaque image vidéo décodéeOnAudioFrameBuffer— déclenché pour chaque trame audio décodéeOnDataFrameBuffer— déclenché pour les flux de données non audio/vidéoOnSample— accès bas niveau aux samples GStreamer ; lorsqu'il est abonné, il supprime les trois événements ci-dessus. Libérez toujours le sample après utilisation pour éviter les fuites mémoire.
Définissez IsSync = false pour les flux de transcodage ou d'analyse où la cadence en temps réel n'est pas requise.
Informations sur le bloc¶
Nom : BufferSinkBlock.
| Direction du pin | Type de média | Nombre de pins |
|---|---|---|
| Entrée | Tout | 1 |
Paramètres¶
| Propriété | Type | Par défaut | Description |
|---|---|---|---|
AllowFrameDrop | bool | false | Abandonner des images lorsque les rappels ne peuvent pas suivre la cadence du média |
IsSync | bool | true | true = caler la cadence sur le temps réel ; false = traiter aussi vite que possible |
Exemple de pipeline¶
graph LR;
UniversalSourceBlock-->BufferSinkBlock; Exemple de code¶
var pipeline = new MediaBlocksPipeline();
var source = new UniversalSourceBlock(await UniversalSourceSettings.CreateAsync(new Uri("input.mp4")));
// VideoFormatX est un enum (l'une des valeurs BGRA / RGBA / NV12 / I420 / ...). La taille d'image et
// la fréquence sont héritées des caps amont ; passez allowFrameDrop=true si votre rappel
// risque de prendre du retard sur la source.
var bufferSink = new BufferSinkBlock(VideoFormatX.BGRA, allowFrameDrop: false);
bufferSink.OnVideoFrameBuffer += (sender, e) =>
{
// e.Frame contient les données de pixels, les dimensions et l'horodatage
Console.WriteLine($"Frame at {e.Frame.Timestamp}: {e.Frame.Width}x{e.Frame.Height}");
};
pipeline.Connect(source.VideoOutput, bufferSink.Input);
await pipeline.StartAsync();
Disponibilité¶
BufferSinkBlock.IsAvailable() renvoie true si l'élément GStreamer appsink est disponible.
Plateformes¶
Windows, macOS, Linux, iOS, Android.