Biblioteca VoIP .NET

Estoy buscando una biblioteca de VoIP que cumpla con los siguientes criterios:

  • escrito en .NET o al menos con interfaz .NET
  • una interfaz clara (como "código limpio") sería una gran ventaja
  • debe ser compatible con llamadas IP directas
  • debe admitir G711 (PCMA) aLaw 8kHz mono
  • debe admitir la grabación simultánea a la conversación real
  • Debo poder suscribirme al mensaje SIP INFO y enviar mensajes SIP INFO con carga útil personalizada
  • debe admitir SRTP o cifrado de todo el transporte por TLS
  • licencia:
    • no debe exigirnos que abramos nuestro software
    • debe costar menos de 30,000 $
    • no debe incurrir en costos por cada dispositivo vendido (solo requerimos una línea/puerto, pero venderemos varios dispositivos)

Me encantaría recibir informes de primera mano sobre el nivel de soporte (qué tan rápido reaccionan, qué tan útil es la respuesta...) y qué buena es la interfaz. Los detalles técnicos los puedo y tendré que verificar por mi cuenta de todos modos.

Como ya investigué un poco, esta es la lista de bibliotecas que estoy investigando actualmente, agrupadas según qué tan bien se ajustan a nuestras necesidades (en un análisis preliminar):

Prometedor:

No tan prometedor:

De nada:

Ozeki camera sdk solo usa otro software gratuito. Http://net7mma.codeplex.com ff mpeg y Fluorixe fx

Respuestas (5)

Mi proyecto, Managed Media Aggregation , hace todo lo que necesita con rtp y rtsp, incluye un cliente y un servidor que son eficientes y cumplen con los estándares.

El servidor admite más de 1000 clientes sin ningún problema y el uso de la memoria rara vez supera los 150 mb, incluso cuando esos clientes consumen medios.

La solución también tiene algunas implementaciones de códecs, pero solo Jpeg es completamente compatible en este momento, aunque existen herramientas útiles para casi todos los códecs y formatos de contenedores documentados, incluidos h264 y mpeg.

Próximamente se admitirán la reproducción y la decodificación, así como la codificación.

Puede obtener las cosas para sorber en sipsorcery.codeplex.com

Si necesita los códecs ahora, entonces:

La transcodificación de audio se puede lograr usando naudio o bass .

El video será su dominio problemático, pero no estoy seguro de si ese es un aspecto de su proyecto.

El costo neto aquí es solo su tiempo o lo que dona.

MMA utiliza la Licencia Apache 2.0 .

Gracias por su excelente publicación y su información sobre las bibliotecas VoIP y la biblioteca Ozeki en particular. Siempre me preguntaba cómo el manejo de medios escrito en .net puede estar libre de tartamudeos incluso bajo una carga pesada (especialmente cuando se está ejecutando el GC, lo que interfiere con el procesamiento de otros subprocesos). Te agradecería mucho si pudieras profundizar en el tema. ¿Quizás ya has escrito una publicación en el blog? ¿Quizás es "simple" porque todo ya está manejado por un código no administrado existente? ...
Me pregunto especialmente sobre eso porque Ozeki afirmó que no es un problema. Les pregunté específicamente cómo se aseguran de que el GC no presente tartamudeo. Dijeron que habían hecho "optimizaciones" para evitar eso. Desafortunadamente, nunca fueron más específicos sobre los detalles técnicos y sigo siendo un poco escéptico...
Desafortunadamente, Ozeki no está haciendo decodificación administrada, están usando ffmpeg, investigue cscodec. Es posible que el gc no introduzca studder si no tiene suficiente presión de memoria en primer lugar para causarlo. Todavía no tengo un blog, pero respondo preguntas en la página del proyecto que tiene un hilo donde se discute la decodificación h264.

Como hemos investigado a los bibliotecarios de manera bastante extensa, me gustaría compartir nuestros hallazgos con usted.

