Saltar a contenido

Video Capture SDK para Delphi

Video Capture SDK Delphi

Esta sección describe cómo usar el Video Capture SDK con Delphi para crear aplicaciones de captura de vídeo y audio. El componente TVFVideoCapture (declarado en VideoCaptureMain.pas) es un descendiente de TCustomPanel, por lo que actúa tanto como superficie de previsualización como expone toda la API de captura mediante propiedades publicadas, métodos y eventos.

Componente principal

TVFVideoCapture

TVFVideoCapture proporciona funcionalidad completa de captura de vídeo y audio. Puede arrastrarlo a un formulario desde la paleta del IDE o crearlo en tiempo de ejecución. Como desciende de TCustomPanel, establezca Parent y Align igual que en cualquier otro contenedor VCL.

var
  VideoCapture1: TVFVideoCapture;
begin
  VideoCapture1 := TVFVideoCapture.Create(Self);
  VideoCapture1.Parent := Panel1;
  VideoCapture1.Align := alClient;
end;

Enumeración de dispositivos

Rellene combo-boxes con los dispositivos de captura de vídeo y audio detectados en el host. El SDK expone pares _GetCount / _GetItem(Index) para cada lista de dispositivos.

procedure TForm1.EnumerateDevices;
var
  i: Integer;
begin
  // Dispositivos de captura de vídeo
  cbVideoDevices.Clear;
  for i := 0 to VideoCapture1.Video_CaptureDevices_GetCount - 1 do
    cbVideoDevices.Items.Add(VideoCapture1.Video_CaptureDevices_GetItem(i));

  // Dispositivos de captura de audio
  cbAudioDevices.Clear;
  for i := 0 to VideoCapture1.Audio_CaptureDevices_GetCount - 1 do
    cbAudioDevices.Items.Add(VideoCapture1.Audio_CaptureDevices_GetItem(i));
end;

Previsualización

Cambie el componente a Mode_Video_Preview para mostrar el vídeo en directo en el panel sin escribir nada en disco. La monitorización de audio se controla mediante Audio_PlayAudio.

procedure TForm1.StartPreview;
begin
  // Selección de dispositivos por su nombre de visualización
  VideoCapture1.Video_CaptureDevice := cbVideoDevices.Text;
  VideoCapture1.Audio_CaptureDevice := cbAudioDevices.Text;

  // Modo previsualización (sin salida a fichero)
  VideoCapture1.Mode := Mode_Video_Preview;
  VideoCapture1.Audio_PlayAudio := True;

  VideoCapture1.Start;
end;

procedure TForm1.StopPreview;
begin
  VideoCapture1.Stop;
end;

Captura a un fichero

Cambie a Mode_Video_Capture y asigne Output_Filename y Output_Format. La enumeración TVFOutputFormat lista todos los contenedores que el componente puede escribir (Format_MP4, Format_AVI, Format_WMV, Format_DV, Format_WebM, Format_FFMPEG, Format_FFMPEGX, etc.).

procedure TForm1.StartCapture;
begin
  VideoCapture1.Video_CaptureDevice := cbVideoDevices.Text;
  VideoCapture1.Audio_CaptureDevice := cbAudioDevices.Text;
  VideoCapture1.Audio_RecordAudio := True;

  // Fichero de salida y contenedor
  VideoCapture1.Output_Filename := 'C:\Videos\capture.mp4';
  VideoCapture1.Output_Format := Format_MP4;

  // Cambia al modo captura
  VideoCapture1.Mode := Mode_Video_Capture;

  VideoCapture1.Start;
end;

Puede cambiar el fichero de salida al vuelo, sin detener el grafo, llamando a OutputFilename_ChangeOnTheFly.

Capturas de fotograma

Guarde el fotograma actual de la previsualización en disco en cualquiera de los valores TVFImageFormat admitidos (IM_BMP, IM_JPEG, IM_PNG, IM_GIF, IM_TIFF). El tercer parámetro es la calidad JPEG (se ignora para los demás formatos).

procedure TForm1.TakeSnapshot;
begin
  VideoCapture1.Frame_Save('C:\Photos\snapshot.jpg', IM_JPEG, 85);
end;

Para obtener el fotograma directamente en un TBitmap (por ejemplo, para mostrarlo en un TImage), utilice Frame_GetCurrent:

procedure TForm1.TakeSnapshotToMemory;
var
  Bitmap: TBitmap;
begin
  Bitmap := TBitmap.Create;
  try
    VideoCapture1.Frame_GetCurrent(Bitmap);
    Image1.Picture.Assign(Bitmap);
  finally
    Bitmap.Free;
  end;
end;

Cámaras IP (RTSP / HTTP)

