Saltar a contenido

Referencia de Interfaz MP4 Muxer

Resumen

Los filtros DirectShow MP4 muxer proporcionan interfaces para configurar la salida del contenedor MP4 (MPEG-4 Parte 14). Estas interfaces permiten a los desarrolladores controlar el comportamiento de los hilos, la corrección de tiempo y el manejo especial para escenarios de streaming en vivo.

Hay dos interfaces de muxer disponibles: - IMP4MuxerConfig: Configuración básica de MP4 muxer para hilos y tiempo - IMP4V10MuxerConfig: Configuración avanzada para muxer versión 10 con banderas de tiempo y control de streaming en vivo

Interfaz IMP4MuxerConfig

Resumen

La interfaz IMP4MuxerConfig proporciona configuración básica para multiplexación MP4, controlando la operación de un solo hilo y el comportamiento de corrección de tiempo.

GUID de Interfaz: {99DC9BE5-0AFA-45d4-8370-AB021FB07CF4}

Hereda De: IUnknown

Definiciones de Interfaz

Definición C

using System;
using System.Runtime.InteropServices;

namespace VisioForge.DirectShowAPI
{
    /// <summary>
    /// Interfaz de configuración de MP4 muxer.
    /// Controla el comportamiento de hilos y tiempo para la creación de contenedores MP4.
    /// </summary>
    [ComImport]
    [Guid("99DC9BE5-0AFA-45d4-8370-AB021FB07CF4")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IMP4MuxerConfig
    {
        /// <summary>
        /// Obtiene el estado de procesamiento de un solo hilo.
        /// </summary>
        /// <param name="pValue">Recibe true si el modo de un solo hilo está habilitado, false en caso contrario</param>
        /// <returns>HRESULT (0 para éxito)</returns>
        [PreserveSig]
        int get_SingleThread([Out] [MarshalAs(UnmanagedType.Bool)] out bool pValue);

        /// <summary>
        /// Habilita o deshabilita el procesamiento de un solo hilo.
        /// Cuando está habilitado, todas las operaciones del muxer se ejecutan en un solo hilo para un comportamiento determinista.
        /// </summary>
        /// <param name="value">True para habilitar el modo de un solo hilo, false para multi-hilo</param>
        /// <returns>HRESULT (0 para éxito)</returns>
        [PreserveSig]
        int put_SingleThread([In] [MarshalAs(UnmanagedType.Bool)] bool value);

        /// <summary>
        /// Obtiene el estado de corrección de tiempo.
        /// </summary>
        /// <param name="pValue">Recibe true si la corrección de tiempo está habilitada, false en caso contrario</param>
        /// <returns>HRESULT (0 para éxito)</returns>
        [PreserveSig]
        int get_CorrectTiming([Out] [MarshalAs(UnmanagedType.Bool)] out bool pValue);

        /// <summary>
        /// Habilita o deshabilita la corrección de tiempo.
        /// Cuando está habilitado, el muxer ajusta las marcas de tiempo para corregir la deriva y las inconsistencias de tiempo.
        /// </summary>
        /// <param name="value">True para habilitar la corrección de tiempo, false para deshabilitar</param>
        /// <returns>HRESULT (0 para éxito)</returns>
        [PreserveSig]
        int put_CorrectTiming([In] [MarshalAs(UnmanagedType.Bool)] bool value);
    }
}

Definición C++

#include <unknwn.h>

// {99DC9BE5-0AFA-45d4-8370-AB021FB07CF4}
DEFINE_GUID(IID_IMP4MuxerConfig,
    0x99dc9be5, 0x0afa, 0x45d4, 0x83, 0x70, 0xab, 0x02, 0x1f, 0xb0, 0x7c, 0xf4);

/// <summary>
/// Interfaz de configuración de MP4 muxer.
/// Controla el comportamiento de hilos y tiempo.
/// </summary>
DECLARE_INTERFACE_(IMP4MuxerConfig, IUnknown)
{
    /// <summary>
    /// Obtiene el estado de procesamiento de un solo hilo.
    /// </summary>
    /// <param name="pValue">Puntero para recibir el estado habilitado de un solo hilo</param>
    /// <returns>S_OK para éxito</returns>
    STDMETHOD(get_SingleThread)(THIS_
        BOOL* pValue
        ) PURE;

    /// <summary>
    /// Habilita o deshabilita el procesamiento de un solo hilo.
    /// </summary>
    /// <param name="value">TRUE para habilitar el modo de un solo hilo, FALSE para multi-hilo</param>
    /// <returns>S_OK para éxito</returns>
    STDMETHOD(put_SingleThread)(THIS_
        BOOL value
        ) PURE;

    /// <summary>
    /// Obtiene el estado de corrección de tiempo.
    /// </summary>
    /// <param name="pValue">Puntero para recibir el estado habilitado de corrección de tiempo</param>
    /// <returns>S_OK para éxito</returns>
    STDMETHOD(get_CorrectTiming)(THIS_
        BOOL* pValue
        ) PURE;

    /// <summary>
    /// Habilita o deshabilita la corrección de tiempo.
    /// </summary>
    /// <param name="value">TRUE para habilitar la corrección de tiempo, FALSE para deshabilitar</param>
    /// <returns>S_OK para éxito</returns>
    STDMETHOD(put_CorrectTiming)(THIS_
        BOOL value
        ) PURE;
};

Definición Delphi

uses
  ActiveX, ComObj;

const
  IID_IMP4MuxerConfig: TGUID = '{99DC9BE5-0AFA-45d4-8370-AB021FB07CF4}';

type
  /// <summary>
  /// Interfaz de configuración de MP4 muxer.
  /// </summary>
  IMP4MuxerConfig = interface(IUnknown)
    ['{99DC9BE5-0AFA-45d4-8370-AB021FB07CF4}']