Ahora, básicamente, he llegado a aceptar que la calidad de la interfaz de básicamente todas las bibliotecas de VoIP es... bueno... ¡mala! Al menos desde el punto de vista de los desarrolladores de Clean-Code. Las excepciones como "La licencia no es válida o venció o ocurrió cualquier otro error" son estándar. Es posible que algunos nunca arrojen excepciones, sino que generen un evento en respuesta. El evento contiene una cadena que se "Inicializará" o, si no, el motivo del error. Eso sí, el evento no es asíncrono, ocurre antes de que finalice el método.

Otros tienen nombres crípticos (muchas abreviaturas crípticas. No me refiero a cosas como DTMF, que puedes buscar fácilmente en Google y averiguar qué significa). Una biblioteca tenía bastantes errores tipográficos.

Otras bibliotecas ofrecen de nuevo importaciones nativas de C++ con las que tendrá que trabajar unsafemucho. Algunos ofrecen envoltorios COM o incluso .net DLL, pero si desea hacer cosas más avanzadas como el almacenamiento en búfer, aún necesitará usar punteros / código no seguro. Estos ni siquiera están envueltos, IntPtrpero lo están long bufferPointer. Con los tipos de bibliotecas, también es bastante común que haya propiedades como int IsLoopbackInterfaceEnabledde dónde necesita convertir inta boolusted mismo.

Actualización - Problemas con Ozeki

Tuvimos algunas malas experiencias con Ozeki, por lo que tengo que retirar mi declaración anterior. Entonces, esto es lo que salió mal (aparte de varios errores que detectamos y los arreglamos): Primero, detectamos un problema de calidad de audio. Como algunos VoIP-HW personalizados y dispositivos de radio estaban involucrados (que sí influyen en la calidad), hemos realizado muchas pruebas. Finalmente pudimos señalarlo en el SDK de Ozeki y le preguntamos a Ozeki al respecto. Era un problema conocido con la configuración predeterminada con respecto a la API de audio de Windows (Wasapi o API de forma de onda) que emplea Ozeki SDK.

Ahora bien, esto no fue el final de la misma. Cambiar la API de audio en la aplicación de muestra (la proporcionada por Ozeki) o en algunas aplicaciones de demostración que escribimos nosotros mismos funcionó bien. Sin embargo, en nuestra aplicación real, cambiar solo una línea de configuración da como resultado que no se emita ningún audio desde los altavoces. Nuevamente, le pedí ayuda a Ozeki. Pensé que tal vez es solo otro problema conocido. no es. Entonces, después de algunas discusiones, acordamos que deberían investigar una reproducción que funcione completamente. Así que les he enviado uno. Su respuesta fue que el problema probablemente estaba relacionado con la instanciación del altavoz.. Por lo tanto, no investigaron a fondo el problema, sino que están tratando de engañarme con algunas respuestas genéricas. Por desgracia, hubo más discusión y su siguiente sugerencia fue que la inicialización debería hacerse en otro momento (aunque significaban algo diferente). Así que invertí algunas horas más y probé muchas combinaciones, incluida la inicialización en el subproceso de la GUI, no hacerlo en el subproceso de la GUI, etc., etc. No ayudó. Su respuesta final fue que funciona en su aplicación de muestra, por lo que el problema debe estar relacionado con nuestra aplicación.Esta es una excusa realmente lamentable si alguna vez he escuchado una. (Además: al cambiar la configuración a la otra API, funciona "sin problemas" (mala calidad de audio), y según Ozeki, cambiar la API no debería tener efectos secundarios).

Envié el Repro-Case a Ozeki el 12 de diciembre de 2014 y el problema no se resolvió hasta ahora (8 de junio de 2015).

También hay otros problemas con el SDK de Ozeki que ralentizan el desarrollo. Para algunos de ellos hay soluciones alternativas (que son un dolor) y para algunos de ellos no las hay (lo que es aún más doloroso).

