Saltar a contenido

Bloque de Grabación Pre-Evento - VisioForge Media Blocks SDK .Net

SDK de Media Blocks .Net

El PreEventRecordingBlock almacena continuamente fotogramas de video y audio codificados en un buffer circular (anillo) basado en memoria. Cuando se activa un evento (detección de movimiento, alarma, llamada API), vacía el metraje pre-evento almacenado a un archivo y continúa grabando fotogramas en vivo durante una duración post-evento configurable. Esto crea clips de eventos completos que incluyen metraje de antes de que ocurriera el disparador.

Este bloque se usa comúnmente en aplicaciones de vigilancia y seguridad donde necesita capturar lo que sucedió antes y después de un evento, sin escribir continuamente en disco.

Información del bloque

Nombre: PreEventRecordingBlock.

Dirección del pin Tipo de medio Descripción
Entrada video video codificado (H.264, H.265) Stream de video codificado desde un codificador o fuente passthrough
Entrada audio audio codificado (AAC, MP3, etc.) Stream de audio codificado (opcional, puede deshabilitarse)

Este es un bloque sumidero — no tiene pads de salida. Los archivos grabados se escriben directamente en disco cuando se activa una grabación.

Configuración

El PreEventRecordingBlock se configura usando PreEventRecordingSettings.

Propiedad Tipo Predeterminado Descripción
PreEventDuration TimeSpan 30 segundos Duración de video/audio a mantener en buffer en memoria. Cuando ocurre un disparador, esta cantidad de metraje se vacía al archivo de salida.
PostEventDuration TimeSpan 10 segundos Duración para continuar grabando después del disparador. Después de que este tiempo transcurra, la grabación se detiene automáticamente y el bloque vuelve al modo de almacenamiento en buffer.
MaxBufferBytes long 0 (ilimitado) Memoria máxima del buffer en bytes. Cuando se excede, los fotogramas más antiguos se eliminan independientemente de la duración basada en tiempo. Establezca en 0 para eliminación basada solo en tiempo.

Constructor

public PreEventRecordingBlock(PreEventRecordingSettings settings, string muxFactoryName = "mp4mux")

Parámetros:

  • settings — Configuración de grabación pre-evento. Usa valores predeterminados si es null.
  • muxFactoryName — Nombre de fábrica del elemento muxer de GStreamer. Predeterminado: "mp4mux". Otras opciones: "matroskamux" (MKV), "mpegtsmux" (MPEG-TS).

Propiedades del bloque

Propiedad Tipo Descripción
AudioEnabled bool Habilitar/deshabilitar captura de audio. Establecer antes de iniciar el pipeline. Predeterminado: true.
State PreEventRecordingState Estado actual del bloque (solo lectura, thread-safe).
CurrentFilename string Nombre de archivo de grabación actual. Null cuando no está grabando.
BufferTotalBytes long Total de bytes almacenados actualmente en el buffer circular.
BufferedDuration TimeSpan Duración actual de los medios almacenados en buffer.
DebugLogPath string Ruta al archivo de registro de depuración. Cuando no es null, escribe depuración detallada de marcas de tiempo de fotogramas.

Máquina de estados

El bloque sigue una máquina de estados bien definida:

stateDiagram-v2
    [*] --> Idle
    Idle --> Buffering : Build() / StartBuffering()
    Buffering --> Recording : TriggerRecording()
    Recording --> PostEventRecording : Pre-event buffer flushed
    PostEventRecording --> Buffering : Post-event timer expires
    PostEventRecording --> Buffering : StopRecording()
    Buffering --> Stopped : StopBuffering()
    PostEventRecording --> Stopped : StopBuffering()
    Stopped --> Buffering : StartBuffering()
Estado Descripción
Idle No inicializado o no iniciado.
Buffering Almacenando activamente fotogramas en el buffer circular, sin grabar a archivo.
Recording Vaciando buffer pre-evento a archivo y capturando fotogramas en vivo.
PostEventRecording Fase post-evento — grabando fotogramas en vivo hasta que el temporizador expire.
Stopped Detenido e inactivo.

Eventos

public event EventHandler<PreEventRecordingEventArgs> OnRecordingStarted;
public event EventHandler<PreEventRecordingEventArgs> OnRecordingStopped;
public event EventHandler<PreEventRecordingEventArgs> OnStateChanged;

Propiedades de PreEventRecordingEventArgs:

