Aller au contenu

Référence de l'interface de l'encodeur H.264

Vue d'ensemble

L'interface IH264Encoder fournit un contrôle complet de l'encodage vidéo H.264/AVC (Advanced Video Coding) dans les graphes de filtres DirectShow. H.264 est le format de compression vidéo standard de l'industrie utilisé pour la diffusion, le streaming et les applications de distribution.

Cette interface permet aux développeurs de configurer les profils d'encodage, le contrôle de débit, la structure GOP (Group of Pictures), les modes d'encodage de macroblocs et des paramètres de timing avancés pour une qualité vidéo et une taille de fichier optimales dans divers scénarios — streaming, diffusion et archivage.

GUID de l'interface : {09FA2EA3-4773-41a8-90DC-9499D4061E9F}

Hérite de : IUnknown

Définitions de l'interface

Définition C

using System;
using System.Runtime.InteropServices;

namespace VisioForge.DirectShowAPI
{
    /// <summary>
    /// Interface de configuration de l'encodeur H.264/AVC (Advanced Video Coding).
    /// Fournit un controle complet des parametres d'encodage H.264, dont
    /// le controle de debit, les profils/niveaux, la structure GOP et les modes de controle de debit.
    /// </summary>
    [ComImport]
    [Guid("09FA2EA3-4773-41a8-90DC-9499D4061E9F")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IH264Encoder
    {
        /// <summary>
        /// Obtient le debit binaire cible pour l'encodage.
        /// </summary>
        /// <param name="plValue">Recoit le debit en bits par seconde (bps)</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int get_Bitrate([Out] out int plValue);

        /// <summary>
        /// Definit le debit binaire cible pour l'encodage.
        /// </summary>
        /// <param name="lValue">Debit en bits par seconde (bps). Plage typique : 500 000 a 50 000 000</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int put_Bitrate([In] int lValue);

        /// <summary>
        /// Obtient le mode de controle de debit.
        /// </summary>
        /// <param name="pValue">Recoit le mode de controle de debit (0=CBR, 1=VBR)</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int get_RateControl([Out] out int pValue);

        /// <summary>
        /// Definit le mode de controle de debit.
        /// </summary>
        /// <param name="value">Mode de controle : 0 = CBR (debit constant), 1 = VBR (debit variable)</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int put_RateControl([In] int value);

        /// <summary>
        /// Obtient le mode d'encodage de macroblocs.
        /// </summary>
        /// <param name="pValue">Recoit le mode d'encodage MB</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int get_MbEncoding([Out] out int pValue);

        /// <summary>
        /// Definit le mode d'encodage de macroblocs (affecte la complexite et la qualite d'encodage).
        /// </summary>
        /// <param name="value">Valeur du mode d'encodage MB</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int put_MbEncoding([In] int value);

        /// <summary>
        /// Obtient l'etat d'activation du GOP (Group of Pictures).
        /// </summary>
        /// <param name="pValue">Recoit true si GOP est active, false sinon</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int get_GOP([Out] [MarshalAs(UnmanagedType.Bool)] out bool pValue);

        /// <summary>
        /// Active ou desactive la structure GOP (Group of Pictures).
        /// </summary>
        /// <param name="value">True pour activer GOP, false pour desactiver (toutes images I)</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int put_GOP([In] [MarshalAs(UnmanagedType.Bool)] bool value);

        /// <summary>
        /// Obtient l'etat de l'ajustement automatique du debit.
        /// </summary>
        /// <param name="pValue">Recoit true si le debit auto est active, false sinon</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int get_AutoBitrate([Out] [MarshalAs(UnmanagedType.Bool)] out bool pValue);

        /// <summary>
        /// Active ou desactive l'ajustement automatique du debit.
        /// Lorsqu'il est active, l'encodeur ajuste automatiquement le debit selon la complexite du contenu.
        /// </summary>
        /// <param name="value">True pour activer le debit auto, false pour un debit fixe</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int put_AutoBitrate([In] [MarshalAs(UnmanagedType.Bool)] bool value);

        /// <summary>
        /// Obtient le profil H.264.
        /// </summary>
        /// <param name="pValue">Recoit la valeur du profil</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int get_Profile([Out] out int pValue);

        /// <summary>
        /// Definit le profil H.264 (Baseline, Main, High, etc.).
        /// </summary>
        /// <param name="value">Valeur du profil : 66=Baseline, 77=Main, 100=High</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int put_Profile([In] int value);

        /// <summary>
        /// Obtient le niveau H.264.
        /// </summary>
        /// <param name="pValue">Recoit la valeur du niveau</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int get_Level([Out] out int pValue);

        /// <summary>
        /// Definit le niveau H.264 (contraint la resolution, le debit et la frequence d'images).
        /// </summary>
        /// <param name="value">Valeur du niveau : 10=Level 1.0, 11=Level 1.1, ..., 51=Level 5.1</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int put_Level([In] int value);

        /// <summary>
        /// Obtient le mode d'usage (compromis qualite/vitesse).
        /// </summary>
        /// <param name="pValue">Recoit la valeur du mode d'usage</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int get_Usage([Out] out int pValue);

        /// <summary>
        /// Definit le mode d'usage pour optimiser qualite vs vitesse.
        /// </summary>
        /// <param name="value">Mode : 0=Qualite, 1=Equilibre, 2=Vitesse</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int put_Usage([In] int value);

        /// <summary>
        /// Obtient le mode de timing sequentiel.
        /// </summary>
        /// <param name="pValue">Recoit la valeur du timing sequentiel</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int get_SequentialTiming([Out] out int pValue);

        /// <summary>
        /// Definit le mode de timing sequentiel pour le traitement des images.
        /// </summary>
        /// <param name="value">Valeur du mode de timing sequentiel</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int put_SequentialTiming([In] int value);

        /// <summary>
        /// Obtient les intervalles de slices pour les images IDR et P.
        /// </summary>
        /// <param name="piIDR">Recoit l'intervalle des images IDR</param>
        /// <param name="piP">Recoit l'intervalle des images P</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int get_SliceIntervals([Out] out int piIDR, [Out] out int piP);

        /// <summary>
        /// Definit les intervalles de slices pour les images IDR (Instantaneous Decoder Refresh) et P.
        /// Les images IDR sont des images-cles completes, les images P sont des images predites.
        /// </summary>
        /// <param name="piIDR">Intervalle des images IDR (toutes les N images). Typique : 30-300</param>
        /// <param name="piP">Intervalle des images P. Typique : 1-3</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int put_SliceIntervals([In] ref int piIDR, [In] ref int piP);

        /// <summary>
        /// Obtient le debit maximal pour l'encodage VBR.
        /// </summary>
        /// <param name="plValue">Recoit le debit maximal en bps</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int get_MaxBitrate([Out] out int plValue);

        /// <summary>
        /// Definit le debit maximal pour l'encodage a debit variable (VBR).
        /// Applicable uniquement lorsque le controle de debit est defini sur VBR.
        /// </summary>
        /// <param name="lValue">Debit maximal en bits par seconde (bps)</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int put_MaxBitrate([In] int lValue);

        /// <summary>
        /// Obtient le debit minimal pour l'encodage VBR.
        /// </summary>
        /// <param name="plValue">Recoit le debit minimal en bps</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int get_MinBitrate([Out] out int plValue);

        /// <summary>
        /// Definit le debit minimal pour l'encodage a debit variable (VBR).
        /// Applicable uniquement lorsque le controle de debit est defini sur VBR.
        /// </summary>
        /// <param name="lValue">Debit minimal en bits par seconde (bps)</param>
        /// <returns>HRESULT (0 pour reussite)</returns>
        [PreserveSig]
        int put_MinBitrate([In] int lValue);
    }
}

Définition C++

#include <unknwn.h>

// {09FA2EA3-4773-41a8-90DC-9499D4061E9F}
DEFINE_GUID(IID_IH264Encoder,
    0x09fa2ea3, 0x4773, 0x41a8, 0x90, 0xdc, 0x94, 0x99, 0xd4, 0x06, 0x1e, 0x9f);

/// <summary>
/// Interface de configuration de l'encodeur H.264/AVC (Advanced Video Coding).
/// Fournit un controle complet des parametres d'encodage H.264.
/// </summary>
DECLARE_INTERFACE_(IH264Encoder, IUnknown)
{
    STDMETHOD(get_Bitrate)(THIS_ long* plValue) PURE;
    STDMETHOD(put_Bitrate)(THIS_ long lValue) PURE;
    STDMETHOD(get_RateControl)(THIS_ int* pValue) PURE;
    STDMETHOD(put_RateControl)(THIS_ int value) PURE;
    STDMETHOD(get_MbEncoding)(THIS_ int* pValue) PURE;
    STDMETHOD(put_MbEncoding)(THIS_ int value) PURE;
    STDMETHOD(get_GOP)(THIS_ BOOL* pValue) PURE;
    STDMETHOD(put_GOP)(THIS_ BOOL value) PURE;
    STDMETHOD(get_AutoBitrate)(THIS_ BOOL* pValue) PURE;
    STDMETHOD(put_AutoBitrate)(THIS_ BOOL value) PURE;
    STDMETHOD(get_Profile)(THIS_ int* pValue) PURE;
    STDMETHOD(put_Profile)(THIS_ int value) PURE;
    STDMETHOD(get_Level)(THIS_ int* pValue) PURE;
    STDMETHOD(put_Level)(THIS_ int value) PURE;
    STDMETHOD(get_Usage)(THIS_ int* pValue) PURE;
    STDMETHOD(put_Usage)(THIS_ int value) PURE;
    STDMETHOD(get_SequentialTiming)(THIS_ int* pValue) PURE;
    STDMETHOD(put_SequentialTiming)(THIS_ int value) PURE;
    STDMETHOD(get_SliceIntervals)(THIS_ int* piIDR, int* piP) PURE;
    STDMETHOD(put_SliceIntervals)(THIS_ int* piIDR, int* piP) PURE;
    STDMETHOD(get_MaxBitrate)(THIS_ long* plValue) PURE;
    STDMETHOD(put_MaxBitrate)(THIS_ long lValue) PURE;
    STDMETHOD(get_MinBitrate)(THIS_ long* plValue) PURE;
    STDMETHOD(put_MinBitrate)(THIS_ long lValue) PURE;
};

Définition Delphi

uses
  ActiveX, ComObj;

const
  IID_IH264Encoder: TGUID = '{09FA2EA3-4773-41a8-90DC-9499D4061E9F}';

type
  /// <summary>
  /// Interface de configuration de l'encodeur H.264/AVC.
  /// </summary>
  IH264Encoder = interface(IUnknown)
    ['{09FA2EA3-4773-41a8-90DC-9499D4061E9F}']

