Estoy buscando una biblioteca de VoIP que cumpla con los siguientes criterios:
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:
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 .
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 unsafe
mucho. 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, IntPtr
pero lo están long bufferPointer
. Con los tipos de bibliotecas, también es bastante común que haya propiedades como int IsLoopbackInterfaceEnabled
de dónde necesita convertir int
a bool
usted mismo.
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.
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 IPhoneCall
puedes 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).
long pointer
/ código no seguro para algunos métodosboolean
se representan comoint
CAbtoPhoneClass
GTAPIEnv
. ¿Qué tan feo es eso?SetInteger(string name, int value)
. ¡Lo opuesto a una interfaz limpia!.PhoneLineRecording[2]
y .PhoneLineState[2]
. ¡Así que 1990!Windows.Forms.Control
. WPF, ¿alguien? Servicio sin GUI, ¿alguien?bool
s se representan como int
s.Error
propiedad (¿seguridad de subprocesos? ¡Adiós!)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.
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.
Arrendajo
bozojoe