Propiedad Tipo Descripción
State PreEventRecordingState Estado actual en el momento del evento.
Filename string Nombre de archivo de salida para la grabación.
PreEventDuration TimeSpan Duración pre-evento real incluida en el archivo (puede ser menor que la configurada si no hay suficientes datos almacenados o si la alineación de keyframes ajustó el inicio).

Métodos

Método Descripción
TriggerRecording(string filename) Vaciar el buffer circular al archivo especificado e iniciar la grabación de fotogramas en vivo. Si ya está grabando, extiende la grabación actual (reinicia el temporizador post-evento).
ExtendRecording() Reiniciar el temporizador post-evento. Llame a esto cuando la condición del disparador sigue activa (ej. el movimiento continúa).
StopRecording() Detener manualmente la grabación actual y volver al modo de almacenamiento en buffer.
StartBuffering() Iniciar o reanudar el almacenamiento en buffer después de estar detenido.
StopBuffering() Detener todo incluyendo el almacenamiento en buffer y limpiar el buffer.

El pipeline de muestra

Con una fuente de cámara local, detección de movimiento, vista previa de video y grabación pre-evento:

graph LR;
    VideoSource-->MotionDetector;
    MotionDetector-->VideoTee;
    VideoTee-->VideoRenderer;
    VideoTee-->H264Encoder;
    H264Encoder-->PreEventRecordingBlock;
    AudioSource-->AudioTee;
    AudioTee-->AudioRenderer;
    AudioTee-->AACEncoder;
    AACEncoder-->PreEventRecordingBlock;

Cuando se llama a TriggerRecording(), el bloque crea internamente un pipeline de salida dinámico:

graph LR;
    RingBuffer-->AppSrcVideo;
    RingBuffer-->AppSrcAudio;
    AppSrcVideo-->Muxer;
    AppSrcAudio-->Muxer;
    Muxer-->FileSink;

Código de muestra

El siguiente fragmento muestra cómo crear y conectar el bloque. Para una aplicación completa funcional con detección de movimiento, vista previa de video, soporte de cámara RTSP y UI WPF completa, vea la Guía de Grabación Pre-Evento.

// Configure pre-event settings
var preEventSettings = new PreEventRecordingSettings
{
    PreEventDuration = TimeSpan.FromSeconds(10),
    PostEventDuration = TimeSpan.FromSeconds(5)
};

// Create the block (MP4 output)
var preEventBlock = new PreEventRecordingBlock(preEventSettings, "mp4mux");
preEventBlock.AudioEnabled = true;

// Subscribe to events
preEventBlock.OnRecordingStarted += (s, args) =>
    Debug.WriteLine($"Recording started: {args.Filename}");
preEventBlock.OnRecordingStopped += (s, args) =>
    Debug.WriteLine($"Recording stopped: {args.Filename}");

// Connect encoded video and audio to the block
pipeline.Connect(h264Encoder.Output, preEventBlock.VideoInput);
pipeline.Connect(aacEncoder.Output, preEventBlock.AudioInput);

// Start pipeline — buffering begins immediately
await pipeline.StartAsync();

// Later: trigger recording on event
preEventBlock.TriggerRecording("/recordings/event_001.mp4");

// Extend if trigger condition persists
preEventBlock.ExtendRecording();

// Or stop manually
preEventBlock.StopRecording();

Opciones de formato de contenedor

Formato Nombre de Fábrica Muxer Ventajas Desventajas
MP4 mp4mux Más compatible, ampliamente soportado Requiere finalización (moov atom); el archivo puede corromperse si el proceso se cae durante la grabación
MPEG-TS mpegtsmux Seguro ante fallos — no requiere paso de finalización; el archivo siempre es reproducible Tamaño de archivo ligeramente mayor; menos soporte universal en algunos reproductores
MKV matroskamux Contenedor flexible; soporta muchos códecs Menos compatible con algunos reproductores móviles

Seguridad ante Fallos

Para aplicaciones de vigilancia donde los fallos del proceso son una preocupación, use MPEG-TS (mpegtsmux). Los archivos MP4 que no se finalizan correctamente (ej. debido a un fallo o corte de energía durante la grabación) pueden ser irreproducibles.

Plataformas

Windows, macOS, Linux, Android, iOS (la disponibilidad de plataforma depende del soporte de muxer y codificador de GStreamer).