Salida MPEG-TS¶
Video Capture SDK .Net Video Edit SDK .Net Media Blocks SDK .Net
El módulo de salida MPEG-TS (Transport Stream) en el SDK de VisioForge proporciona funcionalidad para crear archivos de flujo de transporte MPEG con varias opciones de codificación de video y audio. Esta guía explica cómo configurar y usar la clase MPEGTSOutput efectivamente.
Salida MPEG-TS multiplataforma¶
VideoCaptureCoreX VideoEditCoreX MediaBlocksPipeline
Para crear una nueva salida MPEG-TS, use el siguiente constructor:
// Inicializar con audio AAC (recomendado)
var output = new MPEGTSOutput("output.ts", useAAC: true);
También puede usar audio MP3 en lugar de AAC:
// Inicializar con audio MP3 en lugar de AAC
var output = new MPEGTSOutput("output.ts", useAAC: false);
Opciones de codificación de video¶
La clase MPEGTSOutput soporta múltiples codificadores de video a través de la propiedad Video. Los codificadores disponibles incluyen:
- OpenH264 (Basado en software)
- NVENC H.264 (Aceleración GPU NVIDIA)
- QSV H.264 (Intel Quick Sync)
- AMF H.264 (Aceleración GPU AMD)
- MF HEVC (Windows Media Foundation, solo Windows)
- NVENC HEVC (Aceleración GPU NVIDIA)
- QSV HEVC (Intel Quick Sync)
- AMF H.265 (Aceleración GPU AMD)
Ejemplo de configuración de un codificador de video específico:
// Verificar si el codificador NVIDIA está disponible
if (NVENCH264EncoderSettings.IsAvailable())
{
output.Video = new NVENCH264EncoderSettings();
}
else
{
// Recurrir a OpenH264
output.Video = new OpenH264EncoderSettings();
}
Opciones de codificación de audio¶
Los siguientes codificadores de audio son soportados a través de la propiedad Audio:
- VO-AAC (Multiplataforma)
- AVENC AAC
- MF AAC (Solo Windows)
- MP3EncoderSettings
Ejemplo de configuración de un codificador de audio:
// Para plataformas Windows
output.Audio = new MFAACEncoderSettings();
// Para compatibilidad multiplataforma
output.Audio = new VOAACEncoderSettings();
// Usando MP3 en lugar de AAC
output.Audio = new MP3EncoderSettings();
Gestión de archivos¶
Puede obtener o establecer el nombre de archivo de salida después de la inicialización:
// Obtener nombre de archivo actual
string archivoActual = output.GetFilename();
// Cambiar nombre de archivo de salida
output.SetFilename("nueva_salida.ts");
División de archivos¶
La clase MPEGTSSplitSinkSettings permite la división automática de la salida MPEG-TS en múltiples archivos basándose en tamaño, duración o código de tiempo. Esto es útil para:
- Crear archivos segmentados para streaming HLS
- Gestionar almacenamiento limitando tamaños de archivo
- Grabar videos de time-lapse
- Implementar grabación de búfer circular
Opciones de configuración¶
using VisioForge.Core.Types.X.Sinks;
// Crear configuración de división con patrón de nombre de archivo
// %05d será reemplazado con número de segmento (00000, 00001, etc.)
var splitSettings = new MPEGTSSplitSinkSettings("video_%05d.ts")
{
// Dividir por duración (ej., cada 5 minutos)
SplitDuration = TimeSpan.FromMinutes(5),
// Dividir por tamaño de archivo (ej., 100 MB, 0 = deshabilitado)
SplitFileSize = 100 * 1024 * 1024,
// Número máximo de archivos a mantener (archivos antiguos eliminados, 0 = ilimitado)
SplitMaxFiles = 10,
// Dividir por diferencia de código de tiempo (opcional)
SplitMaxSizeTimecode = "01:00:00:00", // 1 hora
// Índice inicial para numeración de segmentos
StartIndex = 0,
// Modo M2TS (formato Blu-ray con paquetes de 192 bytes)
M2TSMode = false
};
// Aplicar a salida
output.Sink = splitSettings;
Disparadores de división¶
Los archivos se dividirán cuando se cumpla cualquiera de estas condiciones:
- Basado en duración:
SplitDuration- Se crea nuevo archivo después del tiempo especificado - Basado en tamaño:
SplitFileSize- Se crea nuevo archivo cuando se alcanza el límite de tamaño - Basado en código de tiempo:
SplitMaxSizeTimecode- Nuevo archivo cuando se alcanza la diferencia de código de tiempo
Patrón de nombre de archivo¶
El patrón de nombre de archivo usa formato estilo printf para números de segmento:
// Ejemplos de patrones de nombre de archivo
"grabacion_%02d.ts" // grabacion_00.ts, grabacion_01.ts, ...
"stream_%05d.ts" // stream_00000.ts, stream_00001.ts, ...
"salida_%d.ts" // salida_0.ts, salida_1.ts, ...
Grabación de búfer circular¶
Para implementar un búfer circular que mantenga solo los últimos N segmentos:
var settings = new MPEGTSSplitSinkSettings("buffer_%03d.ts")
{
SplitDuration = TimeSpan.FromMinutes(1), // Segmentos de 1 minuto
SplitMaxFiles = 60 // Mantener últimos 60 minutos
};
Ejemplo de uso¶
// Ejemplo completo con configuración de división
var output = new MPEGTSOutput("video_%05d.ts", useAAC: true);
// Configurar ajustes de división
output.Sink = new MPEGTSSplitSinkSettings("video_%05d.ts")
{
SplitDuration = TimeSpan.FromMinutes(5),
SplitMaxFiles = 12, // Mantener última hora (12 x 5 minutos)
M2TSMode = false
};
// Configurar codificadores
if (NVENCH264EncoderSettings.IsAvailable())
{
output.Video = new NVENCH264EncoderSettings();
}
// Usar con VideoCaptureCoreX o MediaBlocksPipeline
// El patrón de nombre de archivo se usará automáticamente
Eventos de segmento¶
Al grabar con MPEGTSSplitSinkSettings, el bloque MPEGTSSinkBlock de Media Blocks genera eventos alrededor de cada archivo de segmento, de modo que puede nombrar los archivos usted mismo y recibir una notificación cuando un segmento finaliza:
OnSegmentFileNameRequested: se genera justo antes de crear un nuevo archivo de segmento. Establezca la propiedadFileNamedel evento en una ruta personalizada (por ejemplo, una que incluya la hora de inicio del segmento). Déjela sin establecer para conservar el nombre predeterminado generado a partir del patrón de ubicación.OnSegmentCreated: se genera cuando se ha abierto un nuevo archivo de segmento.OnSegmentClosed: se genera cuando un archivo de segmento se ha finalizado y cerrado, el momento de renombrar el archivo (por ejemplo, para añadir su hora de fin).
var splitSettings = new MPEGTSSplitSinkSettings("video_%05d.ts")
{
SplitDuration = TimeSpan.FromMinutes(5)
};
var tsSink = new MPEGTSSinkBlock(splitSettings);
tsSink.OnSegmentClosed += (sender, e) =>
{
// e.FileName, e.FragmentIndex y e.FragmentDuration están disponibles aquí.
Console.WriteLine($"Segment {e.FragmentIndex} finished: {e.FileName}");
};
OnSegmentCreated / OnSegmentClosed reciben un SegmentSinkFileEventArgs que contiene FileName (string), FragmentIndex (uint), RunningTime (TimeSpan) y, solo en OnSegmentClosed, FragmentOffset y FragmentDuration (TimeSpan?). OnSegmentFileNameRequested recibe un SegmentSinkFileNameEventArgs cuya propiedad FileName, que puede establecerse, anula el nombre del segmento. Los mismos eventos están disponibles en MP4SinkBlock / MP4OutputBlock: consulte la página de salida MP4 para ver un ejemplo completo de nombrado personalizado y cambio de nombre al cerrar.
Subprocesos
Estos eventos se generan en un subproceso de streaming de GStreamer, por lo que un controlador no debe acceder directamente a los controles de la interfaz de usuario: redirija la llamada al subproceso de la interfaz. El cambio de nombre del archivo dentro de OnSegmentClosed es E/S de archivo simple y es seguro hacerlo ahí.
Características avanzadas¶
Procesamiento personalizado¶
MPEGTSOutput soporta procesamiento personalizado de video y audio a través de MediaBlocks:
// Agregar procesamiento de video personalizado
output.CustomVideoProcessor = new SuProcesadorDeVideoPersonalizado();
// Agregar procesamiento de audio personalizado
output.CustomAudioProcessor = new SuProcesadorDeAudioPersonalizado();
Configuración de Sink¶
La salida usa MPEGTSSinkSettings (o la derivada MPEGTSSplitSinkSettings para salida segmentada) para la configuración:
// Acceder a configuración de sink
output.Sink.Filename = "salida_modificada.ts";
Consideraciones de plataforma¶
- Algunos codificadores (MF AAC, MF HEVC) solo están disponibles en plataformas Windows
- Las aplicaciones multiplataforma deben usar codificadores agnósticos de plataforma como VO-AAC para audio
Mejores prácticas¶
-
Aceleración de hardware: Cuando esté disponible, prefiera codificadores acelerados por hardware (NVENC, QSV, AMF) sobre codificadores de software para mejor rendimiento.
-
Selección de códec de audio: Use AAC para mejor compatibilidad y calidad a menos que tenga requisitos específicos para MP3.
-
Manejo de errores: Siempre verifique la disponibilidad del codificador antes de usar opciones aceleradas por hardware:
if (NVENCH264EncoderSettings.IsAvailable())
{
// Usar codificador NVIDIA
}
else if (QSVH264EncoderSettings.IsAvailable())
{
// Recurrir a Intel Quick Sync
}
else
{
// Recurrir a codificación de software
}
Compatibilidad multiplataforma: Para aplicaciones multiplataforma, asegúrese de usar codificadores disponibles en todas las plataformas objetivo o implemente respaldos apropiados.
Ejemplo de implementación¶
Aquí hay un ejemplo completo que muestra cómo crear y configurar una salida MPEG-TS:
var output = new MPEGTSOutput("output.ts", useAAC: true);
// Configurar codificador de video
if (NVENCH264EncoderSettings.IsAvailable())
{
output.Video = new NVENCH264EncoderSettings();
}
else if (QSVH264EncoderSettings.IsAvailable())
{
output.Video = new QSVH264EncoderSettings();
}
else
{
output.Video = new OpenH264EncoderSettings();
}
// Configurar codificador de audio basado en plataforma
#if NET_WINDOWS
output.Audio = new MFAACEncoderSettings();
#else
output.Audio = new VOAACEncoderSettings();
#endif
// Opcional: Agregar procesamiento personalizado
output.CustomVideoProcessor = new SuProcesadorDeVideoPersonalizado();
output.CustomAudioProcessor = new SuProcesadorDeAudioPersonalizado();
Salida MPEG-TS solo Windows¶
La clase MPEGTSOutput proporciona configuración para salida MPEG Transport Stream (MPEG-TS) en el framework de procesamiento de video VisioForge. Esta clase hereda de MFBaseOutput e implementa la interfaz IVideoCaptureBaseOutput, por lo que el motor clásico de Windows la expone únicamente a través de VideoCaptureCore — el clásico VideoEditCore no tiene ruta de salida MPEG-TS (usa VideoEditCoreX para MPEG-TS multiplataforma).
Jerarquía de clases¶
MFBaseOutput
└── MPEGTSOutput
Configuración de video heredada¶
La clase MPEGTSOutput hereda capacidades de codificación de video de MFBaseOutput, que incluye:
Configuración de codificación de video: A través de la propiedad Video, soportando:
- Múltiples opciones de códec (H.264/H.265) con soporte de aceleración de hardware
- Control de tasa de bits (CBR/VBR)
- Configuración de calidad
- Configuración de tipo de cuadro y estructura GOP
- Opciones de entrelazado
- Controles de resolución y relación de aspecto
Configuración de audio heredada¶
La configuración de audio se maneja a través de la propiedad Audio heredada de tipo M4AOutput, que incluye:
Codificación de audio AAC con configurables:
- Versión (predeterminado: MPEG-4)
- Tipo de objeto (predeterminado: AAC-LC)
- Tasa de bits (predeterminado: 128 kbps)
- Formato de salida (predeterminado: RAW)
Uso¶
Implementación básica¶
// Crear instancia de VideoCaptureCore
var core = new VideoCaptureCore();
// Establecer nombre de archivo de salida
core.Output_Filename = "output.ts";
// Crear salida MPEG-TS
var mpegtsOutput = new MPEGTSOutput();
// Configurar ajustes de video
mpegtsOutput.Video.Codec = MFVideoEncoder.MS_H264;
mpegtsOutput.Video.AvgBitrate = 2000; // 2 Mbps
mpegtsOutput.Video.RateControl = MFCommonRateControlMode.CBR;
// Configurar ajustes de audio
mpegtsOutput.Audio.Bitrate = 128; // 128 kbps
mpegtsOutput.Audio.Version = AACVersion.MPEG4;
core.Output_Format = mpegtsOutput;
Soporte de serialización¶
La clase proporciona soporte de serialización JSON integrado para guardar y cargar configuraciones:
// Guardar configuración
string jsonConfig = mpegtsOutput.Save();
// Cargar configuración
MPEGTSOutput loadedConfig = MPEGTSOutput.Load(jsonConfig);
Configuración predeterminada¶
La clase MPEGTSOutput se inicializa con estos ajustes predeterminados:
Predeterminados de video (heredados de MFBaseOutput)¶
- Tasa de bits promedio: 2000 kbps
- Códec: Microsoft H.264
- Perfil: Main
- Nivel: 4.2
- Control de tasa: CBR
- Calidad vs Velocidad: 85
- Cuadros de referencia máximos: 2
- MaxKeyFrameSpacing (tamaño GOP): 125 cuadros
- Conteo de B-Pictures: 0
- Modo de baja latencia: Deshabilitado
- CABAC: Deshabilitado
- Modo de entrelazado: Progresivo
Predeterminados de audio¶
- Tasa de bits: 128 kbps
- Versión AAC: MPEG-4
- Tipo de objeto AAC: Complejidad baja (LC)
- Formato de salida: RAW
Mejores prácticas¶
- Configuración de tasa de bits:
- Para aplicaciones de streaming, asegúrese de que las tasas de bits combinadas de video y audio estén dentro de su ancho de banda objetivo
-
Considere usar VBR para escenarios de almacenamiento y CBR para streaming
-
Aceleración de hardware:
- Cuando esté disponible, use codificadores acelerados por hardware (QSV, NVENC, AMD) para mejor rendimiento
-
Recurra a MS_H264/MS_H265 cuando la aceleración de hardware no esté disponible
-
Optimización de calidad:
- Para mayor calidad a costa del rendimiento, aumente el valor de
QualityVsSpeed - Habilite CABAC para mejor eficiencia de compresión en escenarios sin baja latencia
- Ajuste
MaxKeyFrameSpacingsegún su caso de uso específico (valores más bajos para mejor búsqueda, valores más altos para mejor compresión)
Notas técnicas¶
- Características de MPEG-TS:
- Adecuado para aplicaciones de streaming y transmisión
- Proporciona resiliencia a errores a través de estructura basada en paquetes
-
Soporta múltiples programas y flujos elementales
-
Consideraciones de rendimiento:
- El modo de baja latencia intercambia calidad por retardo de codificación reducido
- Los B-frames mejoran la compresión pero aumentan la latencia
- La aceleración de hardware puede reducir significativamente el uso de CPU
Redists requeridos¶
Visite nuestra página de GitHub para obtener más ejemplos de código.