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¶
- Interface de l'encodeur NVENC — encodage matériel NVIDIA H.264/HEVC
- Référence des codecs vidéo
- Présentation du pack de filtres d'encodage
- Interface du multiplexeur MP4