title: Referencia de Interfaz: DirectShow MP4 Muxer description: Interfaces DirectShow de MP4 muxer con configuración de hilos, corrección de tiempo y opciones de streaming en vivo para salida de contenedor MP4.
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:
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:
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)