Cambie el modo a Mode_IP_Preview o Mode_IP_Capture y establezca IP_Camera_URL. Use IP_Camera_Type para elegir el motor y el protocolo — por ejemplo IP_RTSP_TCP para RTSP sobre TCP mediante el motor FFmpeg, o IP_Auto_VLC para recurrir a la fuente VLC incluida.

procedure TForm1.ConnectIPCamera;
begin
  VideoCapture1.IP_Camera_URL := 'rtsp://user:password@192.168.1.100:554/stream';
  VideoCapture1.IP_Camera_Type := IP_RTSP_TCP;
  VideoCapture1.Mode := Mode_IP_Preview;
  VideoCapture1.Start;
end;

Captura de pantalla

El componente graba el escritorio, una pantalla individual, una región o una ventana. Defina el rectángulo de captura (o active la pantalla completa), elija una frecuencia de fotogramas y, a continuación, cambie a Mode_Screen_Capture.

procedure TForm1.StartScreenCapture;
begin
  // Captura a pantalla completa a 30 fps con el cursor del ratón incluido
  VideoCapture1.Screen_Capture_FullScreen := True;
  VideoCapture1.Screen_Capture_FrameRate := 30.0;
  VideoCapture1.Screen_Capture_Grab_Mouse_Cursor := True;

  VideoCapture1.Output_Filename := 'C:\Videos\screen.mp4';
  VideoCapture1.Output_Format := Format_MP4;

  VideoCapture1.Mode := Mode_Screen_Capture;
  VideoCapture1.Start;
end;

Para capturar una región, desactive Screen_Capture_FullScreen y proporcione Screen_Capture_Left, Screen_Capture_Top, Screen_Capture_Right y Screen_Capture_Bottom (todos en píxeles). Consulte Implementación de captura de pantalla para ver el conjunto completo de opciones.

Efectos de vídeo

Los efectos (brillo, contraste, saturación, volteo, desenfoque, escala de grises, sepia y muchos más) se gestionan con Video_Effect_Ex. Active primero la canalización de efectos con Video_Effects_Enabled := True y luego añada cada efecto mediante su valor TVFEffectType. El argumento Amount es la intensidad del efecto — para ef_contrast desplaza el contraste, para ef_flip_right funciona como un indicador de activación, etc.

procedure TForm1.ApplyVideoEffects;
begin
  VideoCapture1.Video_Effects_Enabled := True;

  // ID=1, aplicado a todo el grafo (StartTime=0, StopTime=0), activado,
  // efecto de contraste con intensidad = 20
  VideoCapture1.Video_Effect_Ex(1, 0, 0, True, ef_contrast, 20.0, '');

  // ID=2, volteo horizontal
  VideoCapture1.Video_Effect_Ex(2, 0, 0, True, ef_flip_right, 0.0, '');
end;

Elimine efectos individuales con Video_Effects_Remove(ID) o bórrelos todos con Video_Effects_Clear.

Superposición de texto

Utilice Video_Effects_Text_Logo (superposición GDI clásica) o Video_Effects_Text_Logo_Plus (superposición GDI+ moderna con degradados, rotación y efectos de contorno) para incrustar texto en el flujo de vídeo. El ejemplo siguiente emplea Video_Effects_Text_Logo_Plus.

procedure TForm1.AddTextOverlay;
begin
  VideoCapture1.Video_Effects_Enabled := True;

  // ID=10, duración completa (0..0), activado, «My Video» en (10, 10),
  // Arial 24, sin negrita/cursiva/subrayado/tachado, color blanco
  VideoCapture1.Video_Effects_Text_Logo_Plus(
    10, 0, 0, True, 'My Video', 10, 10,
    'Arial', 24, False, False, False, False, clWhite);
end;

Eventos

TVFVideoCapture dispara tres eventos principales de ciclo de vida: OnStart, OnStop y OnError. Ninguno lleva un parámetro SenderOnError recibe el mensaje de error como WideString.

procedure TForm1.VideoCapture1Start;
begin
  Button1.Caption := 'Detener';
end;

procedure TForm1.VideoCapture1Stop;
begin
  Button1.Caption := 'Iniciar';
end;

procedure TForm1.VideoCapture1Error(ErrorText: WideString);
begin
  ShowMessage('Error de captura: ' + ErrorText);
end;

Otros eventos cubren el acceso en directo a tramas (OnVideoFrame, OnAudioFrame), la detección de movimiento (OnMotion), la actividad del ratón y del teclado sobre la superficie de previsualización, los valores de los vúmetros, los eventos de transporte DV y la búsqueda de canales del sintonizador de TV.

Recursos de desarrollo

Para una guía de implementación detallada, consulte estos recursos esenciales:

Tutoriales de implementación

Grabación y procesamiento de audio

Domine la captura de audio con estas guías paso a paso:

Captura de vídeo y control de dispositivos

Aprenda las técnicas esenciales de manejo de vídeo:

Técnicas multimedia avanzadas

Explore escenarios de implementación sofisticados: