Saltar a contenido

Referencia de la Interfaz del Codificador FFMPEG

Descripción General

La interfaz IVFFFMPEGEncoder proporciona una configuración completa para codificar video y audio en varios formatos utilizando la biblioteca FFMPEG. Este potente codificador admite múltiples formatos de salida, incluidos Flash Video (FLV), MPEG-1, MPEG-2, VCD, SVCD, DVD y MPEG-2 Transport Stream.

El codificador utiliza un enfoque de configuración basado en estructuras donde todos los parámetros de codificación se establecen a la vez, proporcionando una interfaz simple pero completa para la codificación de video profesional a formatos heredados y de transmisión.

GUID de la Interfaz: {17B8FF7D-A67F-45CE-B425-0E4F607D8C60}

CLSID del Filtro: {554AB365-B293-4C1D-9245-E8DB01F027F7}

Hereda de: IUnknown

GUIDs del Filtro y la Interfaz

// CLSID del Filtro Codificador FFMPEG
public static readonly Guid CLSID_FFMPEGEncoder =
    new Guid("554AB365-B293-4C1D-9245-E8DB01F027F7");

// IID de la Interfaz IVFFFMPEGEncoder
public static readonly Guid IID_IVFFFMPEGEncoder =
    new Guid("17B8FF7D-A67F-45CE-B425-0E4F607D8C60");

Formatos de Salida

Enumeración VFFFMPEGDLLOutputFormat

/// <summary>
/// Opciones de formato de salida del codificador FFMPEG.
/// </summary>
public enum VFFFMPEGDLLOutputFormat
{
    /// <summary>
    /// Flash Video (.flv) - Formato de transmisión web
    /// </summary>
    FLV = 0,

    /// <summary>
    /// MPEG-1 (.mpg) - Video MPEG-1 estándar
    /// </summary>
    MPEG1 = 1,

    /// <summary>
    /// MPEG-1 VCD - Formato compatible con Video CD
    /// Resolución: 352x240 (NTSC) o 352x288 (PAL)
    /// Tasa de bits: 1150 kbps
    /// </summary>
    MPEG1VCD = 2,

    /// <summary>
    /// MPEG-2 (.mpg) - Video MPEG-2 estándar
    /// </summary>
    MPEG2 = 3,

    /// <summary>
    /// MPEG-2 Transport Stream (.ts) - Radiodifusión y transmisión
    /// </summary>
    MPEG2TS = 4,

    /// <summary>
    /// MPEG-2 SVCD - Formato compatible con Super Video CD
    /// Resolución: 480x480 (NTSC) o 480x576 (PAL)
    /// Tasa de bits: 2500 kbps
    /// </summary>
    MPEG2SVCD = 5,

    /// <summary>
    /// MPEG-2 DVD - Formato compatible con DVD-Video
    /// Resolución: 720x480 (NTSC) o 720x576 (PAL)
    /// Tasa de bits: Hasta 9800 kbps
    /// </summary>
    MPEG2DVD = 6
}

Estándares del Sistema de TV

/// <summary>
/// Estándares del sistema de televisión para codificación de video.
/// </summary>
public enum VFFFMPEGDLLTVSystem
{
    /// <summary>
    /// Sin sistema de TV específico / Detección automática
    /// </summary>
    None = 0,

    /// <summary>
    /// PAL (Phase Alternating Line)
    /// 25 fps, 576 líneas
    /// Utilizado en: Europa, Asia, Australia, África
    /// </summary>
    PAL = 1,

    /// <summary>
    /// NTSC (National Television System Committee)
    /// 29.97 fps, 480 líneas
    /// Utilizado en: América del Norte, Japón, Corea del Sur
    /// </summary>
    NTSC = 2,

    /// <summary>
    /// Estándar de cine
    /// 24 fps
    /// Utilizado para: Cine, transferencias de películas
    /// </summary>
    Film = 3
}

Estructura FFMPEGOutputSettings

