Salida de Archivo AVI en los SDK .NET de VisioForge¶
Video Capture SDK .Net Video Edit SDK .Net Media Blocks SDK .Net
AVI (Audio Video Interleave) es un formato de contenedor multimedia desarrollado por Microsoft que almacena tanto datos de audio como de video en un solo archivo con reproducción sincronizada. Soporta tanto datos comprimidos como sin comprimir, ofreciendo flexibilidad aunque a veces resulta en tamaños de archivo más grandes.
Descripción técnica del formato AVI¶
Los archivos AVI usan una estructura RIFF (Resource Interchange File Format) para organizar datos. Este formato divide el contenido en fragmentos, con cada fragmento conteniendo cuadros de audio o video. Los aspectos técnicos clave incluyen:
- Formato de contenedor que soporta múltiples códecs de audio y video
- Datos de audio y video intercalados para reproducción sincronizada
- Tamaño máximo de archivo de 4GB en AVI estándar (extendido a 16EB en OpenDML AVI)
- Soporte para múltiples pistas de audio y subtítulos
- Ampliamente soportado en plataformas y reproductores de medios
A pesar de que formatos de contenedor más nuevos como MP4 y MKV ofrecen más características, AVI sigue siendo valioso para ciertos flujos de trabajo debido a su simplicidad y compatibilidad con sistemas heredados.
Implementación AVI multiplataforma¶
VideoCaptureCoreX VideoEditCoreX MediaBlocksPipeline
La clase AVIOutput proporciona una forma robusta de configurar y generar archivos AVI con varias opciones de codificación.
Configuración de salida AVI¶
Cree una instancia de AVIOutput especificando un nombre de archivo de destino:
Este constructor inicializa automáticamente los codificadores predeterminados:
- Video: Codificador OpenH264
- Audio: Codificador MP3
Opciones de codificador de video¶
Configure la codificación de video a través de la propiedad Video con varios codificadores disponibles:
Codificador estándar¶
// Codificador H.264 de código abierto para uso general
aviOutput.Video = new OpenH264EncoderSettings();
Codificadores acelerados por hardware¶
// Aceleración GPU NVIDIA
aviOutput.Video = new NVENCH264EncoderSettings(); // H.264
aviOutput.Video = new NVENCHEVCEncoderSettings(); // HEVC
// Aceleración Intel Quick Sync
aviOutput.Video = new QSVH264EncoderSettings(); // H.264
aviOutput.Video = new QSVHEVCEncoderSettings(); // HEVC
// Aceleración GPU AMD
aviOutput.Video = new AMFH264EncoderSettings(); // H.264
aviOutput.Video = new AMFHEVCEncoderSettings(); // HEVC
Codificador de propósito especial¶
// Motion JPEG para codificación cuadro por cuadro de alta calidad
aviOutput.Video = new MJPEGEncoderSettings();
Opciones de codificador de audio¶
La propiedad Audio le permite configurar los ajustes de codificación de audio:
// Codificación MP3 estándar
aviOutput.Audio = new MP3EncoderSettings();
// Opciones de codificación AAC
aviOutput.Audio = new VOAACEncoderSettings();
aviOutput.Audio = new AVENCAACEncoderSettings();
aviOutput.Audio = new MFAACEncoderSettings(); // Solo Windows
Integración con componentes del SDK¶
Video Capture SDK¶
Video Edit SDK¶
Media Blocks SDK¶
var aac = new VOAACEncoderSettings();
var h264 = new OpenH264EncoderSettings();
var aviSinkSettings = new AVISinkSettings("output.avi");
var aviOutput = new AVIOutputBlock(aviSinkSettings, h264, aac);
Gestión de archivos¶
Puede obtener o cambiar el nombre de archivo de salida después de la inicialización:
// Obtener nombre de archivo actual
string archivoActual = aviOutput.GetFilename();
// Establecer nuevo nombre de archivo
aviOutput.SetFilename("nueva_salida.avi");
Ejemplo completo¶
Aquí hay un ejemplo completo que muestra cómo configurar salida AVI con aceleración de hardware:
// Crear salida AVI con nombre de archivo especificado
var aviOutput = new AVIOutput("salida_alta_calidad.avi");
// Configurar codificación H.264 acelerada por NVIDIA
aviOutput.Video = new NVENCH264EncoderSettings();
// Configurar codificación de audio AAC
aviOutput.Audio = new VOAACEncoderSettings();
Implementación AVI específica de Windows¶
VideoCaptureCore VideoEditCore
Los componentes solo Windows proporcionan opciones adicionales para configuración de salida AVI.
Configuración básica¶
Cree el objeto AVIOutput:
Métodos de configuración¶
Método 1: Usando diálogo de configuración¶
var aviSettingsDialog = new AVISettingsDialog(
VideoCapture1.Video_Codecs.ToArray(),
VideoCapture1.Audio_Codecs.ToArray());
aviSettingsDialog.ShowDialog(this);
aviSettingsDialog.SaveSettings(ref aviOutput);
Método 2: Configuración programática¶
Primero, obtenga los códecs disponibles:
// Llenar listas de códecs
foreach (string codec in VideoCapture1.Video_Codecs)
{
cbVideoCodecs.Items.Add(codec);
}
foreach (string codec in VideoCapture1.Audio_Codecs)
{
cbAudioCodecs.Items.Add(codec);
}
Luego establezca la configuración de video y audio:
// Configurar video
aviOutput.Video_Codec = cbVideoCodecs.Text;
// Configurar audio
aviOutput.ACM.Name = cbAudioCodecs.Text;
aviOutput.ACM.Channels = 2;
aviOutput.ACM.BPS = 16;
aviOutput.ACM.SampleRate = 44100;
aviOutput.ACM.UseCompression = true;
Implementación¶
Aplique la configuración e inicie la captura:
// Establecer formato de salida
VideoCapture1.Output_Format = aviOutput;
// Establecer modo de captura
VideoCapture1.Mode = VideoCaptureMode.VideoCapture;
// Establecer ruta del archivo de salida
VideoCapture1.Output_Filename = "output.avi";
// Iniciar captura
await VideoCapture1.StartAsync();
Mejores prácticas para salida AVI¶
Guías de selección de codificador¶
- Aplicaciones de propósito general
- OpenH264 proporciona buena compatibilidad y calidad
-
Adecuado para la mayoría de escenarios de desarrollo estándar
-
Aplicaciones críticas en rendimiento
- Use codificadores acelerados por hardware (NVENC, QSV, AMF) cuando estén disponibles
-
Ofrece ventajas significativas de rendimiento con pérdida mínima de calidad
-
Aplicaciones enfocadas en calidad
- Los codificadores HEVC proporcionan mejor compresión a calidad similar
- MJPEG para escenarios que requieren precisión cuadro por cuadro
Recomendaciones de codificación de audio¶
- MP3: Buena compatibilidad con calidad razonable
- AAC: Mejor relación calidad-tamaño, preferido para aplicaciones más nuevas
- Elija según su plataforma objetivo y requisitos de calidad
Consideraciones de plataforma¶
- Algunos codificadores son específicos de plataforma:
- Los codificadores MF HEVC y MF AAC son solo Windows
-
Los codificadores acelerados por hardware requieren soporte de GPU apropiado
-
Verifique la disponibilidad del codificador con
GetVideoEncoders()yGetAudioEncoders()al desarrollar aplicaciones multiplataforma
Consejos de manejo de errores¶
- Siempre verifique la disponibilidad del codificador antes de usar
- Implemente codificadores de respaldo para escenarios específicos de plataforma
- Verifique permisos de escritura de archivo antes de establecer rutas de salida
Solución de problemas comunes¶
Códec no encontrado¶
Si encuentra errores de "Códec no encontrado":
// Verificar si el códec está disponible antes de usar
if (!VideoCapture1.Video_Codecs.Contains("H264"))
{
// Recurrir a otro códec o mostrar error
MessageBox.Show("Códec H264 no disponible. Por favor instale los códecs requeridos.");
return;
}
Problemas de permisos de escritura de archivo¶
Maneje errores relacionados con permisos:
try
{
// Probar permisos de escritura
using (var fs = File.Create(rutaSalida, 1, FileOptions.DeleteOnClose)) { }
// Si es exitoso, proceder con salida AVI
aviOutput.SetFilename(rutaSalida);
}
catch (UnauthorizedAccessException)
{
// Manejar error de permisos
MessageBox.Show("No se puede escribir en la ubicación especificada. Por favor seleccione otra carpeta.");
}
Problemas de memoria con archivos grandes¶
Para manejar grabación de archivos grandes:
// Dividir grabación en múltiples archivos cuando se alcanza el límite de tamaño
void ConfigurarGrabacionArchivoGrande()
{
var aviOutput = new AVIOutput("grabacion_parte1.avi");
// Establecer límite de tamaño de archivo (3.5GB para mantenerse bajo el límite de 4GB de AVI)
aviOutput.MaxFileSize = 3.5 * 1024 * 1024 * 1024;
// Habilitar funcionalidad de división automática
aviOutput.AutoSplit = true;
aviOutput.SplitNamingPattern = "grabacion_parte{0}.avi";
// Aplicar a Video Capture
var core = new VideoCaptureCoreX();
core.Outputs_Add(aviOutput, true);
}