    function get_Bitrate(out plValue: Integer): HRESULT; stdcall;
    function put_Bitrate(lValue: Integer): HRESULT; stdcall;
    function get_RateControl(out pValue: Integer): HRESULT; stdcall;
    function put_RateControl(value: Integer): HRESULT; stdcall;
    function get_MbEncoding(out pValue: Integer): HRESULT; stdcall;
    function put_MbEncoding(value: Integer): HRESULT; stdcall;
    function get_GOP(out pValue: BOOL): HRESULT; stdcall;
    function put_GOP(value: BOOL): HRESULT; stdcall;
    function get_AutoBitrate(out pValue: BOOL): HRESULT; stdcall;
    function put_AutoBitrate(value: BOOL): HRESULT; stdcall;
    function get_Profile(out pValue: Integer): HRESULT; stdcall;
    function put_Profile(value: Integer): HRESULT; stdcall;
    function get_Level(out pValue: Integer): HRESULT; stdcall;
    function put_Level(value: Integer): HRESULT; stdcall;
    function get_Usage(out pValue: Integer): HRESULT; stdcall;
    function put_Usage(value: Integer): HRESULT; stdcall;
    function get_SequentialTiming(out pValue: Integer): HRESULT; stdcall;
    function put_SequentialTiming(value: Integer): HRESULT; stdcall;
    function get_SliceIntervals(out piIDR: Integer; out piP: Integer): HRESULT; stdcall;
    function put_SliceIntervals(var piIDR: Integer; var piP: Integer): HRESULT; stdcall;
    function get_MaxBitrate(out plValue: Integer): HRESULT; stdcall;
    function put_MaxBitrate(lValue: Integer): HRESULT; stdcall;
    function get_MinBitrate(out plValue: Integer): HRESULT; stdcall;
    function put_MinBitrate(lValue: Integer): HRESULT; stdcall;
  end;

Profils et niveaux H.264

Profils

Les profils H.264 définissent les fonctionnalités et capacités disponibles pour l'encodage :

Profil 66 — Baseline Profile : - Complexité la plus basse, meilleure compatibilité décodeur - Pas d'images B, pas de codage entropique CABAC - Utilisé pour : visioconférence, appareils mobiles, streaming web - Compatibilité : tous les décodeurs H.264

Profil 77 — Main Profile : - Complexité moyenne, bonne compression - Prend en charge les images B et le codage entropique CABAC - Utilisé pour : diffusion en définition standard, services de streaming - Meilleure compression que Baseline

Profil 100 — High Profile : - Qualité la plus élevée, meilleure compression - Fonctionnalités avancées dont les transformées 8x8 - Utilisé pour : Blu-ray, diffusion HDTV, streaming haute qualité - Recommandé pour la plupart des applications professionnelles

Profil 110 — High 10 Profile : - Prise en charge de la profondeur de couleur 10 bits - Utilisé pour : production professionnelle, contenu HDR

Profil 122 — High 4:2:2 Profile : - Sous-échantillonnage chroma 4:2:2 - Utilisé pour : montage professionnel, production broadcast

Niveaux

Les niveaux H.264 contraignent la résolution maximale, la fréquence d'images et le débit :

Niveau Résolution max Fréquence max Débit max Cas d'usage typique
1.0 (10) 176x144 15 fps 64 Kbps Mobile, faible résolution
3.0 (30) 720x576 30 fps 10 Mbps Diffusion SD
3.1 (31) 1280x720 30 fps 14 Mbps HD 720p
4.0 (40) 1920x1080 30 fps 20 Mbps HD 1080p
4.1 (41) 1920x1080 30 fps 50 Mbps 1080p débit élevé
5.0 (50) 2560x1920 30 fps 135 Mbps 2K, professionnel
5.1 (51) 4096x2304 30 fps 240 Mbps 4K UHD
5.2 (52) 4096x2304 60 fps 480 Mbps 4K UHD 60 fps

Sélection automatique : définir le niveau à 0 pour une sélection automatique selon la résolution et la fréquence d'images.

Modes de contrôle de débit

Débit binaire constant (CBR) — mode 0

Caractéristiques : - Maintient un débit constant tout au long de l'encodage - Taille de fichier et utilisation de bande passante prévisibles - La qualité varie selon la complexité de la scène

Cas d'usage : - Diffusion en direct (RTMP, HLS, DASH) - Visioconférence - Transmission de diffusion - Scénarios à contrainte de bande passante

Configuration :

h264Encoder.put_RateControl(0);  // Mode CBR
h264Encoder.put_Bitrate(5000000); // 5 Mbps fixe

Débit binaire variable (VBR) — mode 1

Caractéristiques : - Alloue plus de bits aux scènes complexes, moins aux scènes simples - Meilleure qualité globale pour un même débit moyen - Taille et débit fluctuent

Cas d'usage : - Encodage basé sur fichier pour stockage - Contenu VOD (Video On Demand) - Archivage et distribution - Quand la qualité est plus importante que la bande passante constante

Configuration :

h264Encoder.put_RateControl(1);     // Mode VBR
h264Encoder.put_Bitrate(5000000);   // Cible 5 Mbps
h264Encoder.put_MinBitrate(3000000); // Minimum 3 Mbps
h264Encoder.put_MaxBitrate(8000000); // Maximum 8 Mbps

Référence des méthodes

Configuration du débit binaire

get_Bitrate / put_Bitrate

Obtient ou définit le débit binaire cible pour l'encodage en bits par seconde.

Valeurs typiques : - 360p (SD) : 500 000 - 1 500 000 bps (0,5-1,5 Mbps) - 720p (HD) : 2 500 000 - 5 000 000 bps (2,5-5 Mbps) - 1080p (Full HD) : 5 000 000 - 15 000 000 bps (5-15 Mbps) - 4K (UHD) : 20 000 000 - 50 000 000 bps (20-50 Mbps)

Exemple :

h264Encoder.put_Bitrate(5000000); // 5 Mbps pour 1080p

get_MaxBitrate / put_MaxBitrate

Obtient ou définit le débit maximal pour l'encodage VBR. Applicable uniquement lorsque le contrôle de débit est défini sur VBR (mode 1).

Recommandation : définir MaxBitrate à 1,5-2 fois le débit cible pour l'encodage VBR.

get_MinBitrate / put_MinBitrate

Obtient ou définit le débit minimal pour l'encodage VBR. Applicable uniquement en mode VBR.

Recommandation : définir MinBitrate à 0,5-0,7 fois le débit cible pour l'encodage VBR.

Méthodes de contrôle de débit

get_RateControl / put_RateControl

Obtient ou définit le mode de contrôle de débit : - 0 : débit binaire constant (CBR) - 1 : débit binaire variable (VBR)

get_AutoBitrate / put_AutoBitrate

Active ou désactive l'ajustement automatique du débit selon la complexité du contenu.

Lorsqu'il est activé : l'encodeur ajuste automatiquement le débit dans les contraintes configurées selon la complexité de la scène, le mouvement et le détail.

Recommandé : activer pour le mode VBR, désactiver pour le mode CBR.

Configuration des profils et niveaux

get_Profile / put_Profile

Obtient ou définit le profil H.264 : - 66 : Baseline Profile - 77 : Main Profile - 100 : High Profile - 110 : High 10 Profile - 122 : High 4:2:2 Profile

Recommandation : utilisez High Profile (100) pour la plupart des applications. Utilisez Baseline (66) uniquement pour une compatibilité maximale avec d'anciens appareils.

get_Level / put_Level

Obtient ou définit le niveau H.264 (10 = Level 1.0, 11 = Level 1.1, ..., 51 = Level 5.1, 52 = Level 5.2).

Sélection automatique : mettre à 0 pour une sélection automatique selon la résolution et la fréquence d'images.

Configuration du GOP (Group of Pictures)

get_GOP / put_GOP

Active ou désactive la structure GOP : - true : GOP normal avec images I/P/B - false : toutes images I (encodage intra uniquement)

Mode toutes images I : - Débit plus élevé requis - Meilleure capacité de montage (chaque image est une image-clé) - Pas de compression temporelle - À utiliser pour : flux de production/montage

Mode GOP normal (recommandé) : - Compression efficace avec structure d'images I/P/B - Débit plus faible pour une même qualité - À utiliser pour : distribution, streaming, archivage

Configuration des intervalles de slices

get_SliceIntervals / put_SliceIntervals

Obtient ou définit les intervalles de slices pour les images IDR (Instantaneous Decoder Refresh) et P.

Paramètres : - piIDR : intervalle d'images IDR (image-clé toutes les N images) - piP : intervalle d'images P

Valeurs typiques : - Streaming (faible latence) : IDR=30-60 (1-2 secondes à 30 fps), P=1 - Encodage standard : IDR=120-300 (4-10 secondes), P=1-3 - Vidéo longue durée : IDR=300+ (10+ secondes), P=3

Intervalle d'image IDR : - Valeurs faibles (30-60) : meilleure navigation, surcharge de débit plus élevée, récupération d'erreurs plus rapide - Valeurs élevées (240-600) : surcharge de débit plus faible, navigation plus lente, récupération d'erreurs plus lente

Exemple :

int idr = 120;  // Image-cle toutes les 120 images (4 secondes a 30 fps)
int p = 1;      // Image P toutes les images
h264Encoder.put_SliceIntervals(ref idr, ref p);

Configuration avancée

get_Usage / put_Usage

Définit le mode d'usage d'encodage (compromis qualité/vitesse) : - 0 : mode qualité — encodage plus lent, meilleure qualité - 1 : mode équilibré — bonne qualité, vitesse raisonnable - 2 : mode vitesse — encodage rapide, qualité inférieure

Recommandation : - Utilisez le mode qualité (0) pour l'encodage basé sur fichier - Utilisez le mode équilibré (1) pour la plupart des applications temps réel - Utilisez le mode vitesse (2) uniquement quand les performances d'encodage sont critiques

get_MbEncoding / put_MbEncoding

Configure le mode d'encodage de macroblocs, affectant la complexité d'encodage et l'efficacité de compression.

Remarque : les valeurs spécifiques dépendent de l'encodeur. Consultez la documentation de l'encodeur pour les modes pris en charge.

get_SequentialTiming / put_SequentialTiming

Configure le mode de timing séquentiel pour le traitement des images.

Remarque : spécifique à l'implémentation. Affecte l'ordre des images et le timing de présentation.

Exemples d'utilisation

Exemple C# — encodage 1080p haute qualité

using System;
using DirectShowLib;
using VisioForge.DirectShowAPI;

public class H264HighQualityEncoder
{
    public void ConfigureHighQuality1080p(IBaseFilter videoEncoder)
    {
        // Interroger l'interface de l'encodeur H.264
        var h264Encoder = videoEncoder as IH264Encoder;
        if (h264Encoder == null)
        {
            Console.WriteLine("Error: Filter does not support IH264Encoder");
            return;
        }

        // Parametres haute qualite 1080p
        h264Encoder.put_Profile(100);           // High Profile
        h264Encoder.put_Level(41);              // Level 4.1 (1080p @ 30 fps)
        h264Encoder.put_RateControl(1);         // Mode VBR
        h264Encoder.put_Bitrate(10000000);      // Cible 10 Mbps
        h264Encoder.put_MinBitrate(6000000);    // Minimum 6 Mbps
        h264Encoder.put_MaxBitrate(15000000);   // Maximum 15 Mbps
        h264Encoder.put_Usage(0);               // Mode qualite
        h264Encoder.put_GOP(true);              // Activer la structure GOP
        h264Encoder.put_AutoBitrate(true);      // Ajustement de debit auto

        // Definir l'intervalle d'image-cle : 120 images (4 secondes a 30 fps)
        int idr = 120;
        int p = 1;
        h264Encoder.put_SliceIntervals(ref idr, ref p);

        Console.WriteLine("H.264 encoder configured for high-quality 1080p:");
        h264Encoder.get_Bitrate(out int bitrate);
        h264Encoder.get_Profile(out int profile);
        h264Encoder.get_Level(out int level);
        Console.WriteLine($"  Bitrate: {bitrate / 1000000.0:F1} Mbps");
        Console.WriteLine($"  Profile: {profile} (High)");
        Console.WriteLine($"  Level: {level / 10.0:F1}");
    }
}

Exemple C# — configuration streaming en direct

public class H264LiveStreamingEncoder
{
    public void ConfigureLiveStreaming720p(IBaseFilter videoEncoder)
    {
        var h264Encoder = videoEncoder as IH264Encoder;
        if (h264Encoder == null)
            return;

        // Parametres streaming en direct 720p
        h264Encoder.put_Profile(77);            // Main Profile (bonne compatibilite)
        h264Encoder.put_Level(31);              // Level 3.1 (720p @ 30 fps)
        h264Encoder.put_RateControl(0);         // Mode CBR pour streaming
        h264Encoder.put_Bitrate(3500000);       // 3.5 Mbps constant
        h264Encoder.put_Usage(1);               // Mode equilibre
        h264Encoder.put_GOP(true);              // Activer GOP
        h264Encoder.put_AutoBitrate(false);     // Debit fixe pour streaming

        // Faible latence : image-cle toutes les 2 secondes
        int idr = 60;  // 2 secondes a 30 fps
        int p = 1;
        h264Encoder.put_SliceIntervals(ref idr, ref p);

        Console.WriteLine("H.264 encoder configured for live streaming");
        Console.WriteLine("  720p @ 3.5 Mbps CBR");
        Console.WriteLine("  Keyframe interval: 2 seconds");
    }
}

Exemple C# — encodage rapide pour enregistrement

public class H264FastRecording
{
    public void ConfigureFastRecording(IBaseFilter videoEncoder)
    {
        var h264Encoder = videoEncoder as IH264Encoder;
        if (h264Encoder == null)
            return;

        // Parametres d'enregistrement rapide
        h264Encoder.put_Profile(66);            // Baseline (encodage le plus rapide)
        h264Encoder.put_Level(40);              // Level 4.0 (1080p @ 30 fps)
        h264Encoder.put_RateControl(0);         // Mode CBR
        h264Encoder.put_Bitrate(8000000);       // 8 Mbps
        h264Encoder.put_Usage(2);               // Mode vitesse (encodage rapide)
        h264Encoder.put_GOP(true);              // Activer GOP
        h264Encoder.put_AutoBitrate(false);     // Debit fixe

        // Intervalle d'image-cle plus long pour un encodage plus rapide
        int idr = 300;  // 10 secondes a 30 fps
        int p = 1;
        h264Encoder.put_SliceIntervals(ref idr, ref p);

        Console.WriteLine("H.264 encoder configured for fast recording");
    }
}

Exemple C++ — configuration haute qualité

#include <dshow.h>
#include <iostream>
#include "IH264Encoder.h"

void ConfigureH264HighQuality(IBaseFilter* pVideoEncoder)
{
    IH264Encoder* pH264Encoder = NULL;
    HRESULT hr = S_OK;

    // Interroger l'interface de l'encodeur H.264
    hr = pVideoEncoder->QueryInterface(IID_IH264Encoder,
                                       (void**)&pH264Encoder);
    if (FAILED(hr) || !pH264Encoder)
    {
        std::cout << "Error: Filter does not support IH264Encoder" << std::endl;
        return;
    }

    // Configurer l'encodage haute qualite 1080p
    pH264Encoder->put_Profile(100);           // High Profile
    pH264Encoder->put_Level(41);              // Level 4.1
    pH264Encoder->put_RateControl(1);         // Mode VBR
    pH264Encoder->put_Bitrate(10000000);      // 10 Mbps
    pH264Encoder->put_MinBitrate(6000000);    // Min 6 Mbps
    pH264Encoder->put_MaxBitrate(15000000);   // Max 15 Mbps
    pH264Encoder->put_Usage(0);               // Mode qualite
    pH264Encoder->put_GOP(TRUE);              // Activer GOP
    pH264Encoder->put_AutoBitrate(TRUE);      // Debit auto

    // Definir l'intervalle d'image-cle
    int idr = 120;
    int p = 1;
    pH264Encoder->put_SliceIntervals(&idr, &p);

    // Afficher la configuration
    long bitrate;
    pH264Encoder->get_Bitrate(&bitrate);
    std::cout << "H.264 encoder configured:" << std::endl;
    std::cout << "  Bitrate: " << (bitrate / 1000000.0) << " Mbps" << std::endl;

    pH264Encoder->Release();
}

Exemple C++ — streaming en direct

void ConfigureH264LiveStreaming(IBaseFilter* pVideoEncoder)
{
    IH264Encoder* pH264Encoder = NULL;
    HRESULT hr = pVideoEncoder->QueryInterface(IID_IH264Encoder,
                                               (void**)&pH264Encoder);
    if (SUCCEEDED(hr) && pH264Encoder)
    {
        // Configuration streaming en direct
        pH264Encoder->put_Profile(77);          // Main Profile
        pH264Encoder->put_Level(31);            // Level 3.1 (720p)
        pH264Encoder->put_RateControl(0);       // CBR pour streaming
        pH264Encoder->put_Bitrate(3500000);     // 3.5 Mbps
        pH264Encoder->put_Usage(1);             // Mode equilibre
        pH264Encoder->put_GOP(TRUE);            // Activer GOP
        pH264Encoder->put_AutoBitrate(FALSE);   // Debit fixe

        // Images-cles a faible latence
        int idr = 60;  // 2 secondes
        int p = 1;
        pH264Encoder->put_SliceIntervals(&idr, &p);

        std::cout << "H.264 live streaming configured" << std::endl;
        pH264Encoder->Release();
    }
}

Exemple Delphi — encodage haute qualité

uses
  DirectShow9, ActiveX;

procedure ConfigureH264HighQuality(VideoEncoder: IBaseFilter);
var
  H264Encoder: IH264Encoder;
  IDR, P: Integer;
  Bitrate: Integer;
  hr: HRESULT;
begin
  // Interroger l'interface de l'encodeur H.264
  hr := VideoEncoder.QueryInterface(IID_IH264Encoder, H264Encoder);
  if Failed(hr) or (H264Encoder = nil) then
  begin
    WriteLn('Error: Filter does not support IH264Encoder');
    Exit;
  end;

  try
    // Configurer l'encodage haute qualite 1080p
    H264Encoder.put_Profile(100);           // High Profile
    H264Encoder.put_Level(41);              // Level 4.1
    H264Encoder.put_RateControl(1);         // Mode VBR
    H264Encoder.put_Bitrate(10000000);      // 10 Mbps
    H264Encoder.put_MinBitrate(6000000);    // Minimum 6 Mbps
    H264Encoder.put_MaxBitrate(15000000);   // Maximum 15 Mbps
    H264Encoder.put_Usage(0);               // Mode qualite
    H264Encoder.put_GOP(True);              // Activer GOP
    H264Encoder.put_AutoBitrate(True);      // Debit auto

    // Definir l'intervalle d'image-cle
    IDR := 120;
    P := 1;
    H264Encoder.put_SliceIntervals(IDR, P);

    // Afficher la configuration
    H264Encoder.get_Bitrate(Bitrate);
    WriteLn('H.264 encoder configured for high quality:');
    WriteLn('  Bitrate: ', Bitrate / 1000000:0:1, ' Mbps');
  finally
    H264Encoder := nil;
  end;
end;

Exemple Delphi — streaming en direct

procedure ConfigureH264LiveStreaming(VideoEncoder: IBaseFilter);
var
  H264Encoder: IH264Encoder;
  IDR, P: Integer;
begin
  if Succeeded(VideoEncoder.QueryInterface(IID_IH264Encoder, H264Encoder)) then
  begin
    try
      // Configuration streaming en direct
      H264Encoder.put_Profile(77);          // Main Profile
      H264Encoder.put_Level(31);            // Level 3.1 (720p)
      H264Encoder.put_RateControl(0);       // Mode CBR
      H264Encoder.put_Bitrate(3500000);     // 3.5 Mbps
      H264Encoder.put_Usage(1);             // Mode equilibre
      H264Encoder.put_GOP(True);            // Activer GOP
      H264Encoder.put_AutoBitrate(False);   // Debit fixe

