2010-07-02 17 views
5

he desarrollado una aplicación de Windows que captura vídeo desde un dispositivo externo a través de DirectShow. La resolución de imagen es de 640x480 y los videos guardados sin compresión tienen tamaños muy grandes (aproximadamente 27 MB por segundo).en tiempo real de codificación de vídeo en DirectShow

Mi objetivo es reducir este tamaño tanto como sea posible, así que estoy buscando un codificador que me permita comprimir el video en tiempo real. Podría ser H.264, MPEG-2 o cualquier otra cosa. Debe permitirme guardar el video en el disco y sería mejor si también pudiera transmitirlo en tiempo real a través de la red (Wi-Fi, por lo que el tamaño debería ser de alrededor de 1 MB por segundo o menos). La significativa pérdida de calidad sería inaceptable.

Descubrí que obtener un filtro de DirectShow apropiado para esta tarea es muy difícil. Se puede suponer que la máquina cliente es razonablemente moderna (CPU rápida de 2 núcleos) y puede utilizar CUDA/OpenCL. Hay algunas aplicaciones que permiten codificar videos usando CUDA y ofrecen un buen rendimiento, sin embargo, no he encontrado un filtro DirectShow apropiado o una API que pueda usarse para desarrollar uno. NVIDIA nvcuvenc.dll parece tener API privada, por lo que no puedo usarla directamente. Cualquier codificador basado en CPU que he encontrado es demasiado lento para mis requerimientos, pero tal vez me he perdido algunos.

¿Alguien podría recomendarme una solución, es decir, un codificador (pagado o gratis, que se puede utilizar en una aplicación de código cerrado) que puede lograr un buen rendimiento, independientemente de si utiliza CPU/CUDA/OpenCL o DirectCompute? ¿O tal vez debería usar un codificador de video de hardware externo?

Saludos,

MadBadger

+0

No sé si encontraste una solución para esto, pero mientras tanto desarrollé la codificación Transport Stream para mi producto, tal vez esa solución también sería aceptable para usted ya que está hablando de la transmisión a través de la WiFi –

Respuesta

3

que filtra han intentado?

Si solo se trata de 640x480, cualquier codificador comercial de calidad razonable debería funcionar bien siempre que elija una tasa de bits realista. La aceleración de hardware usando Cuda o OpenCL no debería ser requerida. H264 requiere un poco más de potencia y requerirá más núcleos de CPU, pero Mpeg2 o cualquiera de los códecs de la era h263 (xvid, wmv9, divx, etc.) no deberían tener problemas incluso en una CPU modesta. Transmitirlo por la red al mismo tiempo requiere un poco más de esfuerzo, pero aún debería ser posible.

No está basado en DirectShow, pero VLC Media Player puede hacer todo esto. Se basa en el proyecto de código abierto FFMpeg. Algunas versiones están licenciadas por LGPL, por lo que la biblioteca podría incorporarse a su proyecto sin muchas restricciones.

Si solo quiere un conjunto de filtros DirectShow que manejarán todo esto por usted, he tenido buenos resultados con productos MainConcept's antes. Aunque están en el extremo caro del espectro.

+0

Gracias, me he registrado para la evaluación de MainConcept SDKs. Escribiré sobre los resultados más tarde. – madbadger

+0

Tal como se esperaba, el codificador CUDA H.264 de MainConcept es lo suficientemente rápido y está bien documentado. Con "lo suficientemente rápido" me refiero a que puedo lograr la codificación VGA 30fps en tiempo real en una máquina moderna promedio sin pérdida de calidad visible y los archivos resultantes son 50-100 veces más pequeños que los originales no comprimidos. El único inconveniente es el alto precio de los componentes. – madbadger

+0

He escrito soluciones comerciales usando los filtros de MainConcept. Descubrí que su filtro mux H.264 gastó memoria y su soporte es muy deficiente. Sin embargo, sus filtros codificadores y decodificadores son geniales. – fishfood

1

No especifica qué filtros ha intentado, o qué significa 'significativa' la pérdida de calidad, así que lo mejor que sospecho que podemos hacer es sugerir algunos codificadores para ver si cumplen con sus requisitos.

Dos buenos son los filtros del codificador de video Theora y WebM (puede obtenerlos de un solo instalador en xiph.org). Ambos son codificadores de alta calidad que se pueden ajustar para equilibrar el rendimiento frente a la calidad. WebM puede usar múltiples procesadores al codificar, lo que podría ayudar en su situación. Ambos también se usan con video HTML5, por lo que puede ser una ventaja adicional para usted.

4

Dado que está utilizando Directshow, con mucho, lo más fácil sería usar WMV9 dentro de un contenedor ASF. Esto es más fácil porque está disponible en casi todas las máquinas de Windows (muy pocas dependencias de tiempo de instalación), decentemente rápido (no debería tener problemas al usarlo en una máquina razonablemente moderna) y la calidad es razonable. Pero teniendo en cuenta que su límite es de 8 mbit/seg (1 MB/seg), la calidad no es un problema para usted. 2 mbit/seg, la resolución VGA WMV9 debería verse bastante bien.

No es tan bueno como una implementación decente de H264, pero desde el punto de vista de la implementación, vas a ahorrarte mucho tiempo yendo por esta ruta.

ver esto:

http://msdn.microsoft.com/en-us/library/dd375008%28v=VS.85%29.aspx

+0

Parece bastante complicado crear un perfil y configurar ASFWriter para el códec WMV9. Tampoco he encontrado una buena guía para eso, solo los documentos menos útiles de MicroSoft. – Macke

1

Olvídate de WMV codificación para la transmisión en tiempo real. WMV funciona bien para transmisiones de baja calidad en tiempo real, pero no hace una codificación de alta calidad en tiempo real.

Sugiero que eche un vistazo a MainConcept's SDK. Hacen una serie de filtros DirectShow para codificar H.264. Implementé la transmisión en tiempo real y el multiplexado de transmisiones codificadas en H.264 usando el códec MainConcept y los filtros DirectShow, y es genial.

Esperanza esto ayuda

1

estoy usando Windows Media Encoder para la codificación en tiempo real, y funciona bien incluso en la resolución 720x576. Un ejemplo de su uso está en VideoPhill Recorder.

Está escrito en .NET puro con DirectShow.NET para la captura y windowsMedia.NET para la codificación.

Utilizando estos dos puedo lograr una codificación en tiempo real con estabilidad 24/7.

Y ambas bibliotecas son gratuitas en Windows, por lo que no tendrá que pagar ninguna licencia, excepto OS.

1

Las pruebas de ffdshow aprovechan las x264 cosas de ffmpeg, que se dice que son bastante rápidas (creo que sí). También libjpeg-turbo podría ayudar, o elegir algún otro codec hecho para alto rendimiento como camstudio's o lo que no.

actualización: ffmpeg puede tomar la entrada directshow ahora: http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=3&t=27

0

Si usted puede permanecer en o por debajo de 1280x1024, Micorsofts codificador MPEG-2 (incluido en Vista y hacia arriba) es bastante bueno.

Sin embargo, no he conseguido que funcione para contenido de 1080p. Sospecho que el codificador simplemente aborta con eso. Vergüenza.

+0

no compatible con Win x64 – Ludwo

0

Ver la CaptureDS muestra de C# que viene con AVBlocks. Muestra cómo construir un grabador de video con AVBlocks y DirectShow.DirectShow se utiliza para la captura de video y AVBlocks se usa para codificación de video:

+0

¿Podría publicar la parte central del código del enlace? – Lizz