Finalmente, hemos tomado la decisión de pedirle a nuestro departamento de desarrollo de C++ que escriba un servicio de VoIP basado en PJSIP para nosotros. Según nuestro desarrollador, es una delicia.

aquí está el texto original sobre Ozeki SDK:

Finalmente hemos decidido conformarnos con el SDK de Ozeki . Consideramos que su API es la mejor de todas las bibliotecas examinadas (aunque aún está lejos de ser perfecta). Eso sí, las excepciones no son muy claras (oh, entonces me estás diciendo que la dirección es incorrecta, ¿por qué no me das un ejemplo de una dirección correcta?) y la "máquina de estado" de los objetos no es muy clara (pág. .Ej. para un IPhoneCallpuedes llamar .Start()dos veces. La segunda vez no hay excepción, nada. Pero no funciona, no importa si llamaste.HangUp()antes o no. Esto significa que solo puede usar el objeto una vez, para una llamada, lo cual está perfectamente bien. Sería mejor si el método lanzara una excepción y me dijera que no puedo usarlo). El soporte de Ozeki también parecía estar bien. Cuentan con una extensa documentación de VoIP en el sitio web y también ofrecen muchos proyectos de ejemplo de C#. En general, fue la interfaz más fácil de usar. Y la funcionalidad/calidad de audio también está bien. En cuanto al precio, también está bien (al menos para nuestro escenario).

Aquí hay una breve lista de notas que tomé con respecto a los otros SDK:

  • Abto : ActiveX, COM y DLL disponibles.
    • necesita usar long pointer/ código no seguro para algunos métodos
    • mensajes de excepción inespecíficos
    • booleanse representan comoint
    • errores tipográficos
    • básicamente no hay abstracción orientada a objetos - todo se hace usando elCAbtoPhoneClass
    • hay un montón de eventos. La interfaz no es limpia y fácil de entender, necesita leer mucha documentación para saber qué hacer.
  • envoltorio pjsip
    • contenedor directo a c lib (básicamente una importación nativa)
  • mejor PCB
    • Solo uno en el que el código C# de ejemplo viene con una solución VS2013 actualizada
    • necesidad de subclase GTAPIEnv. ¿Qué tan feo es eso?
    • Configure los ajustes por métodos como SetInteger(string name, int value). ¡Lo opuesto a una interfaz limpia!
  • Motor de medios VoIP de LanScape
    • sin abstracción orientada a objetos
    • en cambio, uno trabaja mucho con arreglos. Cosas como .PhoneLineRecording[2]y .PhoneLineState[2]. ¡Así que 1990!
    • Los errores se representan como enumeraciones. Están abreviados, medio comprensibles.
  • PortSIP VoIP SDK
    • interfaz de importación directa de DLL
  • SDK de cliente SIP de Conaito
    • única excepción genérica como "VOIP SDK Failed". Si no recuerdo mal, tendría que leer una propiedad para obtener (un poco) más información sobre el problema. Hola, concurrencia? Por supuesto.
    • Crear instancias de la clase API requiere una referencia a un archivo Windows.Forms.Control. WPF, ¿alguien? Servicio sin GUI, ¿alguien?
  • Teléfono SDK VaxVoIP SIP
    • una vez más, bools se representan como ints
    • cada método devuelve un int. Codificación estilo C. Siempre compare el código de retorno con 0 para averiguar si funcionó. Para obtener más información, debe leer una .Errorpropiedad (¿seguridad de subprocesos? ¡Adiós!)
    • no muy bien documentado, tienes que buscar en los ejemplos para encontrar cosas.
    • de nuevo, hay muchos eventos: vaya a leer la documentación durante horas.
  • SDK de IntTalk VoIP
    • de hecho, dejaron de vender el SDK recientemente. Ahora ofrecen programar software VoIP personalizado para usted.
