Saltar a contenido

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

Try it Download Windows trial dotnet add package VisioForge.DotNet.MediaBlocks Pricing →

Media Blocks SDK .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 : pipeline start / StartBuffering()
    Buffering --> Recording : TriggerRecording()
    Recording --> PostEventRecording : Pre-event buffer flushed
    PostEventRecording --> Buffering : Post-event timer expires / StopRecording() / StartBuffering() / format change
    Recording --> Buffering : StopRecording() / StartBuffering() / format change / trigger failed
    Idle --> Stopped : StopBuffering()
    Buffering --> Stopped : StopBuffering() / pipeline stop
    Recording --> Stopped : StopBuffering() / pipeline stop
    PostEventRecording --> Stopped : StopBuffering() / pipeline stop
    Stopped --> Buffering : StartBuffering() / restart after a pipeline stop
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 Sin almacenamiento en buffer. Tras detener el pipeline, un reinicio reanuda el almacenamiento en buffer; tras StopBuffering(), solo StartBuffering() lo reanuda.

Un cambio del formato codificado durante una ejecución — resolución, perfil, nivel, datos de códec, o la frecuencia, el número de canales o el códec de audio — cierra una grabación en curso, igual que StopRecording(), y descarta los fotogramas almacenados de ese flujo. El otro flujo permanece en el búfer. El archivo siguiente se construye con el formato nuevo. Una frecuencia de imagen o una relación de aspecto de píxel repetidas no cierran la grabación.

Eventos

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

Los eventos se generan de uno en uno, en el orden en que ocurrieron los cambios: un controlador nunca se ejecuta al mismo tiempo que otro, y OnRecordingStopped llega después del OnRecordingStarted del mismo archivo y una vez finalizado el archivo. Mientras se ejecuta un controlador, todo lo que provoca un evento nuevo — StopRecording(), StopBuffering(), StartBuffering(), TriggerRecording(), la detención del pipeline o un cambio de formato, en otro hilo o dentro del propio controlador — regresa antes de que se genere ese evento; el hilo que ejecuta el controlador lo genera cuando el controlador termina. Por eso un controlador puede ejecutarse en un hilo de trabajo aunque la llamada se haya hecho en el hilo de la interfaz, y después de detener el pipeline o de liberar el bloque; pase al hilo de la interfaz antes de tocar los controles. StopRecording(), StopBuffering(), StartBuffering() y TriggerRecording() vuelven a lanzar lo que lanzaron los controladores de los eventos que generaron; en el temporizador posterior al evento, el inicio o la detención del pipeline o un cambio de formato, la excepción se registra como error.

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). Se rechaza, con un error, hasta que llega el primer fotograma de vídeo codificado y, si el audio está habilitado, hasta que llega el primer fotograma de audio codificado. Una llamada posterior graba con normalidad.
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. Los fotogramas se almacenan solo mientras el pipeline está en marcha. Si se llama antes de iniciar el pipeline, genera OnStateChanged con Buffering de inmediato, y el inicio no lo vuelve a generar. No hace nada si el bloque ya está almacenando en buffer.
StopBuffering() Detener todo incluyendo el almacenamiento en buffer y limpiar el buffer. El bloque permanece detenido, también tras reiniciar el pipeline, hasta StartBuffering(). Una llamada repetida no genera ningún evento.

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).