/// <summary>
/// Configuración completa para el codificador FFMPEG.
/// Contiene todos los ajustes de audio, video y formato de salida.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct FFMPEGOutputSettings
{
    /// <summary>
    /// Nombre del archivo de salida con ruta.
    /// </summary>
    [MarshalAs(UnmanagedType.LPWStr)]
    public string Filename;

    /// <summary>
    /// Verdadero si el flujo de audio está incluido en la salida.
    /// </summary>
    [MarshalAs(UnmanagedType.Bool)]
    public bool AudioAvailable;

    /// <summary>
    /// Tasa de bits de audio en bits por segundo (por ejemplo, 128000 para 128 kbps).
    /// </summary>
    public int AudioBitrate;

    /// <summary>
    /// Frecuencia de muestreo de audio en Hz (por ejemplo, 44100, 48000).
    /// </summary>
    public int AudioSamplerate;

    /// <summary>
    /// Número de canales de audio (1 = mono, 2 = estéreo).
    /// </summary>
    public int AudioChannels;

    /// <summary>
    /// Ancho del cuadro de video en píxeles.
    /// </summary>
    public int VideoWidth;

    /// <summary>
    /// Alto del cuadro de video en píxeles.
    /// </summary>
    public int VideoHeight;

    /// <summary>
    /// Ancho de la relación de aspecto de visualización (por ejemplo, 16 para 16:9).
    /// </summary>
    public int AspectRatioW;

    /// <summary>
    /// Alto de la relación de aspecto de visualización (por ejemplo, 9 para 16:9).
    /// </summary>
    public int AspectRatioH;

    /// <summary>
    /// Tasa de bits de video en bits por segundo (por ejemplo, 5000000 para 5 Mbps).
    /// </summary>
    public int VideoBitrate;

    /// <summary>
    /// Tasa de bits de video máxima para codificación VBR (bits por segundo).
    /// </summary>
    public int VideoMaxRate;

    /// <summary>
    /// Tasa de bits de video mínima para codificación VBR (bits por segundo).
    /// </summary>
    public int VideoMinRate;

    /// <summary>
    /// Tamaño del búfer de video en bits (afecta la latencia y la fluidez).
    /// </summary>
    public int VideoBufferSize;

    /// <summary>
    /// Verdadero para habilitar la codificación entrelazada (para TV de radiodifusión).
    /// </summary>
    [MarshalAs(UnmanagedType.Bool)]
    public bool Interlace;

    /// <summary>
    /// Tamaño del GOP (Grupo de Imágenes) - intervalo de fotogramas clave.
    /// Típico: 12-15 para MPEG-2, 30-60 para video web.
    /// </summary>
    public int VideoGopSize;

    /// <summary>
    /// Estándar del sistema de TV (PAL, NTSC, Film o None).
    /// </summary>
    [MarshalAs(UnmanagedType.I4)]
    public VFFFMPEGDLLTVSystem TVSystem;

    /// <summary>
    /// Formato de salida (FLV, MPEG-1, MPEG-2, etc.).
    /// </summary>
    [MarshalAs(UnmanagedType.I4)]
    public VFFFMPEGDLLOutputFormat OutputFormat;
}

Definiciones de Interfaz

Definición en C

using System;
using System.Runtime.InteropServices;

namespace VisioForge.DirectShowAPI
{
    /// <summary>
    /// Interfaz de configuración del codificador FFMPEG.
    /// Proporciona codificación completa a múltiples formatos utilizando la biblioteca FFMPEG.
    /// </summary>
    [ComImport]
    [Guid("17B8FF7D-A67F-45CE-B425-0E4F607D8C60")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IVFFFMPEGEncoder
    {
        /// <summary>
        /// Establece la configuración completa del codificador FFMPEG.
        /// Todos los parámetros de codificación deben establecerse a la vez a través de esta estructura.
        /// </summary>
        /// <param name="settings">Estructura completa de configuración del codificador</param>
        [PreserveSig]
        void set_settings([In] FFMPEGOutputSettings settings);
    }
}

Definición en C++

#include <unknwn.h>

// {17B8FF7D-A67F-45CE-B425-0E4F607D8C60}
DEFINE_GUID(IID_IVFFFMPEGEncoder,
    0x17b8ff7d, 0xa67f, 0x45ce, 0xb4, 0x25, 0xe, 0x4f, 0x60, 0x7d, 0x8c, 0x60);

// {554AB365-B293-4C1D-9245-E8DB01F027F7}
DEFINE_GUID(CLSID_FFMPEGEncoder,
    0x554ab365, 0xb293, 0x4c1d, 0x92, 0x45, 0xe8, 0xdb, 0x01, 0xf0, 0x27, 0xf7);

/// <summary>
/// Enumeración de formato de salida.
/// </summary>
enum FFOutputFormat
{
    of_FLV = 0,
    of_MPEG1 = 1,
    of_MPEG1VCD = 2,
    of_MPEG2 = 3,
    of_MPEG2TS = 4,
    of_MPEG2SVCD = 5,
    of_MPEG2DVD = 6
};

/// <summary>
/// Enumeración del sistema de TV.
/// </summary>
enum video_tv_system_t
{
    video_norm_unknown = 0,
    video_norm_pal = 1,
    video_norm_ntsc = 2,
    video_norm_film = 3
};

/// <summary>
/// Estructura de configuración de salida del codificador FFMPEG.
/// </summary>
struct CVFOutputSettings
{
    wchar_t* filename;