Usan software de código abierto y te lo venden. Puede corregir o informar los errores usted mismo y no pagar nada.
@Jay: Sé que este es el caso de cosas como FluorineFX y otras. Pero, ¿qué pasa con todo el manejo de SIP, RTP y SRTP? ¿Qué bibliotecas están usando para esto? El problema es que se requiere mucho conocimiento para armar esas cosas para que funcionen de manera confiable. Sin embargo, debo admitir que últimamente me ha decepcionado bastante la calidad del SDK de Ozeki.
Sipsorcery para sorbo y srtp. Mi biblioteca para el resto. Mira mi respuesta. Al final, esa compañía no está haciendo nada más que apoyar el software de código abierto por un cargo.
@Jay: ¿alguna vez ha considerado hacer eso: admitir software de código abierto por un cargo? Porque sería mucho más fácil "venderle" esto a mi jefe en lugar de donaciones... ;-)
Mi biblioteca tiene apoyo gratuito, si gana dinero con el proyecto, una donación debería ser tan buena como comprar algo y también se puede usar como una deducción de impuestos.
@Jay: ¿tiene un SLA de soporte? A muchas empresas les gusta el modelo de código abierto, pero requieren una respuesta de soporte dentro de ciertos límites.
Si necesita uno, entonces algo podría resolverse, estoy seguro, pero el soporte es gratuito si el problema es con mi software. Vea la página del proyecto para una prueba de eso: P

También evalúo a Ozaki durante algunas semanas. Parece muy prometedor, pero como recién llegado, encuentro que no está bien documentado (al menos para mí que no tengo experiencia en el dominio de VoIP, deseo más verbosidad, por ejemplo, en lo que respecta a errores), algo inconsistente entre lanzamientos consecutivos , y su sitio me parece muy abarrotado de mucha información, pero no bien organizado. También me parece que es tremendamente caro.

¿Has mirado también en otras bibliotecas? Presumiblemente, yo y otros probablemente estaríamos muy interesados ​​​​en una comparación, incluso una subjetiva e incompleta. Si lo comparo con otras bibliotecas, en realidad creo que Ozeki no es caro en absoluto; depende de cuántos canales/conexión simultánea necesite. Si necesita muchos de ellos, entonces sí, es caro.
En primer lugar, soy muy nuevo en esto. Así que no estoy muy familiarizado con los precios y otros aspectos. Acabo de descargar Conaito, VaxVOIP y Abto VoIP. Por ejemplo, me tentó el softphone web de VaxVoip. Pero desafortunadamente no pude simplemente regsvr32 su DLL en mi computadora portátil Win 8.1 x64, por lo que no pude profundizar más. Así sigo un rato con Ozaki. Lo que me frustra de Ozaki es que comencé entre dos lanzamientos, con el último, sus ejemplos dejaron de funcionar bien, y no me parecen muy cooperativos para proporcionar algunas pistas.
Y realmente no puedo pensar en comprar un SDK costoso si al menos sus ejemplos básicos no puedo lograr que funcionen.
No pagaría nada por ozeki, el software es un software gratuito empaquetado que ha sido ofuscado.
que software libre? de todos modos, me parece muy caro, pero por lo demás parece prometedor. Además, no me gusta su apoyo. no es muy amigable

Estoy usando Ozeki SDK. Según mi experiencia, las últimas versiones (1.3.7 y 1.3.8) no funcionan como se esperaba en algunos casos.

También casi no hay soporte en absoluto.

Estoy probando https://sites.google.com/site/sipekvoip/ ahora mismo, es prometedor.

Pruebe PortSIP VoIP SDK ( https://www.portsip.com/portsip-voip-sdk/ ).

Este es el SDK potente y fácil de usar, compatible con múltiples plataformas; El proyecto de muestra gratuito se puede descargar para probar.

Y esto es lo más importante: PortSIP VoIP SDK no se deriva de ningún otro proyecto de código abierto. Hasta donde yo sé, muchos SDK simplemente se modificaron a partir de un proyecto de código abierto como Linphone y luego se venden como comerciales.