      // Images-cles a faible latence
      IDR := 60;  // 2 secondes a 30 fps
      P := 1;
      H264Encoder.put_SliceIntervals(IDR, P);

      WriteLn('H.264 live streaming configured');
    finally
      H264Encoder := nil;
    end;
  end;
end;

Bonnes pratiques

Directives de sélection du débit binaire

Recommandations par résolution :

Résolution CBR (streaming) Cible VBR Min-Max VBR
360p (SD) 0,8 Mbps 1 Mbps 0,5 - 1,5 Mbps
480p (SD) 1,5 Mbps 2 Mbps 1 - 3 Mbps
720p (HD) 3 Mbps 4 Mbps 2,5 - 6 Mbps
1080p (Full HD) 6 Mbps 8 Mbps 5 - 12 Mbps
1440p (2K) 12 Mbps 16 Mbps 10 - 24 Mbps
2160p (4K UHD) 25 Mbps 35 Mbps 20 - 50 Mbps

Ajustements selon le type de contenu : - Faible mouvement (présentations, plan tête-épaules) : 60-70 % du débit recommandé - Mouvement moyen (vidéo standard) : débit recommandé - Mouvement élevé (sports, action) : 120-150 % du débit recommandé

Choix du profil

Utilisez Baseline Profile (66) lorsque : - Une compatibilité maximale avec les appareils est requise - Vous ciblez d'anciens appareils mobiles ou navigateurs web - Les performances d'encodage en temps réel sont critiques

Utilisez Main Profile (77) lorsque : - Un bon équilibre entre qualité et compatibilité est nécessaire - Vous diffusez en direct vers des publics mixtes - Applications de diffusion standard

Utilisez High Profile (100) lorsque (recommandé) : - La meilleure qualité est requise - La compatibilité avec les appareils modernes est acceptable (appareils post-2010) - Encodage basé sur fichier pour la distribution - La plupart des scénarios de production

Recommandations de structure GOP

Applications de streaming : - Intervalle IDR : 60-120 images (2-4 secondes à 30 fps) - Intervalles plus courts : meilleure navigation, récupération d'erreurs plus rapide, débit légèrement plus élevé - Intervalles plus longs : surcharge de débit plus faible, mais navigation plus lente

Encodage basé sur fichier : - Intervalle IDR : 240-300 images (8-10 secondes à 30 fps) - Équilibre entre taille de fichier et capacité de navigation

Applications à faible latence (visioconférence) : - Intervalle IDR : 30-60 images (1-2 secondes à 30 fps) - Les intervalles courts réduisent le décalage dû aux images perdues

Encodage tout-intra (flux de montage) : - Désactivez GOP (put_GOP(false)) - Chaque image est une image-clé - Débit plus élevé requis (typiquement 3-5x l'encodage normal) - Montage parfait à l'image près

Choix du mode d'usage

Mode qualité (0) : - Encodage le plus lent, meilleure qualité - À utiliser pour : encodage basé sur fichier, archivage, contenu VOD - Non adapté à l'encodage en temps réel sur du matériel plus lent

Mode équilibré (1) (recommandé) : - Bonne qualité, performances raisonnables - À utiliser pour : la plupart des applications temps réel, streaming en direct - Meilleur choix pour l'encodage généraliste

Mode vitesse (2) : - Encodage le plus rapide, qualité inférieure - À utiliser pour : encodage temps réel haute résolution sur matériel limité - Enregistrement d'écran, applications de surveillance

Dépannage

Qualité vidéo faible

Symptômes : artefacts en blocs, flou, perte de détails

Causes possibles : 1. Débit trop faible pour la résolution 2. Mauvais choix de profil 3. Intervalle GOP trop long 4. Mode d'usage défini sur Vitesse au lieu de Qualité

Solutions : - Augmentez le débit aux niveaux recommandés (voir tableau ci-dessus) - Passez à High Profile (100) pour une meilleure compression - Raccourcissez l'intervalle IDR à 120-180 images - Utilisez le mode Équilibré (1) ou Qualité (0) - Pour VBR, augmentez le débit minimal

Encodage trop lent / ne peut pas suivre

Symptômes : images perdues, encodage plus lent que le temps réel

Solutions : 1. Passez à Baseline Profile (66) pour un encodage plus rapide 2. Définissez le mode d'usage sur Vitesse (2) 3. Réduisez le débit pour diminuer les besoins de calcul 4. Augmentez l'intervalle IDR (GOP plus long = moins de traitement) 5. Envisagez un encodeur matériel (NVENC, QuickSync) à la place

Fichiers volumineux

Symptômes : fichiers plus volumineux que prévu

Causes possibles : 1. Débit trop élevé pour la qualité cible 2. Mode CBR avec paramètre de débit conservateur 3. GOP désactivé (toutes images I) 4. Mauvais paramètre de niveau

Solutions : - Passez de CBR à VBR pour du contenu variable - Activez la structure GOP (put_GOP(true)) - Réduisez le débit cible - Ajustez la plage de débit min/max pour VBR - Utilisez High Profile (100) pour une meilleure compression

Problèmes de compatibilité de streaming

Symptômes : la vidéo se lit sur certains appareils mais pas d'autres

Causes possibles : 1. Profil trop avancé (High Profile non pris en charge sur d'anciens appareils) 2. Niveau trop élevé pour les capacités de l'appareil 3. Configuration de slices incorrecte

Solutions : - Utilisez Main Profile (77) ou Baseline Profile (66) pour une compatibilité maximale - Définissez le niveau à 0 pour une sélection automatique - Testez sur les appareils cibles - Vérifiez les capacités H.264 du lecteur/appareil

Problèmes de navigation / défilement lent

Symptômes : navigation lente ou imprécise dans la vidéo encodée

Cause : intervalle IDR trop long (images-clés trop éloignées)

Solutions : - Réduisez l'intervalle IDR à 60-120 images (2-4 secondes) - Pour les flux de montage, envisagez l'encodage tout-intra (put_GOP(false)) - Des intervalles IDR plus courts améliorent la navigation au prix d'un débit légèrement plus élevé


Voir aussi