    BOOL audioAvailable;
    int audioBitrate;
    int audioSamplerate;
    int audioChannels;

    int videoWidth;
    int videoHeight;
    int aspectRatioW;
    int aspectRatioH;
    int videoBitrate;
    int videoMaxRate;
    int videoMinRate;
    int videoBufferSize;
    BOOL interlace;
    int videoGopSize;
    int tvSystem;

    int outputFormat;
};

/// <summary>
/// Interfaz de configuración del codificador FFMPEG.
/// </summary>
DECLARE_INTERFACE_(IVFFFMPEGEncoder, IUnknown)
{
    /// <summary>
    /// Establece la configuración completa del codificador FFMPEG.
    /// </summary>
    /// <param name="settings">Estructura completa de configuración del codificador</param>
    STDMETHOD(set_settings)(THIS_
        CVFOutputSettings settings
        ) PURE;
};

Definición en Delphi

uses
  ActiveX, ComObj;

const
  IID_IVFFFMPEGEncoder: TGUID = '{17B8FF7D-A67F-45CE-B425-0E4F607D8C60}';
  CLSID_FFMPEGEncoder: TGUID = '{554AB365-B293-4C1D-9245-E8DB01F027F7}';

type
  /// <summary>
  /// Enumeración de formato de salida FFMPEG.
  /// </summary>
  TVFFFMPEGDLLOutputFormat = (
    FLV,
    MPEG1,
    MPEG1VCD,
    MPEG2,
    MPEG2TS,
    MPEG2SVCD,
    MPEG2DVD
  );

  /// <summary>
  /// Enumeración del sistema de TV.
  /// </summary>
  TVFFFMPEGDLLTVSystem = (
    None,
    PAL,
    NTSC,
    Film
  );

  /// <summary>
  /// Estructura de configuración de salida del codificador FFMPEG.
  /// </summary>
  TFFMPEGOutputSettings = record
    Filename: PWideChar;
    AudioAvailable: BOOL;
    AudioBitrate: Integer;
    AudioSamplerate: Integer;
    AudioChannels: Integer;
    VideoWidth: Integer;
    VideoHeight: Integer;
    AspectRatioW: Integer;
    AspectRatioH: Integer;
    VideoBitrate: Integer;
    VideoMaxRate: Integer;
    VideoMinRate: Integer;
    VideoBufferSize: Integer;
    Interlace: BOOL;
    VideoGopSize: Integer;
    TVSystem: Integer;
    OutputFormat: Integer;
  end;

  /// <summary>
  /// Interfaz de configuración del codificador FFMPEG.
  /// </summary>
  IVFFFMPEGEncoder = interface(IUnknown)
    ['{17B8FF7D-A67F-45CE-B425-0E4F607D8C60}']

    /// <summary>
    /// Establece la configuración completa del codificador FFMPEG.
    /// </summary>
    procedure set_settings(const settings: TFFMPEGOutputSettings); stdcall;
  end;

Especificaciones de Formato de Salida

FLV (Flash Video)

Formato: Adobe Flash Video (.flv) Casos de Uso: Transmisión web, contenido Flash heredado Configuración Típica: - Resolución: 640x480, 854x480, 1280x720 - Tasa de bits de video: 500-2500 kbps - Audio: MP3, 64-128 kbps, 44100 Hz - GOP: 30-60 fotogramas

MPEG-1

Formato: Video MPEG-1 (.mpg) Casos de Uso: Video básico, sistemas heredados, web Configuración Típica: - Resolución: 352x240 (NTSC), 352x288 (PAL) - Tasa de bits de video: 1150 kbps - Audio: MPEG Layer 2, 224 kbps, 44100 Hz - GOP: 12-15 fotogramas

MPEG-1 VCD (Video CD)

Formato: MPEG-1 compatible con Video CD (.mpg) Casos de Uso: Autoría de VCD, distribución en disco Configuración Requerida: - Resolución: 352x240 (NTSC), 352x288 (PAL) - Tasa de bits de video: 1150 kbps (fija) - Audio: MPEG Layer 2, 224 kbps, 44100 Hz - GOP: 12 fotogramas (NTSC), 15 fotogramas (PAL) - Sistema de TV: Debe coincidir (NTSC o PAL)

MPEG-2

Formato: Video MPEG-2 (.mpg) Casos de Uso: Autoría de DVD, radiodifusión, alta calidad Configuración Típica: - Resolución: 720x480 (NTSC), 720x576 (PAL) - Tasa de bits de video: 4000-9800 kbps - Audio: MPEG Layer 2 o AC-3, 192-448 kbps - GOP: 12-15 fotogramas

MPEG-2 TS (Transport Stream)

Formato: MPEG-2 Transport Stream (.ts) Casos de Uso: Radiodifusión, transmisión, Blu-ray Configuración Típica: - Resolución: 720x480, 1280x720, 1920x1080 - Tasa de bits de video: 3000-15000 kbps - Audio: MPEG Layer 2 o AC-3 - GOP: 12-30 fotogramas - Mejor resistencia a errores que MPEG-2 PS

MPEG-2 SVCD (Super Video CD)

Formato: MPEG-2 compatible con Super Video CD (.mpg) Casos de Uso: Autoría de SVCD, distribución en disco Configuración Requerida: - Resolución: 480x480 (NTSC), 480x576 (PAL) - Tasa de bits de video: 2500 kbps (típica) - Audio: MPEG Layer 2, 224 kbps, 44100 Hz - GOP: 12-15 fotogramas - Sistema de TV: Debe coincidir (NTSC o PAL)

MPEG-2 DVD (DVD-Video)

Formato: MPEG-2 compatible con DVD-Video (.mpg) Casos de Uso: Autoría de DVD, distribución profesional Configuración Requerida: - Resolución: 720x480 (NTSC), 720x576 (PAL) - Tasa de bits de video: 4000-9800 kbps - Audio: AC-3 o PCM, hasta 448 kbps - GOP: 12 fotogramas (NTSC), 15 fotogramas (PAL) - Sistema de TV: Debe coincidir (NTSC o PAL) - Entrelazado: Típicamente habilitado para radiodifusión

Ejemplos de Uso

Ejemplo en C# - MPEG-2 Calidad DVD (NTSC)

using System;
using DirectShowLib;
using VisioForge.DirectShowAPI;

public class FFMPEGDVDEncoder
{
    public void ConfigureDVDNTSC(IBaseFilter ffmpegEncoder)
    {
        // Consultar la interfaz del codificador FFMPEG
        var encoder = ffmpegEncoder as IVFFFMPEGEncoder;
        if (encoder == null)
        {
            Console.WriteLine("Error: El filtro no admite IVFFFMPEGEncoder");
            return;
        }

        // Configurar codificación MPEG-2 compatible con DVD (NTSC)
        var settings = new FFMPEGOutputSettings
        {
            // Archivo de salida
            Filename = "C:\\output\\movie.mpg",

            // Configuración de audio
            AudioAvailable = true,
            AudioBitrate = 224000,      // 224 kbps
            AudioSamplerate = 48000,    // 48 kHz para DVD
            AudioChannels = 2,           // Estéreo

            // Configuración de video - Especificaciones DVD NTSC
            VideoWidth = 720,
            VideoHeight = 480,
            AspectRatioW = 16,
            AspectRatioH = 9,
            VideoBitrate = 6000000,     // 6 Mbps
            VideoMaxRate = 9800000,     // 9.8 Mbps máx para DVD
            VideoMinRate = 0,
            VideoBufferSize = 1835008,  // Búfer DVD estándar
            Interlace = true,           // DVD es entrelazado
            VideoGopSize = 12,          // 12 fotogramas para NTSC

            // Configuración de formato
            TVSystem = VFFFMPEGDLLTVSystem.NTSC,
            OutputFormat = VFFFMPEGDLLOutputFormat.MPEG2DVD
        };

        encoder.set_settings(settings);

        Console.WriteLine("Codificador FFMPEG configurado para DVD NTSC:");
        Console.WriteLine("  Resolución: 720x480 (16:9)");
        Console.WriteLine("  Video: 6 Mbps MPEG-2, entrelazado");
        Console.WriteLine("  Audio: 224 kbps, 48 kHz estéreo");
        Console.WriteLine("  GOP: 12 fotogramas");
    }
}

Ejemplo en C# - Transmisión Web FLV

public class FFMPEGWebStreaming
{
    public void ConfigureFLV(IBaseFilter ffmpegEncoder)
    {
        var encoder = ffmpegEncoder as IVFFFMPEGEncoder;
        if (encoder == null)
            return;

        // Configurar Flash Video para transmisión web
        var settings = new FFMPEGOutputSettings
        {
            Filename = "C:\\output\\video.flv",

            // Configuración de audio
            AudioAvailable = true,
            AudioBitrate = 96000,       // 96 kbps
            AudioSamplerate = 44100,
            AudioChannels = 2,

            // Configuración de video - Transmisión web 720p
            VideoWidth = 1280,
            VideoHeight = 720,
            AspectRatioW = 16,
            AspectRatioH = 9,
            VideoBitrate = 2000000,     // 2 Mbps
            VideoMaxRate = 2500000,     // 2.5 Mbps máx
            VideoMinRate = 1500000,     // 1.5 Mbps mín
            VideoBufferSize = 2000000,
            Interlace = false,          // Progresivo para web
            VideoGopSize = 60,          // 2 segundos a 30fps

            TVSystem = VFFFMPEGDLLTVSystem.None,
            OutputFormat = VFFFMPEGDLLOutputFormat.FLV
        };

        encoder.set_settings(settings);

        Console.WriteLine("Codificador FFMPEG configurado para transmisión web FLV:");
        Console.WriteLine("  720p @ 2 Mbps, progresivo");
    }
}

Ejemplo en C# - MPEG-1 Compatible con VCD (PAL)

public class FFMPEGVCDEncoder
{
    public void ConfigureVCDPAL(IBaseFilter ffmpegEncoder)
    {
        var encoder = ffmpegEncoder as IVFFFMPEGEncoder;
        if (encoder == null)
            return;

        // Configurar MPEG-1 compatible con VCD (PAL)
        var settings = new FFMPEGOutputSettings
        {
            Filename = "C:\\output\\vcd.mpg",

            // Configuración de audio - Especificación VCD
            AudioAvailable = true,
            AudioBitrate = 224000,      // 224 kbps requerido
            AudioSamplerate = 44100,    // 44.1 kHz requerido
            AudioChannels = 2,

            // Configuración de video - Especificaciones VCD PAL
            VideoWidth = 352,
            VideoHeight = 288,          // Resolución PAL
            AspectRatioW = 4,
            AspectRatioH = 3,
            VideoBitrate = 1150000,     // 1150 kbps requerido
            VideoMaxRate = 1150000,
            VideoMinRate = 1150000,
            VideoBufferSize = 327680,   // Tamaño de búfer VCD
            Interlace = false,
            VideoGopSize = 15,          // 15 fotogramas para PAL

            TVSystem = VFFFMPEGDLLTVSystem.PAL,
            OutputFormat = VFFFMPEGDLLOutputFormat.MPEG1VCD
        };

        encoder.set_settings(settings);

        Console.WriteLine("Codificador FFMPEG configurado para VCD PAL:");
        Console.WriteLine("  352x288 @ 1150 kbps");
    }
}

Ejemplo en C# - MPEG-2 Transport Stream

public class FFMPEGMPEG2TS
{
    public void ConfigureMPEG2TS(IBaseFilter ffmpegEncoder)
    {
        var encoder = ffmpegEncoder as IVFFFMPEGEncoder;
        if (encoder == null)
            return;

        // Configurar MPEG-2 Transport Stream para radiodifusión
        var settings = new FFMPEGOutputSettings
        {
            Filename = "C:\\output\\stream.ts",

            // Configuración de audio
            AudioAvailable = true,
            AudioBitrate = 192000,
            AudioSamplerate = 48000,
            AudioChannels = 2,

            // Configuración de video - Radiodifusión HD 1080i
            VideoWidth = 1920,
            VideoHeight = 1080,
            AspectRatioW = 16,
            AspectRatioH = 9,
            VideoBitrate = 12000000,    // 12 Mbps
            VideoMaxRate = 15000000,    // 15 Mbps máx
            VideoMinRate = 8000000,     // 8 Mbps mín
            VideoBufferSize = 8000000,
            Interlace = true,           // Radiodifusión es entrelazada
            VideoGopSize = 15,

            TVSystem = VFFFMPEGDLLTVSystem.NTSC,
            OutputFormat = VFFFMPEGDLLOutputFormat.MPEG2TS
        };

        encoder.set_settings(settings);

        Console.WriteLine("Codificador FFMPEG configurado para MPEG-2 TS:");
        Console.WriteLine("  Flujo de radiodifusión HD 1080i");
    }
}

Ejemplo en C++ - DVD NTSC

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

void ConfigureFFMPEGDVD(IBaseFilter* pFFMPEGEncoder)
{
    IVFFFMPEGEncoder* pEncoder = NULL;
    HRESULT hr = S_OK;

    // Consultar la interfaz del codificador FFMPEG
    hr = pFFMPEGEncoder->QueryInterface(IID_IVFFFMPEGEncoder,
                                        (void**)&pEncoder);
    if (FAILED(hr) || !pEncoder)
    {
        std::cout << "Error: El filtro no admite IVFFFMPEGEncoder" << std::endl;
        return;
    }

    // Configurar codificación MPEG-2 compatible con DVD (NTSC)
    CVFOutputSettings settings;
    ZeroMemory(&settings, sizeof(settings));

    settings.filename = L"C:\\output\\movie.mpg";

    // Configuración de audio
    settings.audioAvailable = TRUE;
    settings.audioBitrate = 224000;
    settings.audioSamplerate = 48000;
    settings.audioChannels = 2;

    // Configuración de video - Especificaciones DVD NTSC
    settings.videoWidth = 720;
    settings.videoHeight = 480;
    settings.aspectRatioW = 16;
    settings.aspectRatioH = 9;
    settings.videoBitrate = 6000000;
    settings.videoMaxRate = 9800000;
    settings.videoMinRate = 0;
    settings.videoBufferSize = 1835008;
    settings.interlace = TRUE;
    settings.videoGopSize = 12;

    settings.tvSystem = video_norm_ntsc;
    settings.outputFormat = of_MPEG2DVD;

    pEncoder->set_settings(settings);

    std::cout << "Codificador FFMPEG configurado para DVD NTSC" << std::endl;

    pEncoder->Release();
}

Ejemplo en C++ - Transmisión Web FLV

void ConfigureFFMPEGFLV(IBaseFilter* pFFMPEGEncoder)
{
    IVFFFMPEGEncoder* pEncoder = NULL;
    HRESULT hr = pFFMPEGEncoder->QueryInterface(IID_IVFFFMPEGEncoder,
                                                (void**)&pEncoder);
    if (SUCCEEDED(hr) && pEncoder)
    {
        CVFOutputSettings settings;
        ZeroMemory(&settings, sizeof(settings));

        settings.filename = L"C:\\output\\video.flv";

        // Configuración de audio
        settings.audioAvailable = TRUE;
        settings.audioBitrate = 96000;
        settings.audioSamplerate = 44100;
        settings.audioChannels = 2;

        // Configuración de video - Web 720p
        settings.videoWidth = 1280;
        settings.videoHeight = 720;
        settings.aspectRatioW = 16;
        settings.aspectRatioH = 9;
        settings.videoBitrate = 2000000;
        settings.videoMaxRate = 2500000;
        settings.videoMinRate = 1500000;
        settings.videoBufferSize = 2000000;
        settings.interlace = FALSE;
        settings.videoGopSize = 60;

        settings.tvSystem = video_norm_unknown;
        settings.outputFormat = of_FLV;

        pEncoder->set_settings(settings);

        std::cout << "Codificador FLV FFMPEG configurado" << std::endl;

        pEncoder->Release();
    }
}

Ejemplo en Delphi - DVD PAL

uses
  DirectShow9, ActiveX;

procedure ConfigureFFMPEGDVDPAL(FFMPEGEncoder: IBaseFilter);
var
  Encoder: IVFFFMPEGEncoder;
  Settings: TFFMPEGOutputSettings;
  hr: HRESULT;
begin
  hr := FFMPEGEncoder.QueryInterface(IID_IVFFFMPEGEncoder, Encoder);
  if Failed(hr) or (Encoder = nil) then
  begin
    WriteLn('Error: El filtro no admite IVFFFMPEGEncoder');
    Exit;
  end;

  try
    ZeroMemory(@Settings, SizeOf(Settings));

    Settings.Filename := 'C:\output\movie.mpg';

    // Configuración de audio
    Settings.AudioAvailable := True;
    Settings.AudioBitrate := 224000;
    Settings.AudioSamplerate := 48000;
    Settings.AudioChannels := 2;

    // Configuración de video - Especificaciones DVD PAL
    Settings.VideoWidth := 720;
    Settings.VideoHeight := 576;
    Settings.AspectRatioW := 16;
    Settings.AspectRatioH := 9;
    Settings.VideoBitrate := 6000000;
    Settings.VideoMaxRate := 9800000;
    Settings.VideoMinRate := 0;
    Settings.VideoBufferSize := 1835008;
    Settings.Interlace := True;
    Settings.VideoGopSize := 15;

    Settings.TVSystem := Ord(PAL);
    Settings.OutputFormat := Ord(MPEG2DVD);

    Encoder.set_settings(Settings);

    WriteLn('Codificador FFMPEG configurado para DVD PAL');
  finally
    Encoder := nil;
  end;
end;

Mejores Prácticas

Recomendaciones Específicas por Formato

Para Autoría de DVD (MPEG2DVD): - Siempre haga coincidir el sistema de TV con la región de destino (NTSC para América/Japón, PAL para Europa/Asia) - Use 720x480 para NTSC, 720x576 para PAL - Habilite el entrelazado para compatibilidad con radiodifusión - GOP: 12 fotogramas (NTSC), 15 fotogramas (PAL) - Tasa de bits de video: 4-9.8 Mbps - Audio: 48 kHz, 224-448 kbps

Para VCD/SVCD (MPEG1VCD, MPEG2SVCD): - Siga estrictamente las especificaciones de formato (resolución, tasa de bits) - Haga coincidir el sistema de TV con la región de destino - Use las tasas de bits exactas especificadas para la mejor compatibilidad - Pruebe en hardware de destino (reproductores VCD/SVCD independientes)

Para Transmisión Web (FLV): - Use codificación progresiva (no entrelazada) - Tasas de bits más bajas para un alcance más amplio (500-2500 kbps) - GOP: 30-60 fotogramas para puntos de búsqueda cada 1-2 segundos - Considere alternativas modernas (MP4/H.264) para mejor calidad

Para Radiodifusión (MPEG2TS): - Transport Stream tiene mejor resistencia a errores - Úselo para transmisión en vivo y aplicaciones de radiodifusión - Tasas de bits más altas aceptables (10-15 Mbps para HD) - Haga coincidir el entrelazado con el estándar de radiodifusión

Resolución y Relación de Aspecto

Resoluciones Estándar por Formato:

Formato Resolución NTSC Resolución PAL Relación de Aspecto
VCD 352x240 352x288 4:3
SVCD 480x480 480x576 4:3 o 16:9
DVD 720x480 720x576 4:3 o 16:9
FLV/MPEG-2 Cualquiera Cualquiera Cualquiera

Configuración de Relación de Aspecto: - Estándar 4:3: AspectRatioW = 4, AspectRatioH = 3 - Pantalla ancha 16:9: AspectRatioW = 16, AspectRatioH = 9 - Asegúrese de que la relación de aspecto de visualización coincida con la relación de aspecto de píxeles

Pautas de Tamaño de GOP

VCD/SVCD/DVD: - NTSC: 12 fotogramas (0.4 segundos a 29.97 fps) - PAL: 15 fotogramas (0.6 segundos a 25 fps) - Requerido para cumplimiento de formato

Transmisión Web: - 30-60 fotogramas (1-2 segundos) - GOP más corto: Mejor búsqueda, archivo más grande - GOP más largo: Archivo más pequeño, búsqueda más lenta

Radiodifusión: - 12-15 fotogramas para alta calidad - Haga coincidir con el estándar del sistema de TV

Configuración de Tasa de Bits

VBR (Tasa de Bits Variable): - Establezca VideoBitrate (promedio), VideoMinRate, VideoMaxRate - Mejor calidad para la misma tasa de bits promedio - Úselo para codificación basada en archivos

CBR (Tasa de Bits Constante): - Establezca las tres tasas de bits al mismo valor - Tamaño de archivo y ancho de banda predecibles - Úselo para transmisión y radiodifusión

Configuración de Audio

Frecuencias de Muestreo: - 44100 Hz: Calidad CD, VCD/SVCD - 48000 Hz: DVD, radiodifusión profesional - Haga coincidir con la fuente cuando sea posible

Tasas de Bits: - Voz mono: 64-96 kbps - Música estéreo: 128-224 kbps - Audio DVD: 192-448 kbps

Solución de Problemas

La Inicialización del Codificador Falla

Síntomas: La llamada a set_settings falla o se bloquea

Posibles Causas: 1. Nombre de archivo o ruta no válidos 2. Especificaciones de formato incorrectas 3. Combinación de resolución/tasa de bits no admitida

Soluciones: - Asegúrese de que el directorio de salida exista y sea escribible - Verifique que la resolución coincida con los requisitos del formato - Compruebe que la tasa de bits esté dentro de los límites del formato - Para VCD/SVCD/DVD, siga estrictamente las especificaciones

El Archivo de Salida No Se Reproduce

Síntomas: El archivo codificado no se reproduce o tiene errores

Posibles Causas: 1. Especificaciones de formato no cumplidas 2. Sistema de TV incorrecto para el formato 3. Desajuste de entrelazado 4. Problemas de tamaño de GOP

Soluciones: - Para DVD/VCD/SVCD: Use parámetros de especificación exactos - Haga coincidir el sistema de TV con la región de destino - Habilite el entrelazado para DVD/radiodifusión - Use tamaños de GOP estándar (12 para NTSC, 15 para PAL)

Mala Calidad de Video

Síntomas: Video pixelado, borroso o con artefactos

Posibles Causas: 1. Tasa de bits demasiado baja para la resolución 2. Tamaño de GOP incorrecto 3. Rango de tasa de bits demasiado restrictivo

Soluciones: - Aumente la tasa de bits de video (ver recomendaciones de formato) - Para VBR, amplíe el rango de tasa de bits mín/máx - Use el tamaño de GOP apropiado para el formato - Asegúrese de que la resolución coincida con las especificaciones del formato

Problemas de Sincronización A/V

Síntomas: El audio y el video se desincronizan

Posibles Causas: 1. Frecuencia de muestreo incorrecta 2. Velocidad de fotogramas incorrecta para el sistema de TV 3. Problemas de tamaño de búfer

Soluciones: - Use 48000 Hz para DVD, 44100 Hz para VCD - Asegúrese de que el sistema de TV coincida con la velocidad de fotogramas de la fuente - Aumente VideoBufferSize para contenido complejo - Verifique que el audio/video de origen estén sincronizados

DVD/VCD No Se Reproduce en Hardware

Síntomas: El archivo se reproduce en la computadora pero no en el reproductor independiente

Posibles Causas: 1. Especificaciones de formato no seguidas estrictamente 2. Sistema de TV incorrecto 3. Tamaño de GOP o tasa de bits no compatibles

Soluciones: - Crítico: Use especificaciones de formato exactas - VCD: 352x240/288, 1150 kbps, GOP 12/15 - DVD: 720x480/576, máx 9.8 Mbps, GOP 12/15 - Haga coincidir el sistema de TV con la región del reproductor - Habilite el entrelazado para DVD - Pruebe primero con un reproductor de DVD/VCD por software