Guía Completa de Captura de Video a Archivos AVI en Delphi¶
Al desarrollar aplicaciones multimedia en Delphi, la funcionalidad de captura de video es a menudo un requisito crítico. Esta guía explora cómo implementar captura de video de alta calidad a archivos AVI usando el componente TVFVideoCapture en aplicaciones Delphi. Cubriremos todo desde la configuración de códecs hasta la configuración de parámetros de audio y el inicio del proceso de captura.
Entendiendo la Captura de Video AVI en Delphi¶
El componente TVFVideoCapture proporciona una forma potente y flexible de capturar video directamente a formato AVI en aplicaciones Delphi. AVI (Audio Video Interleave) sigue siendo un formato contenedor de video popular debido a su amplia compatibilidad y confiabilidad para propósitos de grabación.
Al implementar la captura de video en su aplicación Delphi, necesitará considerar varios aspectos clave:
- Seleccionar códecs de video y audio apropiados
- Configurar parámetros de audio
- Establecer el formato de salida y modo de captura
- Gestionar el proceso de captura
Esta guía proporciona explicaciones detalladas y ejemplos de código para cada uno de estos pasos.
Trabajando con Códecs de Video y Audio¶
Recuperando Códecs Disponibles¶
Antes de capturar video, necesitará poblar su aplicación con los códecs de video y audio disponibles. El componente TVFVideoCapture hace esto sencillo:
procedure TMyForm.PopulateCodecLists;
var
I: Integer;
begin
// Limpiar elementos existentes
cbVideoCodecs.Items.Clear;
cbAudioCodecs.Items.Clear;
// Poblar códecs de video
for I := 0 to VideoCapture1.Video_Codecs_GetCount - 1 do
cbVideoCodecs.Items.Add(VideoCapture1.Video_Codecs_GetItem(i));
// Poblar códecs de audio
for I := 0 to VideoCapture1.Audio_Codecs_GetCount - 1 do
cbAudioCodecs.Items.Add(VideoCapture1.Audio_Codecs_GetItem(i));
end;
Para desarrolladores usando C++ MFC, el código equivalente sería:
void CMyDialog::PopulateCodecLists()
{
// Limpiar elementos existentes
m_VideoCodecsCombo.ResetContent();
m_AudioCodecsCombo.ResetContent();
// Poblar códecs de video
for (int i = 0; i < m_VideoCapture.Video_Codecs_GetCount(); i++) {
CString codecName = m_VideoCapture.Video_Codecs_GetItem(i);
m_VideoCodecsCombo.AddString(codecName);
}
// Poblar códecs de audio
for (int i = 0; i < m_VideoCapture.Audio_Codecs_GetCount(); i++) {
CString codecName = m_VideoCapture.Audio_Codecs_GetItem(i);
m_AudioCodecsCombo.AddString(codecName);
}
}
Para desarrolladores VB6, aquí está cómo implementar la misma funcionalidad:
Private Sub PopulateCodecLists()
' Limpiar elementos existentes
cboVideoCodecs.Clear
cboAudioCodecs.Clear
' Poblar códecs de video
Dim i As Integer
For i = 0 To VideoCapture1.Video_Codecs_GetCount - 1
cboVideoCodecs.AddItem VideoCapture1.Video_Codecs_GetItem(i)
Next i
' Poblar códecs de audio
For i = 0 To VideoCapture1.Audio_Codecs_GetCount - 1
cboAudioCodecs.AddItem VideoCapture1.Audio_Codecs_GetItem(i)
Next i
End Sub
Seleccionando Códecs para Captura¶
Una vez que haya poblado las listas, necesitará permitir a los usuarios seleccionar sus códecs preferidos y aplicar esas selecciones al componente de captura:
procedure TMyForm.ApplyCodecSelections;
begin
if cbVideoCodecs.ItemIndex >= 0 then
VideoCapture1.Video_Codec := cbVideoCodecs.Items[cbVideoCodecs.ItemIndex];
if cbAudioCodecs.ItemIndex >= 0 then
VideoCapture1.Audio_Codec := cbAudioCodecs.Items[cbAudioCodecs.ItemIndex];
end;
Implementación C++ MFC:
void CMyDialog::ApplyCodecSelections()
{
int videoIndex = m_VideoCodecsCombo.GetCurSel();
if (videoIndex >= 0) {
CString videoCodec;
m_VideoCodecsCombo.GetLBText(videoIndex, videoCodec);
m_VideoCapture.Video_Codec = videoCodec;
}
int audioIndex = m_AudioCodecsCombo.GetCurSel();
if (audioIndex >= 0) {
CString audioCodec;
m_AudioCodecsCombo.GetLBText(audioIndex, audioCodec);
m_VideoCapture.Audio_Codec = audioCodec;
}
}
Implementación VB6:
Private Sub ApplyCodecSelections()
If cboVideoCodecs.ListIndex >= 0 Then
VideoCapture1.Video_Codec = cboVideoCodecs.Text
End If
If cboAudioCodecs.ListIndex >= 0 Then
VideoCapture1.Audio_Codec = cboAudioCodecs.Text
End If
End Sub
Configurando Parámetros de Audio¶
La captura de audio de calidad requiere una configuración adecuada de tres parámetros clave:
- Canales de Audio: Típicamente 1 (mono) o 2 (estéreo)
- Bits Por Muestra (BPS): Los valores comunes incluyen 8, 16, o 24 bits
- Tasa de Muestreo: Las tasas estándar incluyen 44100 Hz (calidad CD) o 48000 Hz
Aquí está cómo aplicar estos ajustes en Delphi:
procedure TMyForm.ConfigureAudioSettings;
begin
// Aplicar configuración de canales de audio (mono/estéreo)
VideoCapture1.Audio_Channels := StrToInt(cbChannels.Items[cbChannels.ItemIndex]);
// Establecer bits por muestra para calidad de audio
VideoCapture1.Audio_BPS := StrToInt(cbBPS.Items[cbBPS.ItemIndex]);
// Configurar tasa de muestreo
VideoCapture1.Audio_SampleRate := StrToInt(cbSampleRate.Items[cbSampleRate.ItemIndex]);
end;
Implementación C++ MFC:
void CMyDialog::ConfigureAudioSettings()
{
CString channelStr, bpsStr, sampleRateStr;
// Obtener valores seleccionados de los combo boxes
m_ChannelsCombo.GetLBText(m_ChannelsCombo.GetCurSel(), channelStr);
m_BpsCombo.GetLBText(m_BpsCombo.GetCurSel(), bpsStr);
m_SampleRateCombo.GetLBText(m_SampleRateCombo.GetCurSel(), sampleRateStr);
// Aplicar configuración de canales de audio
m_VideoCapture.Audio_Channels = _ttoi(channelStr);
// Establecer bits por muestra
m_VideoCapture.Audio_BPS = _ttoi(bpsStr);
// Configurar tasa de muestreo
m_VideoCapture.Audio_SampleRate = _ttoi(sampleRateStr);
}
Implementación VB6:
Private Sub ConfigureAudioSettings()
' Aplicar configuración de canales de audio
VideoCapture1.Audio_Channels = CInt(cboChannels.Text)
' Establecer bits por muestra
VideoCapture1.Audio_BPS = CInt(cboBPS.Text)
' Configurar tasa de muestreo
VideoCapture1.Audio_SampleRate = CInt(cboSampleRate.Text)
End Sub
Configurando Formato de Salida y Modo de Captura¶
El siguiente paso es configurar el formato de salida como AVI y establecer el modo de captura apropiado:
procedure TMyForm.PrepareForCapture;
begin
// Establecer AVI como formato de salida
VideoCapture1.OutputFormat := Format_AVI;
// Configurar modo de captura de video
VideoCapture1.Mode := Mode_Video_Capture;
end;
Implementación C++ MFC:
void CMyDialog::PrepareForCapture()
{
// Establecer AVI como formato de salida
m_VideoCapture.OutputFormat = Format_AVI;
// Configurar modo de captura de video
m_VideoCapture.Mode = Mode_Video_Capture;
}
Implementación VB6:
Private Sub PrepareForCapture()
' Establecer AVI como formato de salida
VideoCapture1.OutputFormat = Format_AVI
' Configurar modo de captura de video
VideoCapture1.Mode = Mode_Video_Capture
End Sub
Iniciando y Gestionando el Proceso de Captura¶
Una vez que todo está configurado, puede iniciar el proceso de captura:
procedure TMyForm.StartCapture;
begin
try
// Establecer nombre de archivo de salida
VideoCapture1.Output := ExtractFilePath(Application.ExeName) + 'VideoCapturado.avi';
// Iniciar proceso de captura
VideoCapture1.Start;
// Actualizar UI para mostrar captura en progreso
btnStart.Enabled := False;
btnStop.Enabled := True;
lblStatus.Caption := 'Grabando...';
except
on E: Exception do
ShowMessage('Error al iniciar captura: ' + E.Message);
end;
end;
Implementación C++ MFC:
void CMyDialog::StartCapture()
{
try {
TCHAR appPath[MAX_PATH];
GetModuleFileName(NULL, appPath, MAX_PATH);
CString appDir = appPath;
int pos = appDir.ReverseFind('\\');
if (pos != -1) {
appDir = appDir.Left(pos + 1);
}
// Establecer nombre de archivo de salida
m_VideoCapture.Output = appDir + _T("VideoCapturado.avi");
// Iniciar proceso de captura
m_VideoCapture.Start();
// Actualizar UI
GetDlgItem(IDC_START_BUTTON)->EnableWindow(FALSE);
GetDlgItem(IDC_STOP_BUTTON)->EnableWindow(TRUE);
SetDlgItemText(IDC_STATUS_STATIC, _T("Grabando..."));
}
catch (COleDispatchException* e) {
CString errorMsg = _T("Error al iniciar captura: ");
errorMsg += e->m_strDescription;
MessageBox(errorMsg, _T("Error"), MB_ICONERROR);
e->Delete();
}
}
Implementación VB6:
Private Sub StartCapture()
On Error GoTo ErrorHandler
' Establecer nombre de archivo de salida
VideoCapture1.Output = App.Path & "\VideoCapturado.avi"
' Iniciar proceso de captura
VideoCapture1.Start
' Actualizar UI
btnStart.Enabled = False
btnStop.Enabled = True
lblStatus.Caption = "Grabando..."
Exit Sub
ErrorHandler:
MsgBox "Error al iniciar captura: " & Err.Description, vbExclamation
End Sub
Manejando la Finalización de la Captura¶
Es importante proporcionar funcionalidad para detener el proceso de captura:
procedure TMyForm.StopCapture;
begin
try
// Detener el proceso de captura
VideoCapture1.Stop;
// Actualizar UI
btnStart.Enabled := True;
btnStop.Enabled := False;
lblStatus.Caption := 'Captura completada';
// Opcionalmente abrir el archivo capturado
if FileExists(VideoCapture1.Output) and (MessageDlg('¿Abrir video capturado?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
ShellExecute(0, 'open', PChar(VideoCapture1.Output), nil, nil, SW_SHOW);
except
on E: Exception do
ShowMessage('Error al detener captura: ' + E.Message);
end;
end;
Implementación C++ MFC:
void CMyDialog::StopCapture()
{
try {
// Detener el proceso de captura
m_VideoCapture.Stop();
// Actualizar UI
GetDlgItem(IDC_START_BUTTON)->EnableWindow(TRUE);
GetDlgItem(IDC_STOP_BUTTON)->EnableWindow(FALSE);
SetDlgItemText(IDC_STATUS_STATIC, _T("Captura completada"));
// Opcionalmente abrir el archivo capturado
CString outputFile = m_VideoCapture.Output;
if (PathFileExists(outputFile) &&
MessageBox(_T("¿Abrir video capturado?"), _T("Confirmación"),
MB_YESNO | MB_ICONQUESTION) == IDYES) {
ShellExecute(NULL, _T("open"), outputFile, NULL, NULL, SW_SHOW);
}
}
catch (COleDispatchException* e) {
CString errorMsg = _T("Error al detener captura: ");
errorMsg += e->m_strDescription;
MessageBox(errorMsg, _T("Error"), MB_ICONERROR);
e->Delete();
}
}
Implementación VB6:
Private Sub StopCapture()
On Error GoTo ErrorHandler
' Detener el proceso de captura
VideoCapture1.Stop
' Actualizar UI
btnStart.Enabled = True
btnStop.Enabled = False
lblStatus.Caption = "Captura completada"
' Opcionalmente abrir el archivo capturado
If Dir(VideoCapture1.Output) <> "" Then
If MsgBox("¿Abrir video capturado?", vbQuestion + vbYesNo) = vbYes Then
Shell "explorer.exe """ & VideoCapture1.Output & """", vbNormalFocus
End If
End If
Exit Sub
ErrorHandler:
MsgBox "Error al detener captura: " & Err.Description, vbExclamation
End Sub
Conclusión¶
Implementar captura de video a archivos AVI en aplicaciones Delphi usando el componente TVFVideoCapture es un proceso directo cuando entiende los conceptos clave. Siguiendo esta guía, puede crear aplicaciones multimedia robustas con funcionalidad de captura de video profesional.
El componente TVFVideoCapture proporciona una amplia gama de características adicionales y opciones de personalización más allá de lo cubierto en esta guía, incluyendo efectos de video, superposiciones y configuración de propiedades de dispositivo.
Recuerde probar exhaustivamente su implementación de captura de video con diferentes códecs y configuraciones de audio para asegurar la mejor calidad para su caso de uso específico.
Para ejemplos de código adicionales y guía de implementación, visite nuestro repositorio de GitHub. Si necesita más asistencia con este tutorial, nuestro equipo de soporte está disponible para ayudar.