    /// <summary>
    /// Obtiene el estado de procesamiento de un solo hilo.
    /// </summary>
    function get_SingleThread(out pValue: BOOL): HRESULT; stdcall;

    /// <summary>
    /// Habilita o deshabilita el procesamiento de un solo hilo.
    /// </summary>
    function put_SingleThread(value: BOOL): HRESULT; stdcall;

    /// <summary>
    /// Obtiene el estado de corrección de tiempo.
    /// </summary>
    function get_CorrectTiming(out pValue: BOOL): HRESULT; stdcall;

    /// <summary>
    /// Habilita o deshabilita la corrección de tiempo.
    /// </summary>
    function put_CorrectTiming(value: BOOL): HRESULT; stdcall;
  end;

Referencia de Métodos

get_SingleThread / put_SingleThread

Controla si el muxer procesa datos usando un solo hilo o múltiples hilos.

Modo de Un Solo Hilo (habilitado): - Todas las operaciones de muxing se ejecutan en un hilo - Comportamiento determinista y predecible - Depuración y solución de problemas más fáciles - Rendimiento ligeramente inferior en sistemas multi-núcleo - Recomendado para: Escenarios que requieren salida consistente y reproducible

Modo Multi-Hilo (deshabilitado): - El muxer puede usar múltiples hilos para procesamiento - Mejor rendimiento en procesadores multi-núcleo - Orden de operación no determinista - Recomendado para: Codificación de alto rendimiento con múltiples flujos

Predeterminado: Típicamente multi-hilo (false)

Ejemplo:

// Habilitar modo de un solo hilo para salida consistente
mp4Muxer.put_SingleThread(true);

get_CorrectTiming / put_CorrectTiming

Habilita o deshabilita la corrección automática de marcas de tiempo para flujos de audio y video.

Corrección de Tiempo Habilitada (true): - El muxer ajusta automáticamente las marcas de tiempo para corregir la deriva - Corrige inconsistencias de tiempo de filtros fuente - Asegura sincronización A/V adecuada - Agrega pequeña sobrecarga de procesamiento - Recomendado para: La mayoría de los escenarios, especialmente con fuentes en vivo

Corrección de Tiempo Deshabilitada (false): - Las marcas de tiempo pasan sin modificación - Asume que los filtros fuente proporcionan marcas de tiempo precisas - Rendimiento ligeramente mejor - Usar solo cuando: La fuente proporciona marcas de tiempo precisas garantizadas

Predeterminado: Típicamente habilitado (true)

Ejemplo:

// Habilitar corrección de tiempo para sincronización A/V
mp4Muxer.put_CorrectTiming(true);


Interfaz IMP4V10MuxerConfig

Resumen

La interfaz IMP4V10MuxerConfig proporciona configuración avanzada para el muxer MP4 versión 10, incluyendo banderas de anulación de tiempo y control de streaming en vivo. GUID de Interfaz: {9E26CE8B-6708-4535-AAA4-23F9A97C7937} Hereda De: IUnknown

Enumeración MP4V10Flags

/// <summary>
/// Banderas de configuración de muxer MP4 v10.
/// </summary>
[Flags]
public enum MP4V10Flags
{
    /// <summary>
    /// Sin banderas especiales.
    /// </summary>
    None = 0,
    /// <summary>
    /// Modo de anulación de tiempo - permite control manual de marcas de tiempo.
    /// </summary>
    TimeOverride = 0x00000001,
    /// <summary>
    /// Modo de ajuste de tiempo - habilita ajuste automático de marcas de tiempo.
    /// </summary>
    TimeAdjust = 0x00000002
}

Definiciones de Interfaz

Definición C

using System;
using System.Runtime.InteropServices;
namespace VisioForge.DirectShowAPI
{
    /// <summary>
    /// Banderas de muxer MP4 v10.
    /// </summary>
    [Flags]
    public enum MP4V10Flags
    {
        /// <summary>
        /// Predeterminado - sin banderas especiales.
        /// </summary>
        None = 0,
        /// <summary>
        /// Anulación de tiempo - permite control manual de marcas de tiempo.
        /// </summary>
        TimeOverride = 0x00000001,
        /// <summary>
        /// Ajuste de tiempo - habilita ajuste automático de marcas de tiempo.
        /// </summary>
        TimeAdjust = 0x00000002
    }
    /// <summary>
    /// Interfaz de configuración de muxer MP4 versión 10.
    /// Proporciona control de tiempo avanzado y opciones de streaming en vivo.
    /// </summary>
    [ComImport]
    [Guid("9E26CE8B-6708-4535-AAA4-23F9A97C7937")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IMP4V10MuxerConfig
    {
        /// <summary>
        /// Establece las banderas de configuración del muxer.
        /// </summary>
        /// <param name="value">Combinación de valores MP4V10Flags</param>
        /// <returns>HRESULT (0 para éxito)</returns>
        [PreserveSig]
        int SetFlags([In] uint value);
        /// <summary>
        /// Obtiene las banderas de configuración actuales del muxer.
        /// </summary>
        /// <param name="pValue">Recibe las banderas actuales</param>
        /// <returns>HRESULT (0 para éxito)</returns>
        [PreserveSig]
        int GetFlags([Out] out uint pValue);
        /// <summary>
        /// Deshabilita optimizaciones de streaming en vivo.
        /// Cuando está deshabilitado, el muxer usa el modo de salida estándar basado en archivos.
        /// </summary>
        /// <param name="liveDisabled">True para deshabilitar el modo en vivo, false para habilitar</param>
        /// <returns>HRESULT (0 para éxito)</returns>
        [PreserveSig]
        int SetLiveDisabled([MarshalAs(UnmanagedType.Bool)] bool liveDisabled);
    }
}

Definición C++

#include <unknwn.h>
// {9E26CE8B-6708-4535-AAA4-23F9A97C7937}
DEFINE_GUID(IID_IMP4V10MuxerConfig,
    0x9e26ce8b, 0x6708, 0x4535, 0xaa, 0xa4, 0x23, 0xf9, 0xa9, 0x7c, 0x79, 0x37);
/// <summary>
/// Banderas de muxer MP4 v10.
/// </summary>
enum MP4V10Flags
{
    MP4V10_NONE = 0,
    MP4V10_TIME_OVERRIDE = 0x00000001,
    MP4V10_TIME_ADJUST = 0x00000002
};
/// <summary>
/// Interfaz de configuración de muxer MP4 versión 10.
/// Proporciona control de tiempo avanzado y opciones de streaming en vivo.
/// </summary>
DECLARE_INTERFACE_(IMP4V10MuxerConfig, IUnknown)
{
    /// <summary>
    /// Establece las banderas de configuración del muxer.
    /// </summary>
    /// <param name="value">Combinación de valores MP4V10Flags</param>
    /// <returns>S_OK para éxito</returns>
    STDMETHOD(SetFlags)(THIS_
        unsigned long value
        ) PURE;
    /// <summary>
    /// Obtiene las banderas de configuración actuales del muxer.
    /// </summary>
    /// <param name="pValue">Puntero para recibir las banderas actuales</param>
    /// <returns>S_OK para éxito</returns>
    STDMETHOD(GetFlags)(THIS_
        unsigned long* pValue
        ) PURE;
    /// <summary>
    /// Deshabilita optimizaciones de streaming en vivo.
    /// </summary>
    /// <param name="liveDisabled">TRUE para deshabilitar el modo en vivo, FALSE para habilitar</param>
    /// <returns>S_OK para éxito</returns>
    STDMETHOD(SetLiveDisabled)(THIS_
        BOOL liveDisabled
        ) PURE;
};

Definición Delphi

uses
  ActiveX, ComObj;
const
  IID_IMP4V10MuxerConfig: TGUID = '{9E26CE8B-6708-4535-AAA4-23F9A97C7937}';
  // Constantes MP4V10Flags
  MP4V10_NONE = 0;
  MP4V10_TIME_OVERRIDE = $00000001;
  MP4V10_TIME_ADJUST = $00000002;
type
  /// <summary>
  /// Interfaz de configuración de muxer MP4 versión 10.
  /// </summary>
  IMP4V10MuxerConfig = interface(IUnknown)
    ['{9E26CE8B-6708-4535-AAA4-23F9A97C7937}']
    /// <summary>
    /// Establece las banderas de configuración del muxer.
    /// </summary>
    function SetFlags(value: Cardinal): HRESULT; stdcall;
    /// <summary>
    /// Obtiene las banderas de configuración actuales del muxer.
    /// </summary>
    function GetFlags(out pValue: Cardinal): HRESULT; stdcall;
    /// <summary>
    /// Deshabilita optimizaciones de streaming en vivo.
    /// </summary>
    function SetLiveDisabled(liveDisabled: BOOL): HRESULT; stdcall;
  end;

Referencia de Métodos

SetFlags / GetFlags

Establece o recupera las banderas de configuración del muxer que controlan el comportamiento del tiempo. Valores MP4V10Flags: None (0): - Operación estándar - Manejo predeterminado de marcas de tiempo - Sin modificaciones especiales de tiempo TimeOverride (0x00000001): - Habilita anulación manual de marcas de tiempo - Permite a la aplicación controlar las marcas de tiempo directamente - Deshabilita generación automática de marcas de tiempo - Usar cuando: La aplicación necesita control total sobre el tiempo TimeAdjust (0x00000002): - Habilita ajuste automático de marcas de tiempo - El muxer corrige la deriva e irregularidades de tiempo - Similar a IMP4MuxerConfig::CorrectTiming - Usar para: Fuentes con marcas de tiempo inconsistentes Combinando Banderas:

// Habilitar tanto anulación de tiempo como ajuste
uint flags = (uint)(MP4V10Flags.TimeOverride | MP4V10Flags.TimeAdjust);
mp4V10Muxer.SetFlags(flags);

SetLiveDisabled

Controla si el muxer opera en modo de streaming en vivo o modo basado en archivos. Modo En Vivo Habilitado (liveDisabled = false): - Optimizado para streaming en vivo/tiempo real - Búfer mínimo - Menor latencia - Salida MP4 progresiva (se puede reproducir mientras se escribe) - Usar para: Streaming en vivo a archivo, salida de streaming de red Modo En Vivo Deshabilitado (liveDisabled = true): - Muxing estándar basado en archivos - Puede realizar optimización de múltiples pasadas - Estructura MP4 completa escrita al final - Puede requerir búsqueda en archivo de salida - Usar para: Codificación basada en archivos, escenarios de post-procesamiento Ejemplo:

// Habilitar modo basado en archivos (deshabilitar optimizaciones en vivo)
mp4V10Muxer.SetLiveDisabled(true);

Ejemplos de Uso

Ejemplo C# - Creación Estándar de Archivo MP4

using System;
using DirectShowLib;
using VisioForge.DirectShowAPI;
public class MP4MuxerStandardConfig
{
    public void ConfigureStandardMP4(IBaseFilter mp4Muxer)
    {
        // Consultar la interfaz estándar de muxer MP4
        var muxerConfig = mp4Muxer as IMP4MuxerConfig;
        if (muxerConfig == null)
        {
            Console.WriteLine("Error: El filtro no soporta IMP4MuxerConfig");
            return;
        }
        // Configurar para codificación estándar basada en archivos
        muxerConfig.put_SingleThread(false);     // Multi-hilo para rendimiento
        muxerConfig.put_CorrectTiming(true);     // Habilitar corrección de tiempo
        Console.WriteLine("MP4 muxer configurado para creación estándar de archivos");
        // Verificar configuración
        muxerConfig.get_SingleThread(out bool singleThread);
        muxerConfig.get_CorrectTiming(out bool correctTiming);
        Console.WriteLine($"  Un solo hilo: {singleThread}");
        Console.WriteLine($"  Corrección de tiempo: {correctTiming}");
    }
}

Ejemplo C# - Salida Determinista

public class MP4MuxerDeterministicConfig
{
    public void ConfigureDeterministicMP4(IBaseFilter mp4Muxer)
    {
        var muxerConfig = mp4Muxer as IMP4MuxerConfig;
        if (muxerConfig == null)
            return;
        // Configurar para salida determinista y reproducible
        muxerConfig.put_SingleThread(true);      // Un solo hilo para consistencia
        muxerConfig.put_CorrectTiming(true);     // Habilitar corrección de tiempo
        Console.WriteLine("MP4 muxer configurado para salida determinista");
        Console.WriteLine("  Adecuado para pruebas de regresión y validación");
    }
}

Ejemplo C# - Streaming en Vivo a Archivo (MP4 V10)

public class MP4V10LiveStreamingConfig
{
    public void ConfigureLiveStreaming(IBaseFilter mp4V10Muxer)
    {
        // Consultar la interfaz de muxer MP4 v10
        var muxerV10Config = mp4V10Muxer as IMP4V10MuxerConfig;
        if (muxerV10Config == null)
        {
            Console.WriteLine("Error: El filtro no soporta IMP4V10MuxerConfig");
            return;
        }
        // Configurar para streaming en vivo a archivo
        muxerV10Config.SetLiveDisabled(false);   // Habilitar modo en vivo
        // Habilitar ajuste de tiempo para fuentes en vivo
        uint flags = (uint)MP4V10Flags.TimeAdjust;
        muxerV10Config.SetFlags(flags);
        Console.WriteLine("MP4 v10 muxer configurado para streaming en vivo");
        // Verificar configuración
        muxerV10Config.GetFlags(out uint currentFlags);
        Console.WriteLine($"  Banderas: 0x{currentFlags:X8}");
        Console.WriteLine($"  Ajuste de Tiempo: {((currentFlags & (uint)MP4V10Flags.TimeAdjust) != 0)}");
    }
}

Ejemplo C# - Control Manual de Marcas de Tiempo (MP4 V10)

public class MP4V10ManualTimestampConfig
{
    public void ConfigureManualTimestamps(IBaseFilter mp4V10Muxer)
    {
        var muxerV10Config = mp4V10Muxer as IMP4V10MuxerConfig;
        if (muxerV10Config == null)
            return;
        // Configurar para control manual de marcas de tiempo
        muxerV10Config.SetLiveDisabled(true);    // Deshabilitar modo en vivo
        // Habilitar anulación de tiempo para control manual
        uint flags = (uint)MP4V10Flags.TimeOverride;
        muxerV10Config.SetFlags(flags);
        Console.WriteLine("MP4 v10 muxer configurado para control manual de marcas de tiempo");
        Console.WriteLine("  La aplicación debe proporcionar marcas de tiempo precisas");
    }
}

Ejemplo C++ - Configuración Estándar

#include <dshow.h>
#include <iostream>
#include "IMP4MuxerConfig.h"
void ConfigureMP4Muxer(IBaseFilter* pMp4Muxer)
{
    IMP4MuxerConfig* pMuxerConfig = NULL;
    HRESULT hr = S_OK;
    // Consultar la interfaz de muxer MP4
    hr = pMp4Muxer->QueryInterface(IID_IMP4MuxerConfig,
                                   (void**)&pMuxerConfig);
    if (FAILED(hr) || !pMuxerConfig)
    {
        std::cout << "Error: El filtro no soporta IMP4MuxerConfig" << std::endl;
        return;
    }
    // Configurar muxer
    pMuxerConfig->put_SingleThread(FALSE);     // Multi-hilo
    pMuxerConfig->put_CorrectTiming(TRUE);     // Habilitar corrección de tiempo
    // Verificar configuración
    BOOL singleThread, correctTiming;
    pMuxerConfig->get_SingleThread(&singleThread);
    pMuxerConfig->get_CorrectTiming(&correctTiming);
    std::cout << "MP4 muxer configurado:" << std::endl;
    std::cout << "  Un solo hilo: " << (singleThread ? "Sí" : "No") << std::endl;
    std::cout << "  Corrección de tiempo: " << (correctTiming ? "Sí" : "No") << std::endl;
    pMuxerConfig->Release();
}

Ejemplo C++ - Streaming en Vivo (MP4 V10)

#include "IMP4V10MuxerConfig.h"
void ConfigureMP4V10LiveStreaming(IBaseFilter* pMp4V10Muxer)
{
    IMP4V10MuxerConfig* pMuxerV10Config = NULL;
    HRESULT hr = pMp4V10Muxer->QueryInterface(IID_IMP4V10MuxerConfig,
                                               (void**)&pMuxerV10Config);
    if (SUCCEEDED(hr) && pMuxerV10Config)
    {
        // Configurar para streaming en vivo
        pMuxerV10Config->SetLiveDisabled(FALSE);     // Habilitar modo en vivo
        // Habilitar ajuste de tiempo
        unsigned long flags = MP4V10_TIME_ADJUST;
        pMuxerV10Config->SetFlags(flags);
        std::cout << "MP4 v10 muxer configurado para streaming en vivo" << std::endl;
        pMuxerV10Config->Release();
    }
}

Ejemplo Delphi - Configuración Estándar

uses
  DirectShow9, ActiveX;
procedure ConfigureMP4Muxer(Mp4Muxer: IBaseFilter);
var
  MuxerConfig: IMP4MuxerConfig;
  SingleThread, CorrectTiming: BOOL;
  hr: HRESULT;
begin
  // Consultar la interfaz de muxer MP4
  hr := Mp4Muxer.QueryInterface(IID_IMP4MuxerConfig, MuxerConfig);
  if Failed(hr) or (MuxerConfig = nil) then
  begin
    WriteLn('Error: El filtro no soporta IMP4MuxerConfig');
    Exit;
  end;
  try
    // Configurar muxer
    MuxerConfig.put_SingleThread(False);     // Multi-hilo
    MuxerConfig.put_CorrectTiming(True);     // Habilitar corrección de tiempo
    // Verificar configuración
    MuxerConfig.get_SingleThread(SingleThread);
    MuxerConfig.get_CorrectTiming(CorrectTiming);
    WriteLn('MP4 muxer configurado:');
    WriteLn('  Un solo hilo: ', SingleThread);
    WriteLn('  Corrección de tiempo: ', CorrectTiming);
  finally
    MuxerConfig := nil;
  end;
end;

Ejemplo Delphi - Streaming en Vivo (MP4 V10)

procedure ConfigureMP4V10LiveStreaming(Mp4V10Muxer: IBaseFilter);
var
  MuxerV10Config: IMP4V10MuxerConfig;
  Flags: Cardinal;
begin
  if Succeeded(Mp4V10Muxer.QueryInterface(IID_IMP4V10MuxerConfig, MuxerV10Config)) then
  begin
    try
      // Configurar para streaming en vivo
      MuxerV10Config.SetLiveDisabled(False);     // Habilitar modo en vivo
      // Habilitar ajuste de tiempo
      Flags := MP4V10_TIME_ADJUST;
      MuxerV10Config.SetFlags(Flags);
      WriteLn('MP4 v10 muxer configurado para streaming en vivo');
    finally
      MuxerV10Config := nil;
    end;
  end;
end;

Mejores Prácticas

Cuándo Usar IMP4MuxerConfig

Use IMP4MuxerConfig cuando: - Necesita configuración básica de muxer - Trabaja con salida MP4 estándar - La corrección de tiempo simple es suficiente - No necesita características avanzadas de streaming en vivo Configuración Típica:

mp4Muxer.put_SingleThread(false);    // Multi-hilo para rendimiento
mp4Muxer.put_CorrectTiming(true);    // Habilitar corrección de tiempo

Cuándo Usar IMP4V10MuxerConfig

Use IMP4V10MuxerConfig cuando: - Necesita control de tiempo avanzado - Trabaja con escenarios de streaming en vivo - Requiere anulación manual de marcas de tiempo - Necesita salida MP4 progresiva Configuración de Streaming en Vivo:

mp4V10Muxer.SetLiveDisabled(false);               // Habilitar modo en vivo
mp4V10Muxer.SetFlags((uint)MP4V10Flags.TimeAdjust); // Ajuste automático de tiempo

Un Solo Hilo vs Multi-Hilo

Use Modo de Un Solo Hilo cuando: - Depura el comportamiento del muxer - Necesita salida determinista y reproducible - Ejecuta pruebas automatizadas - Soluciona problemas de tiempo Use Modo Multi-Hilo cuando: - El rendimiento es crítico - Codifica video de alta resolución (1080p+) - El sistema tiene múltiples núcleos de CPU disponibles - Codificación de producción estándar

Corrección de Tiempo

Siempre Habilite Corrección de Tiempo cuando: - Trabaja con fuentes en vivo (cámaras, dispositivos de captura) - Las fuentes pueden tener inconsistencias de marcas de tiempo - Combina múltiples flujos (audio + video) - Necesita sincronización A/V confiable Puede Deshabilitar Corrección de Tiempo cuando: - La fuente proporciona marcas de tiempo precisas garantizadas - Codificación basada en archivos con marcas de tiempo pre-validadas - El rendimiento es absolutamente crítico - Usa control manual de marcas de tiempo (bandera TimeOverride)

Optimización de Streaming en Vivo

Habilitar Modo En Vivo (SetLiveDisabled = false) cuando: - Codifica para streaming en tiempo real - La salida necesita ser reproducible mientras se escribe - Crea archivos MP4 progresivos - La baja latencia es importante Deshabilitar Modo En Vivo (SetLiveDisabled = true) cuando: - Crea archivos para post-procesamiento - Necesita estructura MP4 completa al final - Puede realizar optimización de múltiples pasadas - El archivo de salida solo se reproducirá después de completarse

Solución de Problemas

Problemas de Sincronización Audio/Video

Síntomas: Audio y video se desincronizan con el tiempo Soluciones: 1. Habilitar corrección de tiempo: put_CorrectTiming(true) 2. Para muxer v10, usar bandera TimeAdjust: SetFlags((uint)MP4V10Flags.TimeAdjust) 3. Verificar que los filtros fuente proporcionen marcas de tiempo precisas 4. Verificar que las tasas de muestreo de audio y video sean correctas

El Archivo No Se Puede Reproducir Mientras Se Graba

Síntoma: Archivo MP4 solo reproducible después de completar la codificación Causa: El modo en vivo está deshabilitado Solución: - Usar interfaz IMP4V10MuxerConfig - Habilitar modo en vivo: SetLiveDisabled(false) - Esto crea archivos MP4 progresivos reproducibles durante la codificación

Salida de Archivo Inconsistente

Síntomas: La misma entrada produce diferentes archivos de salida Causa: Operación multi-hilo con condiciones de carrera Soluciones: 1. Habilitar modo de un solo hilo: put_SingleThread(true) 2. Habilitar corrección de tiempo: put_CorrectTiming(true) 3. Usar bandera TimeAdjust para muxer v10

Problemas de Rendimiento

Síntomas: Codificación más lenta de lo esperado, alto uso de CPU Posibles Causas: 1. Modo de un solo hilo en sistema multi-núcleo 2. Sobrecarga excesiva de corrección de tiempo Soluciones: - Deshabilitar modo de un solo hilo: put_SingleThread(false) - Si las fuentes tienen marcas de tiempo precisas, puede intentar deshabilitar la corrección de tiempo - Asegurar que el codificador de video (no el muxer) sea el cuello de botella de rendimiento - Considerar codificación por hardware (NVENC, QuickSync)

Archivos MP4 Corruptos

Síntomas: El archivo MP4 no se reproduce o tiene errores Posibles Causas: 1. Corrección de tiempo deshabilitada con malas marcas de tiempo 2. Configuración incorrecta de modo en vivo para el caso de uso 3. Muxer detenido antes de finalización adecuada Soluciones: - Habilitar corrección de tiempo para fuentes en vivo - Coincidir configuración de modo en vivo con caso de uso (en vivo vs basado en archivos) - Asegurar apagado adecuado del gráfico de filtros y finalización de flujo - Verificar que todos los flujos terminen adecuadamente (enviar evento EC_COMPLETE)


Ver También