<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>  Blog</title>
        <link>https://www.plugnmeet.org/es/blog</link>
        <description>  Blog</description>
        <lastBuildDate>Sat, 03 Oct 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>es</language>
        <copyright>Copyright © 2026 MynaParrot SL.</copyright>
        <item>
            <title><![CDATA[Software de aula virtual de código abierto: pizarra, salas de grupos, encuestas y más]]></title>
            <link>https://www.plugnmeet.org/es/blog/open-source-virtual-classroom-software</link>
            <guid>https://www.plugnmeet.org/es/blog/open-source-virtual-classroom-software</guid>
            <pubDate>Sat, 03 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Cuando busca software de aula virtual, usted no necesita otra videollamada genérica. Necesita un aula en línea donde pueda enseñar: explicar en la pizarra, dividir en grupos pequeños, hacer una prueba rápida, decidir quién habla y comparte, y continuar la lección dentro de Moodle o la plataforma de su centro.]]></description>
            <content:encoded><![CDATA[<p>Cuando busca <strong>software de aula virtual</strong>, usted no necesita otra videollamada genérica. Necesita un aula en línea donde pueda enseñar: explicar en la pizarra, dividir en grupos pequeños, hacer una prueba rápida, decidir quién habla y comparte, y continuar la lección dentro de Moodle o la plataforma de su centro.</p>
<p>Una reunión genérica le da video y chat. Un aula virtual de verdad le ayuda a enseñar como en persona: mostrar, dialogar en grupos, comprobar comprensión, tomar notas juntos y mantener la clase concentrada — todo en una sala privada que usted controla.</p>
<p>Eso es plugNmeet: <strong>software de aula virtual de código abierto</strong> con pizarra compartida, salas de grupos, encuestas tipo prueba, notas compartidas, sala de espera, controles sencillos e integración con Moodle. Gratuito, privado por diseño, con su propio logo y colores.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="qué-distingue-al-software-de-aula-virtual">¿Qué distingue al software de aula virtual?<a href="https://www.plugnmeet.org/es/blog/open-source-virtual-classroom-software#qu%C3%A9-distingue-al-software-de-aula-virtual" class="hash-link" aria-label="Enlace directo al ¿Qué distingue al software de aula virtual?" title="Enlace directo al ¿Qué distingue al software de aula virtual?" translate="no">​</a></h2>
<p>Una reunión conecta personas. Un aula les ayuda a aprender. Eso exige otras herramientas:</p>
<ol>
<li class=""><strong>Enseñe visualmente:</strong> una pizarra interactiva multiusuario donde puede escribir y marcar sus archivos de clase, no solo compartir pantalla.</li>
<li class=""><strong>Trabaje en grupos pequeños:</strong> salas de grupos donde cada equipo conserva lo mismo — pizarra, notas, audio y video.</li>
<li class=""><strong>Compruebe comprensión en vivo:</strong> pruebas cortas y encuestas con resultados al instante, no respuestas perdidas en el chat.</li>
<li class=""><strong>Tome notas juntos:</strong> notas de clase que todos pueden seguir y repasar después.</li>
<li class=""><strong>Mantenga la concentración:</strong> sala de espera, mano levantada y controles sencillos de sonido, cámara, chat y pantalla.</li>
<li class=""><strong>Quédese en su curso:</strong> abra la clase desde Moodle o su plataforma educativa — con asistencia y calificaciones.</li>
<li class=""><strong>Proteja los datos del alumnado:</strong> sus clases y grabaciones MP4 (un archivo por lección) quedan en su propio sistema, no en la nube de otra empresa.</li>
</ol>
<p>Así lo resuelve plugNmeet — sin conocimientos técnicos. Los asistentes de IA opcionales solo ahorran tiempo: texto a esquema en la pizarra y ayuda rápida de escritura en las notas.</p>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="1-pizarra-interactiva-que-toda-la-clase-puede-usar-a-la-vez">1. Pizarra interactiva que toda la clase puede usar a la vez<a href="https://www.plugnmeet.org/es/blog/open-source-virtual-classroom-software#1-pizarra-interactiva-que-toda-la-clase-puede-usar-a-la-vez" class="hash-link" aria-label="Enlace directo al 1. Pizarra interactiva que toda la clase puede usar a la vez" title="Enlace directo al 1. Pizarra interactiva que toda la clase puede usar a la vez" translate="no">​</a></h2>
<p>La pizarra es el corazón del aula en línea. La nuestra es una pizarra interactiva multiusuario dentro de la clase — sin ventanas extra ni retardos.</p>
<p>Puede escribir, dibujar formas, flechas y texto, y abrir sus archivos de clase (PDF, presentaciones, documentos de Word) directamente en la pizarra. Muestre una guía y resuelva con el grupo, destaque puntos clave de una diapositiva o deje que el alumnado dibuje y escriba con usted al mismo tiempo. ¿Necesita un esquema con prisa? Escriba lo que quiere mostrar — por ejemplo un diagrama para su lección — y el asistente de IA crea un dibujo inicial editable que pueden explicar y cambiar juntos. ¿Necesita silencio mientras explica? Con un clic, configure la pizarra para solo lectura. Y funciona igual en las salas de grupos pequeños.</p>
<p>Lea más en <a class="" href="https://www.plugnmeet.org/es/blog/integrated-whiteboard-experience">la experiencia de pizarra integrada</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="2-salas-de-grupos-donde-se-puede-trabajar-de-verdad">2. Salas de grupos donde se puede trabajar de verdad<a href="https://www.plugnmeet.org/es/blog/open-source-virtual-classroom-software#2-salas-de-grupos-donde-se-puede-trabajar-de-verdad" class="hash-link" aria-label="Enlace directo al 2. Salas de grupos donde se puede trabajar de verdad" title="Enlace directo al 2. Salas de grupos donde se puede trabajar de verdad" translate="no">​</a></h2>
<p>Dividir una clase grande en grupos pequeños convierte oyentes callados en participantes activos: diálogo por parejas, proyectos en grupo, revisión entre compañeros, resolución de problemas.</p>
<p>Cree salas en un clic, reparta al azar o coloque usted a cada estudiante, ponga temporizador, envíe avisos a todas las salas («¡quedan 5 minutos!»), entre a ayudar y traiga a todos de vuelta automáticamente. Y cada grupo recibe una <strong>mini-aula completa</strong>: su propia pizarra, notas compartidas, encuestas, audio, video y pantalla compartida.</p>
<p>Incluso puede enviar sus páginas de pizarra, notas y encuestas a las salas para que nadie empiece desde una página en blanco. Vea <a class="" href="https://www.plugnmeet.org/es/blog/mastering-breakout-rooms">cómo dominar las salas de grupos</a> y <a class="" href="https://www.plugnmeet.org/es/blog/anatomy-of-a-perfect-online-workshop">la anatomía del taller en línea perfecto</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="3-pruebas-rápidas-y-mano-levantada">3. Pruebas rápidas y mano levantada<a href="https://www.plugnmeet.org/es/blog/open-source-virtual-classroom-software#3-pruebas-r%C3%A1pidas-y-mano-levantada" class="hash-link" aria-label="Enlace directo al 3. Pruebas rápidas y mano levantada" title="Enlace directo al 3. Pruebas rápidas y mano levantada" translate="no">​</a></h2>
<p>Preguntar «¿alguna duda?» en el chat suele traer silencio. Las actividades sencillas traen respuestas.</p>
<p>Prepare una prueba o encuesta en segundos, deje votar — de forma anónima si quiere — vea las respuestas en vivo y comparta un gráfico claro con la clase. Úsela para comprobar un concepto antes de avanzar, preguntar si el ritmo es «muy rápido / bien / muy lento», votar qué repasar o cerrar con una pregunta de salida. Combine con <strong>mano levantada</strong> para preguntas ordenadas — el alumnado avisa sin interrumpir y usted da la palabra cuando conviene.</p>
<p>Detalles: <a class="" href="https://www.plugnmeet.org/es/blog/engaging-audience-with-live-polls">cómo implicar con encuestas en vivo</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="4-notas-de-clase-que-todos-pueden-seguir">4. Notas de clase que todos pueden seguir<a href="https://www.plugnmeet.org/es/blog/open-source-virtual-classroom-software#4-notas-de-clase-que-todos-pueden-seguir" class="hash-link" aria-label="Enlace directo al 4. Notas de clase que todos pueden seguir" title="Enlace directo al 4. Notas de clase que todos pueden seguir" translate="no">​</a></h2>
<p>Tome notas donde ocurre la clase. Las notas compartidas están dentro de la sala, así docente y estudiantes escriben juntos resúmenes, puntos clave, tareas y enlaces — con títulos y formato limpio, sin pasar otro documento.</p>
<p>¿Poco tiempo? El asistente de IA puede continuar su borrador, corregir, simplificar o convertir notas largas en un resumen corto para compartir después. Cada grupo también tiene su propia página de notas en salas de grupos.</p>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="5-controles-sencillos-sala-de-espera-y-reglas-de-sonido-y-cámara">5. Controles sencillos: sala de espera y reglas de sonido y cámara<a href="https://www.plugnmeet.org/es/blog/open-source-virtual-classroom-software#5-controles-sencillos-sala-de-espera-y-reglas-de-sonido-y-c%C3%A1mara" class="hash-link" aria-label="Enlace directo al 5. Controles sencillos: sala de espera y reglas de sonido y cámara" title="Enlace directo al 5. Controles sencillos: sala de espera y reglas de sonido y cámara" translate="no">​</a></h2>
<p>Un aula en línea necesita las rutinas del aula física: cerrar la puerta, fijar turnos de palabra, recuperar la atención.</p>
<ul>
<li class=""><strong>Sala de espera:</strong> vea quién espera, deje entrar uno por uno o a todos juntos, y mantenga fuera a extraños.</li>
<li class=""><strong>Reglas sencillas de sonido y cámara:</strong> silencie la clase mientras expone, pause cámaras en grupos grandes para reducir distracciones, pause el chat durante la explicación y ábralo para preguntas, y reserve la pantalla compartida hasta que un estudiante deba presentar.</li>
<li class=""><strong>Ideal en equipo:</strong> una persona recibe y atiende al grupo mientras otra presenta la lección — perfecto para clases grandes.</li>
</ul>
<p>Empiece con la <a class="" href="https://www.plugnmeet.org/es/blog/moderator-guide-room-lock-settings">guía de bloqueos para moderadores</a> y <a class="" href="https://www.plugnmeet.org/es/blog/how-to-secure-your-online-classroom-for-teachers">cómo proteger su aula en línea</a>. La referencia completa paso a paso está en la <a class="" href="https://www.plugnmeet.org/es/docs/user-guide/moderator">Guía del moderador</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="6-dentro-de-moodle-y-su-plataforma-educativa--con-asistencia">6. Dentro de Moodle y su plataforma educativa — con asistencia<a href="https://www.plugnmeet.org/es/blog/open-source-virtual-classroom-software#6-dentro-de-moodle-y-su-plataforma-educativa--con-asistencia" class="hash-link" aria-label="Enlace directo al 6. Dentro de Moodle y su plataforma educativa — con asistencia" title="Enlace directo al 6. Dentro de Moodle y su plataforma educativa — con asistencia" translate="no">​</a></h2>
<p>La mejor aula virtual vive donde ya está su curso. plugNmeet se abre directamente dentro de Moodle como una actividad de clase — con el mismo aspecto, calendario, asistencia y calificaciones — y también funciona con otras plataformas educativas y sitios de cursos en WordPress y Joomla.</p>
<p>Además puede ver datos sencillos de participación: quién asistió, quién participó en encuestas y pizarra, quién habló y si una conexión débil afectó a alguien. Es opcional, privado de su centro educativo y desactivado salvo que usted decida activarlo.</p>
<p>Empiece aquí: <a class="" href="https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide">guía de videoconferencia con Moodle</a>, <a class="" href="https://www.plugnmeet.org/es/blog/no-code-video-conferencing-moodle">videoconferencia sin código en Moodle</a>, <a class="" href="https://www.plugnmeet.org/es/blog/classroom-analytics-for-educators">analítica del aula para docentes</a> y la documentación de <a class="" href="https://www.plugnmeet.org/es/docs/user-guide/moodle-integration">integración con Moodle</a>. ¿Cambia de herramienta? Vea nuestra <a class="" href="https://www.plugnmeet.org/es/blog/bigbluebutton-vs-plugnmeet-alternative">comparativa con BigBlueButton</a> y el <a class="" href="https://www.plugnmeet.org/es/docs/tutorials/migration-from-bbb">tutorial de migración</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="7-privado-con-cada-lección-guardada-en-un-solo-video">7. Privado, con cada lección guardada en un solo video<a href="https://www.plugnmeet.org/es/blog/open-source-virtual-classroom-software#7-privado-con-cada-lecci%C3%B3n-guardada-en-un-solo-video" class="hash-link" aria-label="Enlace directo al 7. Privado, con cada lección guardada en un solo video" title="Enlace directo al 7. Privado, con cada lección guardada en un solo video" translate="no">​</a></h2>
<p>Las clases no deberían depender de servidores ajenos. plugNmeet puede funcionar en el sistema de su propio centro con una instalación sencilla, sus grabaciones se guardan como un solo archivo de video MP4 por lección en su almacenamiento — fácil de ver, descargar o compartir — las tutorías privadas siguen privadas y la calidad del video se ajusta sola para que la lección continúe con Wi-Fi débil. Nuestra <a class="" href="https://www.plugnmeet.org/es/blog/recording-philosophy">filosofía de grabación</a> es simple: un archivo por lección, y se ve igual que la clase en vivo.</p>
<p>Para privacidad e instalación vea el <a class="" href="https://www.plugnmeet.org/es/docs/security-overview">Resumen de seguridad</a> y la <a class="" href="https://www.plugnmeet.org/es/docs/installation">guía de instalación</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="conclusión-deje-de-reunirse-y-empiece-a-enseñar">Conclusión: deje de reunirse y empiece a enseñar<a href="https://www.plugnmeet.org/es/blog/open-source-virtual-classroom-software#conclusi%C3%B3n-deje-de-reunirse-y-empiece-a-ense%C3%B1ar" class="hash-link" aria-label="Enlace directo al Conclusión: deje de reunirse y empiece a enseñar" title="Enlace directo al Conclusión: deje de reunirse y empiece a enseñar" translate="no">​</a></h2>
<p>Si está buscando un <strong>software para aulas virtuales</strong>, no se conforme con videollamadas y un enlace a pizarra. Elija una opción de código abierto que lo tenga todo en un mismo lugar: una pizarra para enseñar, salas de grupos, pruebas rápidas, notas compartidas, una sala de espera, controles sencillos, integración con Moodle, estadísticas de participación y alojamiento privado.</p>
<p>plugNmeet es gratuito, de código abierto y usado en clases, talleres y webinars. La misma sala sencilla también impulsa <a class="" href="https://www.plugnmeet.org/es/blog/open-source-webinar-software-platform">webinars de código abierto</a>.</p>
<hr>
<p><strong>¿Listo para poner en marcha su aula en línea?</strong></p>
<ul>
<li class=""><strong>Pruebe la <a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">demo en vivo</a>: abra la pizarra, prepare una prueba, pruebe salas de grupos</strong></li>
<li class=""><strong>Añádalo a Moodle en minutos: <a class="" href="https://www.plugnmeet.org/es/docs/user-guide/moodle-integration">documentación de Moodle</a></strong></li>
<li class=""><strong>Apoye el <a href="https://github.com/mynaparrot/plugNmeet-server" target="_blank" rel="noopener noreferrer" class="">proyecto en GitHub</a></strong></li>
</ul>]]></content:encoded>
            <category>aula-virtual</category>
            <category>código-abierto</category>
            <category>clase-en-línea</category>
            <category>educación</category>
            <category>tecnología-educativa</category>
            <category>pizarra</category>
            <category>salas-de-grupos</category>
            <category>encuestas</category>
            <category>moodle</category>
            <category>lms</category>
        </item>
        <item>
            <title><![CDATA[plugNmeet v2.5.0: pizarra CRDT, notas con IA, encuestas y salas de grupos]]></title>
            <link>https://www.plugnmeet.org/es/blog/plugnmeet-v2-5-0-crdt-whiteboard-ai-notes-polls-breakout-rooms</link>
            <guid>https://www.plugnmeet.org/es/blog/plugnmeet-v2-5-0-crdt-whiteboard-ai-notes-polls-breakout-rooms</guid>
            <pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Ya está aquí plugNmeet v2.5.0: pizarra con sincronización CRDT y Yjs, bloc de notas compartido en BlockNote con IA, texto a diagrama con IA, generación de encuestas con IA, salas de grupos rediseñadas y emisión WHIP.]]></description>
            <content:encoded><![CDATA[<p>Imagine esta situación. Su clase lleva veinte minutos dibujando en la pizarra. Un estudiante se incorpora tarde… y ve un lienzo en blanco. O dedica una hora a redactar las notas de la reunión en el bloc compartido y, al exportarlas, pierde todo el formato. ¿Le resulta familiar?</p>
<p>A nosotros también nos ha pasado. Precisamente por eso hemos creado <strong>plugNmeet v2.5.0</strong>.</p>
<p>No se trata de una actualización menor. Hemos sustituido tres motores de colaboración y los hemos reconstruido desde cero: la pizarra ahora funciona con <strong>sincronización CRDT</strong>, el antiguo bloc basado en Etherpad desaparece en favor de <strong>BlockNote + IA</strong> y las <strong>salas de grupos</strong> estrenan una arquitectura totalmente nueva. Además, la <strong>IA ya trabaja en tres lugares</strong> —pizarra, notas y encuestas— y ahora puede enviar encuestas a una sala en directo directamente desde su propio sistema.</p>
<p>Si busca una plataforma de <strong>videoconferencia autoalojada y gratuita</strong> que esté a la altura de sus reuniones, esta es la versión que conviene probar.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="el-problema-herramientas-que-no-siguen-el-ritmo">El problema: herramientas que no siguen el ritmo<a href="https://www.plugnmeet.org/es/blog/plugnmeet-v2-5-0-crdt-whiteboard-ai-notes-polls-breakout-rooms#el-problema-herramientas-que-no-siguen-el-ritmo" class="hash-link" aria-label="Enlace directo al El problema: herramientas que no siguen el ritmo" title="Enlace directo al El problema: herramientas que no siguen el ritmo" translate="no">​</a></h3>
<p>La mayoría de las <strong>alternativas a Zoom de código abierto</strong> resuelven bien el vídeo y el audio. Lo que falla es todo lo que ocurre alrededor de la llamada:</p>
<ul>
<li class=""><strong>Pizarras</strong> que se desincronizan en cuanto alguien se reconecta.</li>
<li class=""><strong>Notas compartidas</strong> ancladas en editores de hace una década, sin ayuda de IA.</li>
<li class=""><strong>Encuestas</strong> que tardan cinco minutos en crearse para una votación de treinta segundos.</li>
<li class=""><strong>Salas de grupos</strong> que no conservan el contenido, de modo que cada grupo empieza desde cero.</li>
</ul>
<p>Docentes, organizadores de eventos y equipos que usan plugNmeet a gran escala nos transmitieron estas cuatro quejas. Así que las hemos resuelto juntas, en una sola versión.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="la-solución-novedades-de-plugnmeet-v250">La solución: novedades de plugNmeet v2.5.0<a href="https://www.plugnmeet.org/es/blog/plugnmeet-v2-5-0-crdt-whiteboard-ai-notes-polls-breakout-rooms#la-soluci%C3%B3n-novedades-de-plugnmeet-v250" class="hash-link" aria-label="Enlace directo al La solución: novedades de plugNmeet v2.5.0" title="Enlace directo al La solución: novedades de plugNmeet v2.5.0" translate="no">​</a></h3>
<p>En resumen:</p>
<ul>
<li class=""><strong>Pizarra CRDT (Yjs)</strong> con almacenamiento de sincronización prioritario en el servidor: quienes se incorporan tarde la ven completa.</li>
<li class=""><strong>Bloc de notas compartido reconstruido sobre BlockNote</strong> con IA integrada: continuar textos, resumir, corregir, simplificar, instrucciones personalizadas.</li>
<li class=""><strong>Texto a diagrama con IA</strong> en la pizarra: escriba una frase y obtenga un diagrama de flujo o un modelo entidad-relación sobre el lienzo.</li>
<li class=""><strong>Encuestas rediseñadas + generación con IA</strong>: describa lo que necesita y reciba un borrador listo, además de modo cuestionario, votos anónimos y la nueva <a class="" href="https://www.plugnmeet.org/es/docs/api/room/create-poll">API de creación de encuestas</a>.</li>
<li class=""><strong>Salas de grupos rediseñadas</strong>: comparta páginas de pizarra, contenido del bloc y encuestas en las salas secundarias.</li>
<li class=""><strong>Compatibilidad con WHIP</strong> para emisión en directo, además de puntos de control gzip y diferencias incrementales que reducen notablemente el ancho de banda.</li>
</ul>
<p>Veamos cada punto con detalle.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="una-pizarra-que-por-fin-sincroniza-crdt--yjs">Una pizarra que por fin sincroniza: CRDT + Yjs<a href="https://www.plugnmeet.org/es/blog/plugnmeet-v2-5-0-crdt-whiteboard-ai-notes-polls-breakout-rooms#una-pizarra-que-por-fin-sincroniza-crdt--yjs" class="hash-link" aria-label="Enlace directo al Una pizarra que por fin sincroniza: CRDT + Yjs" title="Enlace directo al Una pizarra que por fin sincroniza: CRDT + Yjs" translate="no">​</a></h3>
<p>Nuestra pizarra anterior funcionaba bien… hasta que dejaba de hacerlo. Reconexiones, incorporaciones tardías, redes inestables. Faltaban trazos o, peor aún, cada participante veía una pizarra distinta.</p>
<p>En la v2.5.0, la pizarra funciona con <strong>CRDT de Yjs</strong>, el mismo modelo que empleamos para el bloc de notas. Cada página es un <code>Y.Doc</code>, la presencia de los cursores viaja por <code>y-protocols/awareness</code> y la sincronización es <strong>prioritaria en el servidor</strong>:</p>
<ol>
<li class="">Su cliente solicita primero el punto de control oficial al servidor.</li>
<li class="">Si no hay respuesta, reintenta una vez y después pide la diferencia.</li>
<li class="">Si no hay ningún presentador en línea, el servidor sirve el estado inicial directamente desde Redis.</li>
<li class="">A partir de ahí, solo circulan puntos de control comprimidos con gzip y diferencias incrementales —nunca el estado completo— y las peticiones se distribuyen entre un máximo de 3 participantes.</li>
</ol>
<p>¿Qué significa esto para usted? Un estudiante que se incorpora 20 minutos tarde ve la pizarra completa en uno o dos segundos. Las páginas sobreviven a recargas gracias a IndexedDB. Y el consumo de ancho de banda disminuye. Creemos que es el mayor salto de fiabilidad que hemos logrado en la pizarra desde que presentamos <a class="" href="https://www.plugnmeet.org/es/blog/integrated-whiteboard-experience">la experiencia de pizarra integrada</a>.</p>
<p>También hemos cuidado los detalles: se recupera la última página al cambiar de archivo, los mensajes privados de la pizarra permanecen privados y los punteros se mueven con mayor fluidez.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="adiós-a-etherpad-hola-al-bloc-compartido-con-ia">Adiós a Etherpad. Hola al bloc compartido con IA.<a href="https://www.plugnmeet.org/es/blog/plugnmeet-v2-5-0-crdt-whiteboard-ai-notes-polls-breakout-rooms#adi%C3%B3s-a-etherpad-hola-al-bloc-compartido-con-ia" class="hash-link" aria-label="Enlace directo al Adiós a Etherpad. Hola al bloc compartido con IA." title="Enlace directo al Adiós a Etherpad. Hola al bloc compartido con IA." translate="no">​</a></h3>
<p>Cuesta un poco despedirse: Etherpad nos prestó un gran servicio durante años. Pero había que jubilarlo. No permitía edición por bloques moderna e integrarle IA no tenía sentido.</p>
<p>El nuevo <strong>bloc de notas compartido</strong> está construido sobre <strong>BlockNote</strong>, con colaboración en tiempo real todavía basada en Yjs. Obtiene bloques familiares, importación y exportación en Markdown y cursores en directo, además de un menú de IA justo donde escribe.</p>
<p>Seleccione cualquier texto (o simplemente coloque el cursor) y pida a la IA que:</p>
<ul>
<li class=""><strong>Continúe redactando</strong> con el mismo tono</li>
<li class=""><strong>Resuma</strong> una discusión larga en puntos clave</li>
<li class=""><strong>Mejore la redacción</strong>, <strong>corrija ortografía y gramática</strong> o <strong>simplifique</strong> para lectores jóvenes</li>
<li class="">Ejecute una <strong>instrucción personalizada</strong>, por ejemplo: «convierta esto en un acta con acciones pendientes»</li>
</ul>
<p>Los resultados aparecen directamente en el documento, bloque a bloque. Sin copiar ni pegar.</p>
<p>Una nota honesta: ahora hay un único bloc por sesión y, si había personalizado Etherpad en profundidad, considere este cambio como incompatible. Para el resto, simplemente es más rápido y mucho más útil. Si ya utiliza la IA en plugNmeet, la configuración le resultará familiar: el mismo motor de Insights que <a class="" href="https://www.plugnmeet.org/es/blog/how-to-add-ai-meeting-assistant-features">nuestro asistente de reuniones con IA</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="texto-a-diagrama-con-ia-de-la-frase-al-diagrama-de-flujo">Texto a diagrama con IA: de la frase al diagrama de flujo<a href="https://www.plugnmeet.org/es/blog/plugnmeet-v2-5-0-crdt-whiteboard-ai-notes-polls-breakout-rooms#texto-a-diagrama-con-ia-de-la-frase-al-diagrama-de-flujo" class="hash-link" aria-label="Enlace directo al Texto a diagrama con IA: de la frase al diagrama de flujo" title="Enlace directo al Texto a diagrama con IA: de la frase al diagrama de flujo" translate="no">​</a></h3>
<p>Esta es nuestra demostración favorita. Abra la pizarra, pulse el botón de IA y escriba:</p>
<blockquote>
<p>«Flujo de registro: alta → verificación por correo → perfil → primer proyecto, con reintento en la verificación»</p>
</blockquote>
<p>Unos segundos después dispone de un diagrama de flujo editable sobre el lienzo. No es una imagen. Son formas reales que puede mover, recolorear y anotar.</p>
<p>En segundo plano enviamos su indicación a través de <code>insights/ai/textChat/execute</code> con la etiqueta de pizarra, recibimos sintaxis <strong>Mermaid</strong> en bruto (flujo, secuencia, clases, estados o entidad-relación) y la representamos con mermaid-to-excalidraw. Las indicaciones de seguimiento conservan el contexto, de modo que «añada ahora una decisión para usuarios SSO» funciona sin más.</p>
<p>El profesorado lo emplea para esquemas de clase. Los equipos técnicos diseñan arquitecturas sin salir de la llamada. Sinceramente, una vez que lo prueba, volver a dibujar rectángulos a mano se hace cuesta arriba.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="encuestas-rediseñadas-ahora-con-ia-y-una-api-real">Encuestas rediseñadas, ahora con IA y una API real<a href="https://www.plugnmeet.org/es/blog/plugnmeet-v2-5-0-crdt-whiteboard-ai-notes-polls-breakout-rooms#encuestas-redise%C3%B1adas-ahora-con-ia-y-una-api-real" class="hash-link" aria-label="Enlace directo al Encuestas rediseñadas, ahora con IA y una API real" title="Enlace directo al Encuestas rediseñadas, ahora con IA y una API real" translate="no">​</a></h3>
<p>Las encuestas recibieron un tratamiento completo en la v2.5.0. Si aún no ha leído <a class="" href="https://www.plugnmeet.org/es/blog/engaging-audience-with-live-polls">nuestra guía de encuestas</a>, los conceptos básicos siguen vigentes, pero la creación es completamente distinta.</p>
<p>Al pulsar «crear» encontrará dos caminos:</p>
<ul>
<li class=""><strong>Plantillas rápidas</strong>: sí/no, verdadero/falso, de acuerdo/en desacuerdo, A–D, 1–5. Un clic y ya se está votando.</li>
<li class=""><strong>Generar con IA</strong>: describa la encuesta con palabras sencillas («compruebe si mi clase de DevOps entiende los despliegues blue-green, en modo cuestionario»). La IA devuelve JSON estricto con pregunta, de 2 a 6 opciones, <code>is_multiple</code> e <code>is_quiz</code>, y el formulario se rellena solo. Nada se publica hasta que usted pulse Crear. Usted mantiene el control.</li>
</ul>
<p>Las encuestas ahora admiten <strong>modo cuestionario</strong> (respuestas correctas ocultas hasta el cierre), <strong>voto anónimo</strong>, <strong>selección múltiple</strong> y <strong>cierre automático</strong> de hasta 60 minutos. La comprobación de vencimiento se trasladó al servidor, al proceso de mantenimiento, de modo que las encuestas temporizadas se cierran con fiabilidad aunque la pestaña del moderador esté suspendida.</p>
<p>Y para el personal técnico: existe una nueva <strong><a class="" href="https://www.plugnmeet.org/es/docs/api/room/create-poll">API de creación de encuestas</a></strong>. Con <code>POST /room/createPoll</code>, indicando <code>room_id</code>, <code>question</code> y <code>options</code>, puede inyectar una encuesta en una sala activa desde su sistema. Ideal para votaciones programadas o sondeos automatizados. La persona moderadora aún puede cerrarla, publicar resultados o reabrirla como cualquier otra encuesta.</p>
<p>Y no es solo teoría: ya lo estamos utilizando. Nuestro <strong>plugin de Moodle v3.0.13</strong> incorpora un botón <strong>Añadir encuesta desde el cuestionario</strong> directamente en la página de la actividad. Elija un cuestionario de Moodle o una categoría del banco de preguntas, seleccione una pregunta de opción múltiple o de verdadero/falso, defina el modo cuestionario o votación, el voto anónimo y la duración de cierre automático, y el plugin la convierte en una encuesta en directo mediante <code>createPoll</code> mientras la sala está activa. Sin reescribir preguntas ni cambiar de contexto. Si imparte clases en Moodle, consulte la <a class="" href="https://www.plugnmeet.org/es/docs/user-guide/moodle-integration">guía de integración con Moodle</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="salas-de-grupos-reconstruidas-para-un-uso-real">Salas de grupos reconstruidas para un uso real<a href="https://www.plugnmeet.org/es/blog/plugnmeet-v2-5-0-crdt-whiteboard-ai-notes-polls-breakout-rooms#salas-de-grupos-reconstruidas-para-un-uso-real" class="hash-link" aria-label="Enlace directo al Salas de grupos reconstruidas para un uso real" title="Enlace directo al Salas de grupos reconstruidas para un uso real" translate="no">​</a></h3>
<p>La implementación anterior servía para divisiones sencillas. En cuanto necesitaba algo más —llevarse el contenido, gestionar salas activas— resultaba limitada.</p>
<p>La v2.5.0 incorpora una <strong>arquitectura de salas de grupos completamente rediseñada</strong> en cliente y servidor. El formulario de creación ahora permite:</p>
<ul>
<li class="">Arrastrar, repartir al azar o preasignar participantes (incluida la preasignación por API, que <a class="" href="https://www.plugnmeet.org/es/docs/user-guide/moodle-integration">nuestro plugin de Moodle ya utiliza</a>: active «Preasignar salas desde los grupos del curso» y cada grupo de Moodle se convierte en una sala, con el nombre del grupo como título y sus miembros asignados, desde el siguiente inicio de sesión)</li>
<li class="">Definir títulos personalizados, duraciones y mensajes de bienvenida</li>
<li class="">Permitir el regreso a la sala principal y la libre elección de sala</li>
<li class=""><strong>Compartir páginas concretas de la pizarra</strong> en las salas</li>
<li class=""><strong>Compartir el bloc</strong> y <strong>las encuestas seleccionadas</strong> para que los grupos no empiecen vacíos</li>
</ul>
<p>La parte más interesante: tras crear las salas, el cliente del administrador siembra en Redis el contenido de la sala principal —mismo formato, mismas claves derivadas por sala con E2EE—. Los grupos abren su sala y el material ya está allí.</p>
<p>Mientras las salas están activas, la vista de gestión permite enviar un mensaje a todas, ampliar la duración, entrar en cualquiera o finalizarlas todas. Si antes las salas le daban problemas, vuelva a leer <a class="" href="https://www.plugnmeet.org/es/blog/mastering-breakout-rooms">el dominio de las salas de grupos</a>: la mayoría de aquellos trucos ya vienen integrados.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="sincronización-más-rápida-y-emisión-en-directo-por-whip">Sincronización más rápida y emisión en directo por WHIP<a href="https://www.plugnmeet.org/es/blog/plugnmeet-v2-5-0-crdt-whiteboard-ai-notes-polls-breakout-rooms#sincronizaci%C3%B3n-m%C3%A1s-r%C3%A1pida-y-emisi%C3%B3n-en-directo-por-whip" class="hash-link" aria-label="Enlace directo al Sincronización más rápida y emisión en directo por WHIP" title="Enlace directo al Sincronización más rápida y emisión en directo por WHIP" translate="no">​</a></h3>
<p>Dos mejoras de infraestructura que conviene destacar.</p>
<p>Primera, una <strong>sincronización de datos de sesión más ligera</strong>. Los puntos de control gzip más las diferencias incrementales sustituyen los volcados completos. Se nota sobre todo en salas grandes con conexiones débiles.</p>
<p>Segunda, la <strong>compatibilidad con WHIP</strong> para emisión en directo. Si siguió <a class="" href="https://www.plugnmeet.org/es/blog/obs-rtmp-whip-ingress">nuestra guía de OBS + WHIP</a>, ya conoce la dirección: la v2.5.0 convierte la salida WHIP originada en el navegador en una vía de primer nivel. Resulta más sencillo llevar su sesión a una CDN o a una cadena de distribución sin las complicaciones de RTMP.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="para-administradores-actualización-a-la-v250">Para administradores: actualización a la v2.5.0<a href="https://www.plugnmeet.org/es/blog/plugnmeet-v2-5-0-crdt-whiteboard-ai-notes-polls-breakout-rooms#para-administradores-actualizaci%C3%B3n-a-la-v250" class="hash-link" aria-label="Enlace directo al Para administradores: actualización a la v2.5.0" title="Enlace directo al Para administradores: actualización a la v2.5.0" translate="no">​</a></h3>
<p>Para la lista completa de cambios, consulte las <a href="https://github.com/mynaparrot/plugNmeet-server/releases/tag/v2.5.0" target="_blank" rel="noopener noreferrer" class="">notas de la versión v2.5.0 en GitHub</a>.</p>
<p>Antes de actualizar tenga en cuenta lo siguiente:</p>
<ul>
<li class=""><strong>Etherpad queda eliminado.</strong> Sin contenedor adicional ni migración de pads. El bloc compartido pasa a formar parte de las funciones de sala. Elimine la configuración antigua de Etherpad de su <code>config.yaml</code>.</li>
<li class="">Tanto el cliente como el servidor incorporan el nuevo almacén de datos de sesión: <strong>actualícelos juntos</strong>.</li>
<li class="">Las funciones de IA (pizarra, bloc, encuestas) utilizan el motor actual de chat de texto de Insights. Contrólelas por sala con <code>aiTextChatFeatures</code> (<code>isWhiteboardAiDisabled</code>, <code>isPollAiDisabled</code>, <code>allowedUserIds</code>). Funciona cualquier proveedor compatible con OpenAI; consulte <a class="" href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet">nuestra guía de integración con OpenAI</a>.</li>
<li class="">El vencimiento de encuestas y la hidratación de pizarra y bloc siguen nuevas rutas en el servidor. Revise la <a class="" href="https://www.plugnmeet.org/es/docs/installation">guía de instalación</a> y la <a class="" href="https://www.plugnmeet.org/es/docs/api/intro">documentación de la API</a> si emplea integraciones personalizadas.</li>
</ul>
<p>Todavía no es perfecta: los menús de IA en móvil y los historiales de pizarra muy extensos presentan asperezas que estamos puliendo. Pero para la mayoría de las salas, la actualización es directa.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="pruébelo-hoy-mismo">Pruébelo hoy mismo<a href="https://www.plugnmeet.org/es/blog/plugnmeet-v2-5-0-crdt-whiteboard-ai-notes-polls-breakout-rooms#pru%C3%A9belo-hoy-mismo" class="hash-link" aria-label="Enlace directo al Pruébelo hoy mismo" title="Enlace directo al Pruébelo hoy mismo" translate="no">​</a></h3>
<p>La v2.5.0 es la versión en la que plugNmeet deja de ser «vídeo más extras» para convertirse en un espacio de trabajo único. Pizarra, notas, encuestas y grupos comparten por fin el mismo motor de sincronización, y la IA reside dentro de los tres en lugar de en una barra lateral que nadie abre.</p>
<p>Póngala en marcha con nuestro <a class="" href="https://www.plugnmeet.org/es/docs/installation">sencillo script de instalación</a>, consulte la <a class="" href="https://www.plugnmeet.org/es/docs/user-guide/moderator">guía de moderación</a> para familiarizar a sus anfitriones con los nuevos flujos o explore la <a class="" href="https://www.plugnmeet.org/es/docs/api/room/create-poll">API de creación de encuestas</a> si integra desde un LMS.</p>
<p>Y si le gusta hacia dónde avanzamos, regálenos una estrella en <a href="https://github.com/mynaparrot/plugNmeet" target="_blank" rel="noopener noreferrer" class="">GitHub</a>: ayuda de verdad a que el proyecto siga creciendo.</p>]]></content:encoded>
            <category>plugnmeet</category>
            <category>notas-lanzamiento</category>
            <category>pizarra</category>
            <category>bloc-notas</category>
            <category>encuestas</category>
            <category>salas-grupos</category>
            <category>ia</category>
            <category>funciones-ia</category>
            <category>autoalojado</category>
            <category>codigo-abierto</category>
            <category>videoconferencia</category>
        </item>
        <item>
            <title><![CDATA[Desarrolle Su Propia Aplicación de Video Móvil con la Integración Híbrida de plugNmeet]]></title>
            <link>https://www.plugnmeet.org/es/blog/2026/07/27/build-custom-video-conference-app</link>
            <guid>https://www.plugnmeet.org/es/blog/2026/07/27/build-custom-video-conference-app</guid>
            <pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Aprende a crear una aplicación de videoconferencia autoalojada y de marca blanca para iOS, Android o escritorio utilizando la integración híbrida de plugNmeet. Obtén el poder de los medios nativos y la simplicidad de nuestra interfaz web.]]></description>
            <content:encoded><![CDATA[<p>Crear una aplicación de videoconferencia personalizada para móviles o escritorio es una tarea enorme. Necesitas gestionar permisos del dispositivo, captura de medios, inestabilidad de la red y construir una interfaz de usuario compleja desde cero. ¿Y si pudieras obtener el rendimiento y la potencia de una aplicación nativa sin tener que inventar toda la rueda de la videoconferencia?</p>
<p>Hoy, le damos un adelanto de la solución. Presentamos la <strong>Integración Híbrida de plugNmeet</strong>, una nueva y potente forma de construir una <strong>aplicación de videoconferencia personalizada y autoalojada</strong> para iOS, Android, Flutter, React Native o escritorio. Combina la potencia bruta del manejo de medios nativos con el cliente web completo y rico en funciones de plugNmeet, dándole un camino acelerado para lanzar su propia <strong>aplicación de video de marca blanca</strong>.</p>
<p><strong>Una nota rápida sobre nuestra filosofía</strong>: el enfoque principal de plugNmeet siempre ha sido ofrecer una experiencia de videoconferencia potente y centrada en el navegador. No estamos cambiando para convertirnos en una empresa centrada en las aplicaciones. En cambio, esta integración híbrida es nuestra respuesta a los muchos desarrolladores de nuestra comunidad que necesitan crear aplicaciones nativas para móviles o escritorio.</p>
<p>Quizás te preguntes por qué no creamos nuestro propio SDK móvil dedicado. La respuesta es simple: ¡no lo necesitamos! plugNmeet está construido sobre LiveKit, que ya proporciona robustos SDKs nativos para cada plataforma principal, incluyendo <a href="https://github.com/livekit/client-sdk-android" target="_blank" rel="noopener noreferrer" class="">Android</a>, <a href="https://github.com/livekit/client-sdk-react-native" target="_blank" rel="noopener noreferrer" class="">React Native</a> y <a href="https://github.com/livekit/client-sdk-flutter" target="_blank" rel="noopener noreferrer" class="">Flutter</a>. Nuestro enfoque híbrido combina estos SDK de LiveKit, ampliamente probados en producción, para la publicación nativa de contenido multimedia con nuestro cliente web, que ofrece numerosas funcionalidades y se ejecuta dentro de un WebView. Esto significa que obtiene lo mejor de ambos mundos: capacidades de medios nativos listas para usar y la interfaz de usuario completa de plugNmeet, todo sin que tengamos que duplicar esfuerzos. Estamos proporcionando un camino robusto y flexible para que <em>usted</em> construya <em>su</em> propia aplicación, a su manera, sin comprometer los principios de código abierto y autoalojamiento que definen a plugNmeet.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="lo-mejor-de-ambos-mundos-potencia-nativa-simplicidad-web">Lo Mejor de Ambos Mundos: Potencia Nativa, Simplicidad Web<a href="https://www.plugnmeet.org/es/blog/2026/07/27/build-custom-video-conference-app#lo-mejor-de-ambos-mundos-potencia-nativa-simplicidad-web" class="hash-link" aria-label="Enlace directo al Lo Mejor de Ambos Mundos: Potencia Nativa, Simplicidad Web" title="Enlace directo al Lo Mejor de Ambos Mundos: Potencia Nativa, Simplicidad Web" translate="no">​</a></h3>
<p>El modelo híbrido es un punto de inflexión para los desarrolladores que necesitan algo más que un simple enlace de reunión genérico de un proveedor externo. Te da la flexibilidad del desarrollo nativo y la velocidad de usar la interfaz de usuario de reunión existente de plugNmeet.</p>
<p>He aquí por qué esto es tan importante:</p>
<ul>
<li class=""><strong>Rendimiento multimedia nativo:</strong> Captura y publica medios utilizando las APIs nativas de la plataforma. Esto es imprescindible para funciones como la <strong>compartición de pantalla en móviles</strong>, que no es compatible con la mayoría de los navegadores móviles. También abre la puerta a funciones avanzadas como fondos virtuales nativos o procesamiento de audio personalizado.</li>
<li class=""><strong>Desarrollo de Aplicaciones más Rápido:</strong> Su equipo puede centrarse en construir el contenedor nativo y la experiencia principal de la aplicación. No tiene que pasar meses recreando listas de participantes, chat, una pizarra, controles de moderación y diseños de video complejos. Ya hemos construido eso para usted.</li>
<li class=""><strong>Personalización de Marca Blanca Real:</strong> Usted controla toda la experiencia del usuario, desde el icono de la aplicación y la pantalla de inicio de sesión hasta la marca dentro de la reunión. La reunión se siente como una parte central de su aplicación, no como un servicio de terceros añadido.</li>
<li class=""><strong>Autoalojado y Seguro:</strong> Como siempre con plugNmeet, usted es dueño de su infraestructura y sus datos. Todas las comunicaciones se enrutan a través de su servidor local, garantizando la máxima privacidad, cumplimiento y control.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="cómo-funciona-una-arquitectura-elegante">Cómo Funciona: Una Arquitectura Elegante<a href="https://www.plugnmeet.org/es/blog/2026/07/27/build-custom-video-conference-app#c%C3%B3mo-funciona-una-arquitectura-elegante" class="hash-link" aria-label="Enlace directo al Cómo Funciona: Una Arquitectura Elegante" title="Enlace directo al Cómo Funciona: Una Arquitectura Elegante" translate="no">​</a></h3>
<p>La idea central es simple pero potente: un usuario lógico está representado por dos participantes conectados a su instancia autoalojada de LiveKit.</p>
<ul>
<li class="">El <strong>participante web</strong> se ejecuta en un WebView dentro de su aplicación. Gestiona toda la interfaz de usuario y se suscribe a todos los flujos de medios de otros usuarios.</li>
<li class="">El <strong>participante nativo</strong> se ejecuta en el código de su aplicación nativa. Su único trabajo es capturar y publicar la cámara, el micrófono y la pantalla compartida del propio usuario utilizando las APIs nativas.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Hybrid Integration Architecture" src="https://www.plugnmeet.org/es/assets/images/hybrid-architecture-7f12c387c781c5a76acbd94bcaf74031.png" width="3584" height="1884" class="img_Y8Hz"></p>
<p>Un "puente" de comunicación ligero permite que la interfaz de usuario web y el código nativo se comuniquen sin problemas. Cuando un usuario toca el botón "Silenciar" en la interfaz web, se envía un mensaje a través del puente, indicando a su código nativo que silencie el micrófono. Esta arquitectura proporciona una experiencia de usuario fluida mientras te da los beneficios de rendimiento del código nativo.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="adelántese-en-el-desarrollo-de-su-aplicación-de-video-personalizada">Adelántese en el Desarrollo de su Aplicación de Video Personalizada<a href="https://www.plugnmeet.org/es/blog/2026/07/27/build-custom-video-conference-app#adel%C3%A1ntese-en-el-desarrollo-de-su-aplicaci%C3%B3n-de-video-personalizada" class="hash-link" aria-label="Enlace directo al Adelántese en el Desarrollo de su Aplicación de Video Personalizada" title="Enlace directo al Adelántese en el Desarrollo de su Aplicación de Video Personalizada" translate="no">​</a></h3>
<p>Aunque el lanzamiento oficial está a la vuelta de la esquina, puede empezar a construir hoy mismo. Creemos en construir de forma abierta y nos entusiasma ver lo que nuestra comunidad crea.</p>
<hr>
<p><strong>¿Listo para construir su propia aplicación de videoconferencia?</strong></p>
<ul>
<li class=""><strong><a class="" href="https://www.plugnmeet.org/es/docs/developer-guide/mobile-app-integration">Explore la Guía Técnica</a></strong> para una inmersión profunda en la arquitectura y la API.</li>
<li class=""><strong><a href="https://github.com/mynaparrot/plugnmeet-mobile-app" target="_blank" rel="noopener noreferrer" class="">Consulte las Aplicaciones de Demostración en GitHub</a></strong> para ver el patrón en acción.</li>
<li class=""><strong><a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Pruebe la Demostración en Vivo</a></strong> para explorar las características de plugNmeet.</li>
<li class=""><strong><a class="" href="https://www.plugnmeet.org/es/docs/installation">Siga nuestra Guía de Instalación</a></strong> para poner en marcha su servidor autoalojado.</li>
</ul>]]></content:encoded>
            <category>videoconferencia</category>
            <category>aplicacion-móvil</category>
            <category>sdk</category>
            <category>autoalojado</category>
            <category>código-abierto</category>
            <category>webrtc</category>
            <category>marca-blanca</category>
            <category>ios</category>
            <category>android</category>
            <category>flutter</category>
            <category>react-native</category>
        </item>
        <item>
            <title><![CDATA[Integración de plugNmeet con OpenAI: IA autoalojada para videoconferencias]]></title>
            <link>https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet</link>
            <guid>https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet</guid>
            <pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Configure APIs compatibles con OpenAI en plugNmeet para habilitar la transcripción en vivo, traducción en tiempo real, traducciones de voz, chat de IA y resúmenes posteriores a las reuniones en su propio servidor de videoconferencias.]]></description>
            <content:encoded><![CDATA[<p>En <strong>plugNmeet</strong>, nuestra plataforma de videoconferencias de código abierto basada en WebRTC se ha desarrollado en torno a la flexibilidad, la privacidad y el control de los datos. Aunque plugNmeet ya es compatible con los servicios cognitivos especializados de <strong>Azure</strong> y <strong>Google</strong>, nos complace presentar una actualización de gran relevancia para el entorno de <strong>Insights</strong>: el <strong>proveedor oficial de OpenAI para plugNmeet</strong>.</p>
<p>Con esta integración, podrá incorporar potentes funciones de inteligencia artificial a su servidor de videoconferencias autoalojado. Entre ellas se incluyen la <strong>transcripción en vivo</strong>, la <strong>traducción en tiempo real</strong>, la <strong>traducción de chat en vivo</strong>, las <strong>traducciones de voz mediante tecnología de texto a voz (TTS)</strong>, la generación de <strong>resúmenes de reuniones con IA</strong> y un <strong>asistente de chat con IA en la sala</strong>.</p>
<p>Lo mejor de todo es que este proveedor se ha diseñado respetando el formato estándar de la API de OpenAI, lo que significa que podrá utilizar directamente los servicios de OpenAI o conectar plugNmeet a cualquier <strong>API compatible con OpenAI</strong>, incluyendo proveedores alternativos de IA y plataformas de modelos de lenguaje (LLM) autoalojados.</p>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="por-qué-es-importante-para-las-videoconferencias-autoalojadas">Por qué es importante para las videoconferencias autoalojadas<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#por-qu%C3%A9-es-importante-para-las-videoconferencias-autoalojadas" class="hash-link" aria-label="Enlace directo al Por qué es importante para las videoconferencias autoalojadas" title="Enlace directo al Por qué es importante para las videoconferencias autoalojadas" translate="no">​</a></h2>
<p>Las funciones de inteligencia artificial se están convirtiendo en elementos indispensables en las reuniones virtuales modernas. Los equipos de trabajo esperan contar con transcripciones en las que se puedan realizar búsquedas, comunicación multilingüe, resúmenes automatizados y asistentes virtuales inteligentes.</p>
<p>Sin embargo, muchas plataformas comerciales limitan estas prestaciones a sus propios servicios cerrados de suscripción. plugNmeet adopta un enfoque diferente.</p>
<p>Gracias al proveedor de OpenAI, tendrá la libertad de elegir el backend de IA que mejor se adapte a sus requisitos:</p>
<ul>
<li class="">Utilizar <strong>OpenAI</strong> para disponer de servicios gestionados de IA de alta calidad.</li>
<li class="">Emplear <strong>Azure OpenAI</strong> u otro proveedor en la nube con una interfaz compatible con OpenAI.</li>
<li class="">Conectarse a <strong>Groq</strong>, <strong>Together AI</strong>, <strong>Anyscale</strong> o cualquier otro proveedor de API compatible.</li>
<li class="">Utilizar <strong>Ollama</strong>, <strong>LocalAI</strong> u otra plataforma de LLM autoalojada para obtener un control absoluto sobre la privacidad y la infraestructura física.</li>
<li class="">Optimizar su instalación según criterios de coste, rendimiento, latencia, cumplimiento de normativas o propiedad de la información.</li>
</ul>
<p>Esto convierte a plugNmeet en una excelente alternativa para aquellas organizaciones que buscan <strong>reuniones virtuales potenciadas por IA sin renunciar al control total de su infraestructura</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="características-principales-del-proveedor-openai-en-plugnmeet">Características principales del proveedor OpenAI en plugNmeet<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#caracter%C3%ADsticas-principales-del-proveedor-openai-en-plugnmeet" class="hash-link" aria-label="Enlace directo al Características principales del proveedor OpenAI en plugNmeet" title="Enlace directo al Características principales del proveedor OpenAI en plugNmeet" translate="no">​</a></h2>
<p>Al activar el proveedor de OpenAI en plugNmeet, podrá habilitar un conjunto completo de herramientas inteligentes para sus sesiones de videoconferencia.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="transcripción-en-vivo">Transcripción en vivo<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#transcripci%C3%B3n-en-vivo" class="hash-link" aria-label="Enlace directo al Transcripción en vivo" title="Enlace directo al Transcripción en vivo" translate="no">​</a></h3>
<p>El proveedor de OpenAI admite el procesamiento de voz a texto en tiempo real a través de una <strong>conexión basada en WebSockets</strong>. Esto permite disfrutar de una transcripción con latencia mínima durante las reuniones en vivo.</p>
<p>La transcripción en vivo resulta de gran utilidad para:</p>
<ul>
<li class="">Mejorar la accesibilidad.</li>
<li class="">Generar actas y notas de reuniones.</li>
<li class="">Consultar un historial de conversación con motor de búsqueda integrado.</li>
<li class="">Facilitar los flujos de traducción en tiempo real.</li>
<li class="">Elaborar resúmenes posteriores a las reuniones.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="traducción-multilingüe-en-tiempo-real">Traducción multilingüe en tiempo real<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#traducci%C3%B3n-multiling%C3%BCe-en-tiempo-real" class="hash-link" aria-label="Enlace directo al Traducción multilingüe en tiempo real" title="Enlace directo al Traducción multilingüe en tiempo real" translate="no">​</a></h3>
<p>plugNmeet puede traducir el texto definitivo de la transcripción durante el transcurso de la reunión. Esto facilita la comunicación fluida entre participantes con distintos idiomas nativos, reduciendo las barreras lingüísticas en seminarios web, clases virtuales, reuniones internacionales y dinámicas de equipos de trabajo distribuidos geográficamente.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="traducciones-de-voz-mediante-texto-a-voz-tts">Traducciones de voz mediante texto a voz (TTS)<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#traducciones-de-voz-mediante-texto-a-voz-tts" class="hash-link" aria-label="Enlace directo al Traducciones de voz mediante texto a voz (TTS)" title="Enlace directo al Traducciones de voz mediante texto a voz (TTS)" translate="no">​</a></h3>
<p>La integración también admite traducciones habladas mediante texto a voz. Un bot traductor puede unirse a la sala e interpretar el contenido en voz alta utilizando voces generadas de forma artificial.</p>
<p>Esta función resulta especialmente idónea para:</p>
<ul>
<li class="">Eventos internacionales y multiculturales.</li>
<li class="">Aulas virtuales de idiomas o clases a distancia.</li>
<li class="">Reuniones empresariales transfronterizas.</li>
<li class="">Entornos con un fuerte enfoque en el cumplimiento de normativas de accesibilidad.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="traducción-de-chat-en-vivo">Traducción de chat en vivo<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#traducci%C3%B3n-de-chat-en-vivo" class="hash-link" aria-label="Enlace directo al Traducción de chat en vivo" title="Enlace directo al Traducción de chat en vivo" translate="no">​</a></h3>
<p>El proveedor de OpenAI también puede traducir los mensajes del chat en tiempo real. Esto permite a los participantes de diferentes orígenes lingüísticos comunicarse sin problemas a través del chat de texto, haciendo las reuniones más inclusivas y productivas. Cada usuario puede seleccionar su idioma preferido y ver los mensajes traducidos al instante.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="resúmenes-automatizados-de-las-reuniones">Resúmenes automatizados de las reuniones<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#res%C3%BAmenes-automatizados-de-las-reuniones" class="hash-link" aria-label="Enlace directo al Resúmenes automatizados de las reuniones" title="Enlace directo al Resúmenes automatizados de las reuniones" translate="no">​</a></h3>
<p>Una vez finalizada la sesión, plugNmeet es capaz de elaborar un resumen estructurado a partir del archivo de la transcripción de audio.</p>
<p>Estos resúmenes pueden incluir de forma automatizada:</p>
<ul>
<li class="">Los puntos de discusión clave.</li>
<li class="">Las decisiones tomadas.</li>
<li class="">Las tareas asignadas y elementos de acción.</li>
<li class="">Los próximos pasos o seguimientos de tareas.</li>
</ul>
<p>Esto permite a los participantes ahorrar tiempo y facilita el repaso de las reuniones grabadas.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="asistente-de-chat-de-ia-en-la-sala">Asistente de chat de IA en la sala<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#asistente-de-chat-de-ia-en-la-sala" class="hash-link" aria-label="Enlace directo al Asistente de chat de IA en la sala" title="Enlace directo al Asistente de chat de IA en la sala" translate="no">​</a></h3>
<p>El proveedor de OpenAI también puede dar vida a un asistente virtual de chat en las salas de conferencia de plugNmeet. De esta manera, los asistentes pueden interactuar directamente con la inteligencia artificial durante la sesión para resolver dudas, realizar consultas contextuales y obtener asistencia inmediata.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="cómo-configurar-openai-en-plugnmeet">Cómo configurar OpenAI en plugNmeet<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#c%C3%B3mo-configurar-openai-en-plugnmeet" class="hash-link" aria-label="Enlace directo al Cómo configurar OpenAI en plugNmeet" title="Enlace directo al Cómo configurar OpenAI en plugNmeet" translate="no">​</a></h3>
<p>La configuración de esta integración en su servidor autoalojado es muy sencilla. Solo requiere una clave de API activa y una modificación rápida en el archivo <code>config.yaml</code>.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="1-defina-la-cuenta-de-su-proveedor">1. Defina la cuenta de su proveedor<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#1-defina-la-cuenta-de-su-proveedor" class="hash-link" aria-label="Enlace directo al 1. Defina la cuenta de su proveedor" title="Enlace directo al 1. Defina la cuenta de su proveedor" translate="no">​</a></h4>
<p>Añada la cuenta del proveedor en el apartado <code>insights.providers</code>:</p>
<div class="language-yaml codeBlockContainer_CGS3 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_VyHs"><pre tabindex="0" class="prism-code language-yaml codeBlock_xlWw thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_nhOh"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">insights</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">providers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">openai</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"default-openai"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Un nombre único para identificar esta cuenta</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">credentials</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">api_key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"YOUR_API_KEY"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">options</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic"># ¡Esta es la clave para la compatibilidad con otras herramientas! Para LLM locales (como Ollama), use por ejemplo "http://localhost:11434/v1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">endpoint</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://api.openai.com/v1"</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="más-allá-de-openai-compatibilidad-universal-de-la-api">Más allá de OpenAI: Compatibilidad universal de la API<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#m%C3%A1s-all%C3%A1-de-openai-compatibilidad-universal-de-la-api" class="hash-link" aria-label="Enlace directo al Más allá de OpenAI: Compatibilidad universal de la API" title="Enlace directo al Más allá de OpenAI: Compatibilidad universal de la API" translate="no">​</a></h4>
<p>La opción <code>endpoint</code> es su puerta de entrada a un universo de proveedores de IA. Como nuestra integración está basada en la especificación estándar de la API de OpenAI, puede utilizar <strong>cualquier servicio que ofrezca una API compatible con OpenAI.</strong></p>
<p>De esta forma, evitará depender de un único proveedor de servicios en la nube. Puede redirigir plugNmeet hacia:</p>
<ul>
<li class=""><strong>Otros proveedores de IA</strong>: Servicios de alto rendimiento como <strong>Groq</strong>, <strong>Together AI</strong> o <strong>Anyscale</strong>.</li>
<li class=""><strong>Modelos de código abierto autoalojados</strong>: Ejecutar sus propios modelos de lenguaje en su hardware local mediante utilidades como <strong>Ollama</strong> o <strong>LocalAI</strong>.</li>
<li class=""><strong>Grandes infraestructuras cloud</strong>: Utilizar soluciones corporativas como <strong>Azure OpenAI</strong> que exponen una capa compatible.</li>
</ul>
<p>Esta versatilidad le permite ajustar su configuración de acuerdo con criterios de privacidad, costes y rendimiento sin necesidad de cambiar el código de plugNmeet.</p>
<div class="theme-admonition theme-admonition-info admonition_jN2M alert alert--info"><div class="admonitionHeading_B8M1"><span class="admonitionIcon_nhdn"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Nota técnica sobre endpoints y conexiones WebSocket</div><div class="admonitionContent_WNkZ"><p>Para que el servicio de <strong>transcripción en vivo</strong> funcione correctamente, es requisito indispensable que su endpoint sea compatible con <strong>conexiones WebSocket</strong> (<code>ws://</code> o <code>wss://</code>).</p><p>Nuestro proveedor intentará convertir de forma automática el protocolo del endpoint HTTP suministrado a su equivalente en WebSocket (por ejemplo, transformando <code>https://api.example.com</code> en <code>wss://api.example.com</code>), por lo que su servidor web intermedio o proxy debe estar preparado para gestionar este tipo de conexiones. El resto de las funciones, como la síntesis de voz (TTS) o los resúmenes de texto, continuarán operando sobre peticiones HTTP estándar.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="requisito-importante-activación-de-la-traducción-de-la-transcripción-en-vivo">Requisito importante: Activación de la traducción de la transcripción en vivo<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#requisito-importante-activaci%C3%B3n-de-la-traducci%C3%B3n-de-la-transcripci%C3%B3n-en-vivo" class="hash-link" aria-label="Enlace directo al Requisito importante: Activación de la traducción de la transcripción en vivo" title="Enlace directo al Requisito importante: Activación de la traducción de la transcripción en vivo" translate="no">​</a></h3>
<p>Una de las funciones más valiosas del sistema es la capacidad de traducir las transcripciones en vivo en tiempo real, pero cuenta con una dependencia técnica que debe considerar:</p>
<p><strong>Debe tener configurados y habilitados tanto el servicio de <code>transcription</code> como el de <code>translation</code>.</strong></p>
<p>El proceso de traducción funciona tomando el texto final generado por el servicio de transcripción y enviándolo al modelo de lenguaje configurado en el servicio de <code>translation</code>. Sin la configuración de <code>translation</code>, el sistema no sabrá qué modelo utilizar para realizar la traducción y el proceso fallará silenciosamente.</p>
<p>Una configuración mínima necesaria para contar con transcripción y traducción simultáneas se estructuraría del siguiente modo:</p>
<div class="language-yaml codeBlockContainer_CGS3 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_VyHs"><pre tabindex="0" class="prism-code language-yaml codeBlock_xlWw thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_nhOh"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">transcription</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">provider</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"default-openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">translation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">provider</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"default-openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">options</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Este modelo se utilizará para la traducción en tiempo real de la transcripción y del chat.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gpt-5.4-mini"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">max_selected_trans_langs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="ejemplos-completos-de-configuración-de-los-servicios">Ejemplos completos de configuración de los servicios<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#ejemplos-completos-de-configuraci%C3%B3n-de-los-servicios" class="hash-link" aria-label="Enlace directo al Ejemplos completos de configuración de los servicios" title="Enlace directo al Ejemplos completos de configuración de los servicios" translate="no">​</a></h3>
<p>A continuación, se detalla una guía de referencia con los distintos servicios y sus parámetros disponibles. Puede descomentar y ajustar los valores según las necesidades de su entorno.</p>
<div class="language-yaml codeBlockContainer_CGS3 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_VyHs"><pre tabindex="0" class="prism-code language-yaml codeBlock_xlWw thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_nhOh"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Servicio 1: Transcripción en vivo (Procesamiento de voz a texto en tiempo real)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Este servicio utiliza una API WebSocket de baja latencia para flujos de audio continuos.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">transcription</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">provider</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"default-openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">options</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># El modelo empleado para la transcripción en vivo.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">realtime_transcription_model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gpt-realtime-whisper"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># --- Configuración avanzada (Opcional) ---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Use un encabezado de autorización personalizado si su proveedor (como Azure)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># requiere un parámetro diferente al estándar "Authorization".</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># realtime_auth_header: "api-key"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Balance de rendimiento entre latencia y precisión para gpt-realtime-whisper.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Valores soportados: "minimal", "low", "medium", "high", "xhigh".</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># transcription_delay: "medium"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Modo de detección de actividad de voz (VAD). Para gpt-realtime-whisper,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># se recomienda establecerlo en "manual", donde plugNmeet confirma el segmento de audio.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Otros modelos compatibles podrían admitir "server_vad".</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># transcription_turn_detection: "manual"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Parámetros para la detección de voz en modo "manual".</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># transcription_min_commit_ms: 1500       # Duración mínima de la voz para considerarse un segmento válido.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># transcription_silence_commit_ms: 900    # Silencio mínimo necesario para cerrar y procesar un segmento.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># transcription_max_commit_ms: 12000      # Duración máxima de un bloque de audio antes de forzar su procesamiento.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># transcription_speech_rms: 500           # Umbral de nivel de audio (RMS) para detectar el inicio de voz.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># transcription_max_buffered_silence_ms: 400 # Silencio previo al habla que se conserva para enriquecer el contexto.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Servicio 2: Traducción en tiempo real y de chat</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">translation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">provider</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"default-openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">options</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># El modelo a utilizar para traducir texto (del chat o de las transcripciones).</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gpt-5.4-mini"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># --- Configuración avanzada (Opcional) ---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Número máximo de idiomas que un usuario puede seleccionar para la traducción.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># max_selected_trans_langs: 5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Servicio 3: Síntesis de voz (TTS) para traducciones habladas</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">speech-synthesis</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">provider</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"default-openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">options</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># El modelo de síntesis de voz a emplear (por ejemplo, "tts-1" o "tts-1-hd").</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gpt-4o-mini-tts"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># --- Configuración avanzada (Opcional) ---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Los modelos TTS de OpenAI procesan el audio a una tasa de muestreo de 24000Hz por defecto.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Esto se configura de forma automática, pero puede modificarse si su proveedor requiere otra tasa.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># tts_sample_rate: 24000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Voz predeterminada en caso de no especificarse una según el idioma.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Voces disponibles en OpenAI: alloy, echo, fable, onyx, nova, shimmer.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># default_voice: "alloy"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Asignación de voces específicas para distintos idiomas.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># voice-en: "alloy"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># voice-es: "nova"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># voice-fr: "shimmer"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Servicio 4: Chat de IA</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ai_text_chat</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">provider</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"default-openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">options</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Este modelo se utiliza para el asistente de IA en la reunión.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">chat_model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gpt-5.4"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># --- Configuración avanzada (Opcional) ---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Modelo utilizado para compactar y resumir el historial del chat cuando se completa el contexto de memoria.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">summarize_model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gpt-5.4-mini"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Cantidad de mensajes de chat recientes que se mantendrán activos en la memoria de contexto.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># context_window: 5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Servicio 5: Resúmenes de reuniones mediante procesamiento por lotes (Batch Audio)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Este servicio transcribe de manera asíncrona un archivo de audio grabado para luego resumirlo.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">meeting_summarizing</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">provider</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"default-openai"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">options</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># El modelo empleado para la transcripción inicial del archivo de audio.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">transcription_model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gpt-4o-transcribe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># --- Configuración avanzada (Opcional) ---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># El modelo empleado para generar el resumen final a partir del texto transcrito.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">summarize_model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gpt-5.4-mini"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="un-horizonte-abierto-a-la-innovación-y-al-software-libre">Un horizonte abierto a la innovación y al software libre<a href="https://www.plugnmeet.org/es/blog/2026/07/13/self-hosted-video-conferencing-ai-openai-plugnmeet#un-horizonte-abierto-a-la-innovaci%C3%B3n-y-al-software-libre" class="hash-link" aria-label="Enlace directo al Un horizonte abierto a la innovación y al software libre" title="Enlace directo al Un horizonte abierto a la innovación y al software libre" translate="no">​</a></h3>
<p>El soporte para OpenAI amplía el alcance de la arquitectura de Insights de plugNmeet, facilitando una mayor libertad de elección tecnológica, flexibilidad de despliegue y potencial de automatización inteligente. Al adoptar la interfaz estándar de OpenAI, le garantizamos total libertad para configurar la tecnología que prefiera: desde la nube de OpenAI o Microsoft Azure hasta soluciones completamente de almacenamiento propio y bajo su administración.</p>
<hr>
<p><strong>¿Todo listo para configurar su propio servidor de videoconferencias?</strong></p>
<ul>
<li class=""><strong>Consulte nuestra <a class="" href="https://www.plugnmeet.org/es/docs/installation">guía de instalación</a> para iniciar su servidor autoalojado en pocos minutos.</strong></li>
<li class=""><strong>Pruebe la <a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">demostración en vivo</a> para comprobar estas funciones de primera mano.</strong></li>
</ul>]]></content:encoded>
            <category>plugnmeet</category>
            <category>código-abierto</category>
            <category>WebRTC</category>
            <category>openai</category>
            <category>transcripción</category>
            <category>traducción</category>
            <category>resumen-ia</category>
            <category>tts</category>
            <category>api-compatible</category>
            <category>llm-autoalojado</category>
            <category>videoconferencia</category>
            <category>reuniones-ia</category>
            <category>ia</category>
        </item>
        <item>
            <title><![CDATA[Domine sus Flujos de Trabajo Multimedia: Presentamos los Hooks de Scripting y Almacenamiento]]></title>
            <link>https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks</link>
            <guid>https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks</guid>
            <pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[En plugNmeet, nuestro objetivo es ofrecer una plataforma potente, abierta y flexible que se adapte a sus necesidades, y no al contrario. A medida que las implementaciones crecen y se trasladan a la nube, la gestión de archivos multimedia como grabaciones y artefactos se convierte en un desafío fundamental. ¿Cómo almacenar archivos en S3? ¿Cómo automatizar notificaciones cuando una grabación está lista? ¿Cómo gestionar flujos de trabajo complejos en un clúster multiservidor?]]></description>
            <content:encoded><![CDATA[<p>En plugNmeet, nuestro objetivo es ofrecer una plataforma potente, abierta y flexible que se adapte a sus necesidades, y no al contrario. A medida que las implementaciones crecen y se trasladan a la nube, la gestión de archivos multimedia como grabaciones y artefactos se convierte en un desafío fundamental. ¿Cómo almacenar archivos en S3? ¿Cómo automatizar notificaciones cuando una grabación está lista? ¿Cómo gestionar flujos de trabajo complejos en un clúster multiservidor?</p>
<p>Hasta ahora, resolver estos desafíos solía exigir modificar el código central de la aplicación, lo que dificultaba las actualizaciones y convertía el mantenimiento en una tarea pesada.</p>
<p>Hoy nos complace anunciar una nueva función que lo cambia todo: los <strong>Hooks de Scripting y Almacenamiento</strong>. Este nuevo mecanismo le permite ampliar y personalizar el flujo de trabajo multimedia de plugNmeet mediante la ejecución de sus propios scripts personalizados, ya sea como eficientes <strong>procesos de larga duración</strong> o como sencillos <strong>comandos de única ejecución</strong>, en etapas clave. Toda la comunicación se realiza mediante <strong>JSON delimitado por saltos de línea</strong> a través de la entrada y salida estándar, de modo que puede integrar su propia lógica sin modificar una sola línea del código central.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="por-qué-los-hooks-el-poder-de-una-arquitectura-desacoplada">Por Qué los Hooks: El Poder de una Arquitectura Desacoplada<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#por-qu%C3%A9-los-hooks-el-poder-de-una-arquitectura-desacoplada" class="hash-link" aria-label="Enlace directo al Por Qué los Hooks: El Poder de una Arquitectura Desacoplada" title="Enlace directo al Por Qué los Hooks: El Poder de una Arquitectura Desacoplada" translate="no">​</a></h3>
<p>¿Por qué supone esto un cambio tan importante? Los hooks le permiten <strong>desacoplar</strong> su lógica de negocio de la lógica de la aplicación. En lugar de quedar limitado al almacenamiento en disco local, ahora puede integrarse con prácticamente cualquier servicio externo.</p>
<p>Esto es lo que puede lograr con los hooks:</p>
<ul>
<li class=""><strong>Integre cualquier proveedor de almacenamiento:</strong> utilice AWS S3, Google Cloud Storage, Backblaze, MinIO o incluso un servidor FTP personalizado. Si puede escribir un script para ello, puede utilizarlo.</li>
<li class=""><strong>Automatice flujos de trabajo personalizados:</strong> envíe automáticamente una notificación a Slack cuando se procese una grabación, llame a la API de su CRM con las analíticas de la reunión o active un servicio de indexación de vídeo.</li>
<li class=""><strong>Habilite implementaciones complejas y escalables:</strong> en un clúster multiservidor, los hooks son esenciales. Un nodo de grabación puede subir automáticamente una grabación sin procesar a un bucket central de S3, y se puede activar un nodo de transcodificación independiente para descargarla, procesarla y volver a subir el MP4 final.</li>
<li class=""><strong>Prepare su instalación para el futuro:</strong> su estrategia de almacenamiento puede evolucionar sin quedar atada al ciclo de versiones de plugNmeet.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="cómo-funciona-conceptos-fundamentales">Cómo Funciona: Conceptos Fundamentales<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#c%C3%B3mo-funciona-conceptos-fundamentales" class="hash-link" aria-label="Enlace directo al Cómo Funciona: Conceptos Fundamentales" title="Enlace directo al Cómo Funciona: Conceptos Fundamentales" translate="no">​</a></h3>
<p>El nuevo sistema se divide en dos mecanismos distintos pero relacionados: los <strong>Hooks del Grabador</strong> y los <strong>Hooks de Almacenamiento del Servidor</strong>. Antes de entrar en detalles, veamos los conceptos fundamentales que se aplican a todos los hooks.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="modelos-de-ejecución-larga-duración-frente-a-única-ejecución">Modelos de ejecución: larga duración frente a única ejecución<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#modelos-de-ejecuci%C3%B3n-larga-duraci%C3%B3n-frente-a-%C3%BAnica-ejecuci%C3%B3n" class="hash-link" aria-label="Enlace directo al Modelos de ejecución: larga duración frente a única ejecución" title="Enlace directo al Modelos de ejecución: larga duración frente a única ejecución" translate="no">​</a></h4>
<p>Para ofrecer la máxima flexibilidad, puede ejecutar sus hooks de dos maneras:</p>
<ul>
<li class=""><strong>Procesos de larga duración (recomendado)</strong>: su script se inicia una sola vez y se ejecuta de forma continua, escuchando solicitudes en <code>stdin</code>. Es altamente eficiente, ya que evita el coste de iniciar un proceso por cada evento.</li>
<li class=""><strong>Comandos de única ejecución</strong>: para tareas más sencillas, puede ejecutar un comando por cada evento. Es ideal para <code>curl</code>, <code>wget</code> o la utilidad integrada.</li>
</ul>
<p>Y hablando de utilidades, hemos incluido un práctico comando de única ejecución para simplificar las llamadas a API externas:</p>
<ul>
<li class=""><strong>Utilidad integrada <code>http-request</code></strong>: un comando sencillo para enviar el payload JSON del hook a un endpoint HTTP/HTTPS.<!-- -->
<ul>
<li class=""><strong>Uso:</strong> <code>http-request &lt;URL&gt;</code></li>
</ul>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="el-modelo-de-tubería-pipeline">El modelo de tubería (pipeline)<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#el-modelo-de-tuber%C3%ADa-pipeline" class="hash-link" aria-label="Enlace directo al El modelo de tubería (pipeline)" title="Enlace directo al El modelo de tubería (pipeline)" translate="no">​</a></h4>
<p>Si define varios scripts para un mismo hook, estos forman una tubería. La respuesta <code>stdout</code> del primer script se convierte en la solicitud <code>stdin</code> del segundo, y así sucesivamente. Si un script de la cadena no necesita modificar los datos, <strong>debe</strong> igualmente pasar el objeto JSON original, sin modificar, a <code>stdout</code>.</p>
<div class="theme-admonition theme-admonition-danger admonition_jN2M alert alert--danger"><div class="admonitionHeading_B8M1"><span class="admonitionIcon_nhdn"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>La limpieza de archivos es su responsabilidad</div><div class="admonitionContent_WNkZ"><p>Cuando el sistema de hooks está habilitado, plugNmeet delega la gestión de archivos a sus scripts. Si un hook le proporciona un archivo local temporal (por ejemplo, mediante <code>input_path</code>), <strong>plugNmeet no eliminará ese archivo</strong>.</p><p>Su script es responsable de eliminar el archivo local de origen una vez procesado (por ejemplo, tras subirlo al almacenamiento remoto). Esto es fundamental para evitar que el disco de su servidor se llene.</p></div></div>
<div class="theme-admonition theme-admonition-warning admonition_jN2M alert alert--warning"><div class="admonitionHeading_B8M1"><span class="admonitionIcon_nhdn"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>La consistencia de las rutas es su responsabilidad</div><div class="admonitionContent_WNkZ"><p>plugNmeet <strong>no valida</strong> el <code>output_path</code> que devuelve su hook. Se almacena como una cadena y se utiliza como <code>input_path</code> en las llamadas posteriores a <code>download_hook</code> y <code>delete_hook</code>.</p><ul>
<li class="">
<p><strong>Si su script modifica el <code>output_path</code></strong> (por ejemplo, al cambiar una ruta local por una clave de S3 en un <code>upload_hook</code> o en un hook <code>post_transcoding</code>), usted asume toda la responsabilidad sobre esa ruta. <strong>DEBE</strong> implementar también los correspondientes <code>download_hook</code> y <code>delete_hook</code> que comprendan y procesen el formato de ruta personalizado que ha definido.</p>
</li>
<li class="">
<p><strong>Si su script es solo de observación</strong> (por ejemplo, registra estadísticas o envía una notificación) y no modifica el <code>output_path</code>, no necesita proporcionar los demás hooks. El flujo de trabajo predeterminado continuará con la ruta original.</p>
</li>
</ul><p>Si no proporciona un <code>download_hook</code> y un <code>delete_hook</code> compatibles tras cambiar el <code>output_path</code>, las descargas y eliminaciones dejarán de funcionar.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="protocolo-de-comunicación">Protocolo de comunicación<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#protocolo-de-comunicaci%C3%B3n" class="hash-link" aria-label="Enlace directo al Protocolo de comunicación" title="Enlace directo al Protocolo de comunicación" translate="no">​</a></h4>
<ul>
<li class=""><strong><code>stdin</code></strong>: su script debe leer de <code>stdin</code> en un bucle. Cada línea que lea será un objeto JSON completo que representa una única solicitud del componente de plugNmeet.</li>
<li class=""><strong><code>stdout</code></strong>: por cada solicitud recibida, su script <strong>DEBE</strong> imprimir una única línea de JSON en <code>stdout</code>. Esa línea es la respuesta.</li>
<li class=""><strong><code>stderr</code></strong>: puede utilizar <code>stderr</code> para el registro dentro de su script. plugNmeet ignora esta salida, pero resulta muy valiosa para depurar su lógica personalizada.</li>
</ul>
<div class="theme-admonition theme-admonition-danger admonition_jN2M alert alert--danger"><div class="admonitionHeading_B8M1"><span class="admonitionIcon_nhdn"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>IMPORTANTE: los scripts siempre deben responder</div><div class="admonitionContent_WNkZ"><p>La llamada para ejecutar un script de hook es <strong>bloqueante</strong>. Su script <strong>DEBE</strong> escribir una respuesta en <code>stdout</code> por cada solicitud que reciba en <code>stdin</code>. Si un script no devuelve una respuesta, el servicio de plugNmeet quedará suspendido indefinidamente, a la espera de que el script termine.</p><p>Si un script no necesita modificar los datos (por ejemplo, un script que solo llama a una API externa para registro), <strong>debe</strong> igualmente devolver el objeto JSON original, sin modificar, que recibió.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="gestión-de-errores">Gestión de errores<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#gesti%C3%B3n-de-errores" class="hash-link" aria-label="Enlace directo al Gestión de errores" title="Enlace directo al Gestión de errores" translate="no">​</a></h4>
<p>Si su script encuentra un error, debe rellenar el campo <code>error</code> en su respuesta JSON a <code>stdout</code>. La aplicación principal registrará este error. Es fundamental devolver siempre el objeto JSON de entrada completo, con el campo <code>error</code> debidamente rellenado, para garantizar que los scripts siguientes de la tubería reciban la estructura de datos esperada.</p>
<p>Si la respuesta no es un JSON válido, plugNmeet registra una <strong>advertencia</strong> y descarta la salida. Los datos JSON <em>originales</em> (el <code>stdin</code> de su script) se pasan al siguiente script de la tubería. De este modo se evita que un único script defectuoso interrumpa toda la cadena.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="hooks-del-servidor-gestión-de-artefactos-y-descargas">Hooks del Servidor: Gestión de Artefactos y Descargas<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#hooks-del-servidor-gesti%C3%B3n-de-artefactos-y-descargas" class="hash-link" aria-label="Enlace directo al Hooks del Servidor: Gestión de Artefactos y Descargas" title="Enlace directo al Hooks del Servidor: Gestión de Artefactos y Descargas" translate="no">​</a></h3>
<p>Estos hooks están diseñados para controlar cómo el servidor principal de plugNmeet gestiona los archivos, principalmente los diversos <strong>artefactos de sala</strong> y las descargas de cara al usuario.</p>
<ul>
<li class=""><strong><code>upload_hook</code></strong>: se activa cuando el servidor crea un artefacto (por ejemplo, un archivo de analíticas de la reunión). Su script toma el archivo local (<code>input_path</code>) y lo sube a su proveedor, devolviendo un <code>output_path</code> único que indica al servidor cómo localizarlo más adelante.</li>
<li class=""><strong><code>download_hook</code></strong>: se activa cuando un usuario solicita descargar un artefacto o una grabación. Su script recibe el identificador del archivo (<code>input_path</code>) e indica al servidor cómo proceder (por ejemplo, proporcionando un <code>redirect_url</code> o una ruta <code>serve_local</code>).</li>
<li class=""><strong><code>delete_hook</code></strong>: se activa cuando es necesario eliminar un archivo. Su script recibe el identificador del archivo (<code>input_path</code>) y se encarga de eliminarlo de su almacenamiento externo.</li>
<li class=""><strong><code>resumable_upload_hook</code></strong>: gestiona las subidas de archivos por fragmentos para la función de chat. Su script se encarga de comprobar, subir y combinar las partes del archivo, lo cual es ideal para delegar en servicios como S3 Multipart Upload.</li>
<li class=""><strong><code>room_end_hook</code></strong>: realiza tareas de limpieza cuando finaliza una sesión de sala, como eliminar fragmentos abandonados de subidas reanudables.</li>
</ul>
<p>El enfoque recomendado para las descargas es devolver una URL temporal prefirmada (<code>action: "redirect"</code>). De este modo, el usuario descarga el archivo directamente desde su proveedor de almacenamiento (por ejemplo, S3), y el tráfico ni siquiera pasa por su servidor de plugNmeet, lo que le permite ahorrar ancho de banda y recursos.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="hooks-del-grabador-automatización-de-la-tubería-de-grabación">Hooks del Grabador: Automatización de la Tubería de Grabación<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#hooks-del-grabador-automatizaci%C3%B3n-de-la-tuber%C3%ADa-de-grabaci%C3%B3n" class="hash-link" aria-label="Enlace directo al Hooks del Grabador: Automatización de la Tubería de Grabación" title="Enlace directo al Hooks del Grabador: Automatización de la Tubería de Grabación" translate="no">​</a></h3>
<p>Estos hooks le otorgan el control sobre la tubería de grabación y transcodificación. Aunque existen hooks para cada etapa (<code>post_recording</code>, <code>pre_transcoding</code>, <code>post_transcoding</code>), el caso de uso más habitual es la gestión del archivo final ya procesado.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="ejemplo-1-integración-completa-con-s3-para-los-hooks-del-servidor">Ejemplo 1: Integración Completa con S3 para los Hooks del Servidor<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#ejemplo-1-integraci%C3%B3n-completa-con-s3-para-los-hooks-del-servidor" class="hash-link" aria-label="Enlace directo al Ejemplo 1: Integración Completa con S3 para los Hooks del Servidor" title="Enlace directo al Ejemplo 1: Integración Completa con S3 para los Hooks del Servidor" translate="no">​</a></h3>
<p>Veamos un ejemplo real de integración con S3 para toda la gestión de archivos del lado del servidor utilizando Node.js. Con estos tres scripts dispondrá de una solución de almacenamiento completa, sólida y escalable para su servidor plugNmeet.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="configuración-del-proyecto">Configuración del proyecto<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#configuraci%C3%B3n-del-proyecto" class="hash-link" aria-label="Enlace directo al Configuración del proyecto" title="Enlace directo al Configuración del proyecto" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_CGS3 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_VyHs"><pre tabindex="0" class="prism-code language-bash codeBlock_xlWw thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_nhOh"><div class="token-line" style="color:#393A34"><span class="token plain">mkdir plugnmeet-hooks</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd plugnmeet-hooks</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npm init -y</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npm install @aws-sdk/client-s3 @aws-sdk/s3-request-presigner</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="configuración-del-servidor-serverconfigyaml">Configuración del servidor (<code>server/config.yaml</code>)<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#configuraci%C3%B3n-del-servidor-serverconfigyaml" class="hash-link" aria-label="Enlace directo al configuración-del-servidor-serverconfigyaml" title="Enlace directo al configuración-del-servidor-serverconfigyaml" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_CGS3 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_VyHs"><pre tabindex="0" class="prism-code language-yaml codeBlock_xlWw thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_nhOh"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">hooks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">upload_hook</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">pool_size</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Opcional: controla la ejecución en paralelo</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">scripts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/path/to/plugnmeet-hooks/upload.js"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">is_one_shot</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Se trata de un script de larga duración</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">download_hook</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">scripts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/path/to/plugnmeet-hooks/download.js"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">is_one_shot</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">delete_hook</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">scripts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/path/to/plugnmeet-hooks/delete.js"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">is_one_shot</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">room_end_hook</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">scripts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http-request http://localhost:8090/room-ended-notification"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">is_one_shot</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="el-script-de-subida-uploadjs">El script de subida (<code>upload.js</code>)<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#el-script-de-subida-uploadjs" class="hash-link" aria-label="Enlace directo al el-script-de-subida-uploadjs" title="Enlace directo al el-script-de-subida-uploadjs" translate="no">​</a></h4>
<p>Este script sube a S3 los artefactos generados por el servidor (como las analíticas).</p>
<div class="language-javascript codeBlockContainer_CGS3 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_VyHs"><pre tabindex="0" class="prism-code language-javascript codeBlock_xlWw thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_nhOh"><div class="token-line" style="color:#393A34"><span class="token hashbang comment" style="color:#999988;font-style:italic">#!/usr/bin/env node</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">S3Client</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">PutObjectCommand</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@aws-sdk/client-s3"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> createReadStream</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> unlinkSync </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"fs"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> basename </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"path"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">readline</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"readline"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> s3Client </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">S3Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">region</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"us-east-1"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">BUCKET_NAME</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"my-plugnmeet-artifacts"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// A bucket for artifacts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">log</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">S3Upload: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> rl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> readline</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createInterface</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">input</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">output</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdout</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">terminal</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"S3 artifact upload hook script started."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rl</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"line"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">line</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> request</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    request </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">parse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">line</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> input_path</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> room_id </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> request</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> output_path </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">artifacts/</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">room_id</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">/</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation function" style="color:#d73a49">basename</span><span class="token template-string interpolation punctuation" style="color:#393A34">(</span><span class="token template-string interpolation">input_path</span><span class="token template-string interpolation punctuation" style="color:#393A34">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> command </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">PutObjectCommand</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">Bucket</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">BUCKET_NAME</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">Key</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> output_path</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">Body</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createReadStream</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">input_path</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> s3Client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">send</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">command</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Successfully uploaded to </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">output_path</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">unlinkSync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">input_path</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Cleaned up local file: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">input_path</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cleanupError</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Error cleaning up file: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">cleanupError</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    request</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">output_path</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> output_path</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdout</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">write</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">request</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Error: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">e</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> errorResponse </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> request </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">request</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">error</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">message</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">output_path</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">error</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">JSON parse error: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">e</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdout</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">write</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">errorResponse</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="el-script-de-descarga-downloadjs">El script de descarga (<code>download.js</code>)<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#el-script-de-descarga-downloadjs" class="hash-link" aria-label="Enlace directo al el-script-de-descarga-downloadjs" title="Enlace directo al el-script-de-descarga-downloadjs" translate="no">​</a></h4>
<p>Este script se activa cuando un usuario necesita acceder a un archivo. Recibe la clave de S3 en <code>input_path</code> y genera una URL prefirmada, temporal y segura, para que el usuario descargue el archivo directamente desde S3.</p>
<div class="language-javascript codeBlockContainer_CGS3 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_VyHs"><pre tabindex="0" class="prism-code language-javascript codeBlock_xlWw thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_nhOh"><div class="token-line" style="color:#393A34"><span class="token hashbang comment" style="color:#999988;font-style:italic">#!/usr/bin/env node</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">S3Client</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">GetObjectCommand</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@aws-sdk/client-s3"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> getSignedUrl </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@aws-sdk/s3-request-presigner"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">readline</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"readline"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> s3Client </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">S3Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">region</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"us-east-1"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">BUCKET_NAME</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"my-plugnmeet-artifacts"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">log</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">S3Download: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> rl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> readline</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createInterface</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">input</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">output</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdout</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">terminal</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"S3 download hook script started."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rl</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"line"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">line</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> request</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    request </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">parse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">line</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> input_path </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> request</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Note: You might have different buckets for artifacts and recordings.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// A real-world script would have logic to determine the correct bucket.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> bucket </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> input_path</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">startsWith</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"recordings/"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"my-plugnmeet-recordings"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">BUCKET_NAME</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> command </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">GetObjectCommand</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">Bucket</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> bucket</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">Key</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> input_path</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> redirect_url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getSignedUrl</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s3Client</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> command</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">expiresIn</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3600</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Generated pre-signed URL for </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">input_path</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    request</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">action</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"redirect"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    request</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">redirect_url</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> redirect_url</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdout</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">write</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">request</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Error: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">e</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> errorResponse </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> request </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">request</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">error</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">message</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">error</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">JSON parse error: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">e</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdout</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">write</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">errorResponse</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="el-script-de-eliminación-deletejs">El script de eliminación (<code>delete.js</code>)<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#el-script-de-eliminaci%C3%B3n-deletejs" class="hash-link" aria-label="Enlace directo al el-script-de-eliminación-deletejs" title="Enlace directo al el-script-de-eliminación-deletejs" translate="no">​</a></h4>
<p>Este script se encarga de eliminar un archivo de su bucket de S3 cuando se borra desde plugNmeet.</p>
<div class="language-javascript codeBlockContainer_CGS3 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_VyHs"><pre tabindex="0" class="prism-code language-javascript codeBlock_xlWw thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_nhOh"><div class="token-line" style="color:#393A34"><span class="token hashbang comment" style="color:#999988;font-style:italic">#!/usr/bin/env node</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">S3Client</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">DeleteObjectCommand</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@aws-sdk/client-s3"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">readline</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"readline"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> s3Client </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">S3Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">region</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"us-east-1"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">BUCKET_NAME</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"my-plugnmeet-artifacts"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">log</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">S3Delete: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> rl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> readline</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createInterface</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">input</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">output</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdout</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">terminal</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"S3 delete hook script started."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rl</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"line"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">line</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> request</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    request </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">parse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">line</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> input_path </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> request</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> bucket </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> input_path</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">startsWith</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"recordings/"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"my-plugnmeet-recordings"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">BUCKET_NAME</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> command </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">DeleteObjectCommand</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">Bucket</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> bucket</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">Key</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> input_path</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> s3Client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">send</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">command</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Successfully deleted </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">input_path</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    request</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">msg</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"File deleted successfully"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdout</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">write</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">request</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Error: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">e</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> errorResponse </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> request </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">request</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">error</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">message</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">error</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">JSON parse error: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">e</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdout</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">write</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">errorResponse</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="ejemplo-2-cómo-completar-el-flujo-de-trabajo-con-un-hook-del-grabador">Ejemplo 2: Cómo Completar el Flujo de Trabajo con un Hook del Grabador<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#ejemplo-2-c%C3%B3mo-completar-el-flujo-de-trabajo-con-un-hook-del-grabador" class="hash-link" aria-label="Enlace directo al Ejemplo 2: Cómo Completar el Flujo de Trabajo con un Hook del Grabador" title="Enlace directo al Ejemplo 2: Cómo Completar el Flujo de Trabajo con un Hook del Grabador" translate="no">​</a></h3>
<p>Ahora creemos el script más importante del flujo de grabación: el hook <code>post_transcoding</code>. En muchas configuraciones, basta con actuar cuando el MP4 final está listo. Este hook se ejecuta en el nodo de grabación/transcodificación y es ideal para subir el archivo final a su ubicación de almacenamiento permanente.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="configuración-del-grabador-recorderconfigyaml">Configuración del grabador (<code>recorder/config.yaml</code>)<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#configuraci%C3%B3n-del-grabador-recorderconfigyaml" class="hash-link" aria-label="Enlace directo al configuración-del-grabador-recorderconfigyaml" title="Enlace directo al configuración-del-grabador-recorderconfigyaml" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_CGS3 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_VyHs"><pre tabindex="0" class="prism-code language-yaml codeBlock_xlWw thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_nhOh"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">hooks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">post_transcoding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">scripts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/path/to/plugnmeet-hooks/post-transcoding-upload.js"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">is_one_shot</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="el-script-de-subida-tras-la-transcodificación-post-transcoding-uploadjs">El script de subida tras la transcodificación (<code>post-transcoding-upload.js</code>)<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#el-script-de-subida-tras-la-transcodificaci%C3%B3n-post-transcoding-uploadjs" class="hash-link" aria-label="Enlace directo al el-script-de-subida-tras-la-transcodificación-post-transcoding-uploadjs" title="Enlace directo al el-script-de-subida-tras-la-transcodificación-post-transcoding-uploadjs" translate="no">​</a></h4>
<p>Este script se ejecuta cuando una grabación se ha transcodificado correctamente a MP4. Recibe la ruta al MP4 final en el disco local mediante <code>input_path</code>, lo sube a un bucket permanente de S3 y devuelve la clave del objeto S3 en <code>output_path</code> para que el servidor la almacene.</p>
<div class="language-javascript codeBlockContainer_CGS3 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_VyHs"><pre tabindex="0" class="prism-code language-javascript codeBlock_xlWw thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_nhOh"><div class="token-line" style="color:#393A34"><span class="token hashbang comment" style="color:#999988;font-style:italic">#!/usr/bin/env node</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">S3Client</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">PutObjectCommand</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@aws-sdk/client-s3"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> createReadStream</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> unlinkSync </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"fs"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">readline</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"readline"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> s3Client </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">S3Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">region</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"us-east-1"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">BUCKET_NAME</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"my-plugnmeet-recordings"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Use a dedicated bucket for recordings</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">log</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">PostTranscoding: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> rl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> readline</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createInterface</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">input</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">output</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdout</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">terminal</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Post-transcoding upload hook started."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rl</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"line"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">line</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> request</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    request </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">parse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">line</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Received request: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation known-class-name class-name">JSON</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation method function property-access" style="color:#d73a49">stringify</span><span class="token template-string interpolation punctuation" style="color:#393A34">(</span><span class="token template-string interpolation">request</span><span class="token template-string interpolation punctuation" style="color:#393A34">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// In the post_transcoding stage, `input_path` contains the path to the final MP4 on the local disk.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> input_path</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> file_name </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> request</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Use the canonical file_name from the hook data to construct the final S3 key.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> final_s3_key </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">recordings/</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">file_name</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> command </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">PutObjectCommand</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">Bucket</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">BUCKET_NAME</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">Key</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> final_s3_key</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">Body</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createReadStream</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">input_path</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">ContentType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"video/mp4"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> s3Client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">send</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">command</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Successfully uploaded to </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">final_s3_key</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// This script is responsible for cleaning up the local MP4 file it was given.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">unlinkSync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">input_path</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Cleaned up local transcoded file: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">input_path</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cleanupError</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">WARN: Failed to clean up local file: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">cleanupError</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Set the final S3 key in `output_path` for the server to store in the database.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    request</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">output_path</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> final_s3_key</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdout</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">write</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">request</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">ERROR: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">e</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> errorResponse </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> request </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">request</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">error</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">message</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">output_path</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">error</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">JSON parse error: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">e</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdout</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">write</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">errorResponse</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"\n"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_jN2M alert alert--warning"><div class="admonitionHeading_B8M1"><span class="admonitionIcon_nhdn"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Se requiere compatibilidad en el lado del servidor</div><div class="admonitionContent_WNkZ"><p>El <code>output_path</code> final de este hook <code>post_transcoding</code> (por ejemplo, <code>recordings/REC_123.mp4</code>) se envía a <code>plugNmeet-server</code> y se almacena en la base de datos.</p><p>Cuando un usuario solicita descargar esta grabación, el <strong>servidor</strong> utilizará su propio <code>download_hook</code> con esta ruta como <code>input_path</code>. Debe asegurarse de que el <code>download_hook</code> de su <code>server</code> (como el que se muestra en el primer ejemplo) sea capaz de comprender y procesar el formato de <code>output_path</code> generado por este script.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="empiece-hoy-mismo">Empiece Hoy Mismo<a href="https://www.plugnmeet.org/es/blog/2026/06/19/mastering-media-workflows-with-hooks#empiece-hoy-mismo" class="hash-link" aria-label="Enlace directo al Empiece Hoy Mismo" title="Enlace directo al Empiece Hoy Mismo" translate="no">​</a></h3>
<p>Este nuevo sistema de hooks abre un mundo de posibilidades para la automatización y las arquitecturas avanzadas nativas de la nube. Está diseñado para desarrolladores y administradores de sistemas que desean construir una plataforma de videoconferencia verdaderamente personalizada, escalable y sólida.</p>
<p>¿Listo para profundizar? Consulte nuestra nueva y completa <strong><a class="" href="https://www.plugnmeet.org/es/docs/others/hooks">Documentación de Hooks de Scripting y Almacenamiento</a></strong> para obtener especificaciones técnicas detalladas, estructuras de payload y más ejemplos.</p>
<p>¡Estamos deseando ver los increíbles flujos de trabajo que usted construirá!</p>
<hr>
<p><strong>¿Listo para crear su propia plataforma de videoconferencia?</strong></p>
<ul>
<li class=""><strong><a class="" href="https://www.plugnmeet.org/es/docs/installation">Siga nuestra Guía de Instalación</a> para poner en marcha su servidor autoalojado en cuestión de minutos.</strong></li>
<li class=""><strong><a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Pruebe la Demostración en Vivo</a> para explorar las funciones.</strong></li>
</ul>]]></content:encoded>
            <category>plugnmeet</category>
            <category>desarrollador</category>
            <category>hooks</category>
            <category>scripting</category>
            <category>almacenamiento</category>
            <category>automatización</category>
            <category>s3</category>
            <category>personalización</category>
            <category>arquitectura</category>
        </item>
        <item>
            <title><![CDATA[Tu Sitio Web, Tus Reuniones: ¡Presentamos el Nuevo Plugin de plugNmeet para WordPress!]]></title>
            <link>https://www.plugnmeet.org/es/blog/new-plugnmeet-wordpress-plugin-deep-integration</link>
            <guid>https://www.plugnmeet.org/es/blog/new-plugnmeet-wordpress-plugin-deep-integration</guid>
            <pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Descubre el nuevo plugin de plugNmeet para WordPress. Con integración profunda, incrustación por shortcode, análisis avanzados y una experiencia de marca blanca perfecta para videoconferencias autoalojadas.]]></description>
            <content:encoded><![CDATA[<p>Incrustar una reunión de video en tu sitio de WordPress no debería significar enviar a tus usuarios a una plataforma de terceros con una marca confusa y una interfaz torpe. Tu sitio web es el hogar de tu marca, y tus reuniones deberían sentirse como una parte natural de él. ¿Y si pudieras alojar videoconferencias seguras y ricas en funciones directamente desde tu propio dominio, con tu propia marca y sin escribir una sola línea de código?</p>
<p>Hoy, estamos emocionados de lanzar el nuevo y profundamente integrado plugin de plugNmeet para WordPress. Este plugin es tu puerta de entrada para transformar cualquier página o entrada de WordPress en una potente sala de videoconferencias autoalojada.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="más-que-una-simple-reunión-es-parte-de-tu-sitio">Más que una simple reunión: es parte de tu sitio<a href="https://www.plugnmeet.org/es/blog/new-plugnmeet-wordpress-plugin-deep-integration#m%C3%A1s-que-una-simple-reuni%C3%B3n-es-parte-de-tu-sitio" class="hash-link" aria-label="Enlace directo al Más que una simple reunión: es parte de tu sitio" title="Enlace directo al Más que una simple reunión: es parte de tu sitio" translate="no">​</a></h3>
<p>Aunque nuestro plugin original te permitía <a class="" href="https://www.plugnmeet.org/es/blog/no-code-video-conferencing-service-with-wordpress">lanzar tu propio servicio de videoconferencia sin código</a>, esta nueva versión es un gran salto adelante, reconstruida desde cero para una integración aún más profunda y fluida. Nos centramos en una experiencia de usuario que se siente como una parte nativa de WordPress, tanto para ti como administrador como para los visitantes de tu sitio. Desde la creación de salas en el backend hasta la gestión de artefactos post-sesión, cada herramienta que necesitas está justo donde la esperarías: dentro de tu panel de WordPress.</p>
<p>Exploremos las características que hacen de este plugin la solución definitiva para videoconferencias autoalojadas en WordPress.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="integración-fluida-y-gestión-potente">Integración Fluida y Gestión Potente<a href="https://www.plugnmeet.org/es/blog/new-plugnmeet-wordpress-plugin-deep-integration#integraci%C3%B3n-fluida-y-gesti%C3%B3n-potente" class="hash-link" aria-label="Enlace directo al Integración Fluida y Gestión Potente" title="Enlace directo al Integración Fluida y Gestión Potente" translate="no">​</a></h3>
<p>Construimos este plugin para que sea increíblemente fácil de usar, al tiempo que ofrece las potentes características que nuestros usuarios adoran.</p>
<ul>
<li class=""><strong>Incrusta en cualquier lugar con Shortcodes:</strong> Una vez que creas una sala, el plugin te da un simple shortcode (p. ej., <code>[plugnmeet_room_view id="tu_id_de_sala"]</code>). Pégalo en cualquier página, entrada o incluso en un widget, y tendrás una sala de reuniones en vivo. Funciona perfectamente con el editor clásico, Gutenberg y los constructores de páginas populares.</li>
<li class=""><strong>URLs Limpias y Compartibles:</strong> ¿Quieres un enlace limpio y profesional para compartir tus reuniones? El plugin te permite establecer una "Página Anfitriona", dando a cada sala su propia URL dedicada como <code>tusitio.com/reuniones/tu-id-de-sala/</code>. Esto es perfecto para compartir directamente en correos electrónicos o redes sociales.</li>
<li class=""><strong>Control Total desde el Backend:</strong> Gestiona todo desde tu área de administración de WordPress. La página <strong>Plug-N-Meet &gt; Salas</strong> es tu centro de mando para crear, editar y configurar salas, así como para acceder a todos los activos post-sesión.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="gestión-de-grabaciones-sin-esfuerzo-con-fusión">Gestión de Grabaciones sin Esfuerzo con Fusión<a href="https://www.plugnmeet.org/es/blog/new-plugnmeet-wordpress-plugin-deep-integration#gesti%C3%B3n-de-grabaciones-sin-esfuerzo-con-fusi%C3%B3n" class="hash-link" aria-label="Enlace directo al Gestión de Grabaciones sin Esfuerzo con Fusión" title="Enlace directo al Gestión de Grabaciones sin Esfuerzo con Fusión" translate="no">​</a></h3>
<p>Gestionar las grabaciones de tus sesiones es ahora más potente que nunca. Si una sesión se detuvo y se reinició, ya no tienes que lidiar con múltiples archivos de video. Nuestra <strong>nueva función de Fusión de Grabaciones</strong> te permite seleccionar múltiples segmentos de video y combinarlos en un único archivo MP4 continuo directamente desde el backend de WordPress. Es una forma simple e intuitiva de crear una versión final pulida de tu grabación para su distribución.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="el-nuevo-menú-de-artefactos-análisis-e-ia-a-tu-alcance">El Nuevo Menú de Artefactos: Análisis e IA a tu Alcance<a href="https://www.plugnmeet.org/es/blog/new-plugnmeet-wordpress-plugin-deep-integration#el-nuevo-men%C3%BA-de-artefactos-an%C3%A1lisis-e-ia-a-tu-alcance" class="hash-link" aria-label="Enlace directo al El Nuevo Menú de Artefactos: Análisis e IA a tu Alcance" title="Enlace directo al El Nuevo Menú de Artefactos: Análisis e IA a tu Alcance" translate="no">​</a></h3>
<p>Hemos introducido un <strong>menú de Artefactos</strong> dedicado para cada sala, centralizando todos los datos valiosos que producen tus sesiones. Aquí es donde encontrarás:</p>
<ul>
<li class=""><strong>Análisis de Aula Accionables:</strong> Ve más allá de los simples recuentos de participantes. Descarga informes completos de Excel que detallan la participación de los asistentes, el tiempo de habla, la calidad de la conexión y más. Utiliza estos datos para entender a tu audiencia y mejorar tus presentaciones, convirtiendo los números brutos en ideas pedagógicas. Para una inmersión más profunda, consulta nuestra guía sobre <a class="" href="https://www.plugnmeet.org/es/blog/classroom-analytics-for-educators">Análisis de Aula para Educadores</a>.</li>
<li class=""><strong>Resúmenes y Transcripciones Impulsados por IA:</strong> Accede y descarga resúmenes de reuniones y archivos completos de transcripción de voz a texto generados por nuestro Asistente de Reuniones de IA. Para más información sobre nuestras capacidades de IA, consulta nuestra guía sobre <a class="" href="https://www.plugnmeet.org/es/blog/how-to-add-ai-meeting-assistant-features">cómo añadir un asistente de reuniones de IA</a>.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="construido-para-la-personalización-y-el-control">Construido para la Personalización y el Control<a href="https://www.plugnmeet.org/es/blog/new-plugnmeet-wordpress-plugin-deep-integration#construido-para-la-personalizaci%C3%B3n-y-el-control" class="hash-link" aria-label="Enlace directo al Construido para la Personalización y el Control" title="Enlace directo al Construido para la Personalización y el Control" translate="no">​</a></h3>
<p>Creemos en darte el control total sobre tu plataforma.</p>
<ul>
<li class=""><strong>Experiencia 100% de Marca Blanca:</strong> La sala de reuniones se carga directamente dentro del diseño de tu sitio de WordPress. No hay logotipos ni marcas de terceros. Es tu reunión, en tu sitio web. Para una inmersión más profunda en la personalización, lee nuestra <a class="" href="https://www.plugnmeet.org/es/blog/deep-integration-white-label-guide">guía de integración profunda y marca blanca</a>.</li>
<li class=""><strong>Permisos Granulares Basados en Roles:</strong> El plugin aprovecha los roles de usuario estándar de WordPress para darte un control detallado. En la configuración de la sala, puedes definir exactamente qué roles pueden unirse como moderadores frente a asistentes, y quién tiene acceso para ver, descargar o gestionar las grabaciones.</li>
<li class=""><strong>Amigable para Desarrolladores de Temas:</strong> Para aquellos que necesitan personalizar la visualización del front-end, el plugin cuenta con un potente sistema de anulación de plantillas. Los desarrolladores pueden copiar archivos de plantilla del plugin a su propio directorio de temas para modificar de forma segura la estructura HTML, desde pequeños ajustes hasta un rediseño completo.</li>
<li class=""><strong>Amplía con Webhooks:</strong> El plugin dispara un hook de acción <code>plugnmeet_webhook_data</code>, permitiendo a los desarrolladores procesar fácilmente datos de eventos en tiempo real. Úsalo para construir registros personalizados, enviar datos a un CRM o crear flujos de trabajo únicos. Aprende más en nuestra <a class="" href="https://www.plugnmeet.org/es/blog/how-to-build-your-first-webhook-workflow">guía para construir flujos de trabajo con webhooks</a>.</li>
</ul>
<hr>
<p><strong>¿Listo para llevar tus reuniones a casa, a tu sitio de WordPress?</strong></p>
<ul>
<li class=""><strong><a href="https://wordpress.org/plugins/plugnmeet/" target="_blank" rel="noopener noreferrer" class="">Descarga el Plugin oficial de WordPress</a></strong></li>
<li class=""><strong><a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Prueba la Demo en Vivo</a> para explorar las características.</strong></li>
<li class=""><strong>Sigue nuestra <a class="" href="https://www.plugnmeet.org/es/docs/installation">Guía de Instalación</a> para poner en marcha tu servidor autoalojado en minutos.</strong></li>
</ul>]]></content:encoded>
            <category>wordpress</category>
            <category>plugnmeet</category>
            <category>video conferencing</category>
            <category>wordpress-plugin</category>
            <category>wordpress-integration</category>
            <category>self-hosted</category>
            <category>open-source</category>
            <category>video-meetings</category>
            <category>webinar-plugin</category>
        </item>
        <item>
            <title><![CDATA[Más allá de la transmisión: Creando un Webinar Personalizado de Preguntas y Respuestas con RTMP y la API de Transmisión de Plug-N-Meet]]></title>
            <link>https://www.plugnmeet.org/es/blog/custom-qna-webinar-rtmp-broadcast-api</link>
            <guid>https://www.plugnmeet.org/es/blog/custom-qna-webinar-rtmp-broadcast-api</guid>
            <pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Organizar un webinar profesional a menudo implica equilibrar una transmisión de alta calidad con una interacción significativa con la audiencia. Si bien la transmisión RTMP ofrece una presentación pulida y unidireccional, gestionar las preguntas de la audiencia en un evento a gran escala puede volverse caótico rápidamente. ¿Cómo se asegura de que cada pregunta valiosa sea vista, moderada y entregada a su anfitrión sin interrumpir el flujo?]]></description>
            <content:encoded><![CDATA[<p>Organizar un webinar profesional a menudo implica equilibrar una transmisión de alta calidad con una interacción significativa con la audiencia. Si bien la transmisión RTMP ofrece una presentación pulida y unidireccional, gestionar las preguntas de la audiencia en un evento a gran escala puede volverse caótico rápidamente. ¿Cómo se asegura de que cada pregunta valiosa sea vista, moderada y entregada a su anfitrión sin interrumpir el flujo?</p>
<p>El enfoque API-first de Plug-N-Meet, combinado con sus sólidas capacidades de transmisión RTMP y la nueva API <code>room/broadcastToRoom</code>, proporciona la solución perfecta. Esta guía le mostrará cómo construir un sistema de preguntas y respuestas personalizado y curado que permite a su audiencia enviar preguntas a través de su propia plataforma, las cuales son entregadas sin problemas a su anfitrión del webinar en tiempo real.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="el-poder-de-la-transmisión-rtmp-para-webinars-profesionales">El poder de la transmisión RTMP para webinars profesionales<a href="https://www.plugnmeet.org/es/blog/custom-qna-webinar-rtmp-broadcast-api#el-poder-de-la-transmisi%C3%B3n-rtmp-para-webinars-profesionales" class="hash-link" aria-label="Enlace directo al El poder de la transmisión RTMP para webinars profesionales" title="Enlace directo al El poder de la transmisión RTMP para webinars profesionales" translate="no">​</a></h3>
<p>Para webinars que exigen un alto valor de producción y llegan a una gran audiencia, la transmisión RTMP (Real-Time Messaging Protocol) es el estándar de oro. Le permite transmitir su sesión de Plug-N-Meet directamente a plataformas como YouTube, Facebook o su propio sitio web. Esta sesión, que incluye a todos los participantes, comparticiones de pantalla y pizarras, se convierte en su "estudio de transmisión", asegurando una experiencia de alta calidad para miles de espectadores.</p>
<p>Este "Modelo de Estudio de Transmisión" es ideal para <a class="" href="https://www.plugnmeet.org/es/blog/hosting-large-scale-events-the-smart-way">organizar eventos a gran escala</a>. La reunión en sí es privada para sus anfitriones y presentadores, pero la salida se transmite públicamente.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="el-dilema-de-las-preguntas-y-respuestas-por-qué-el-chat-estándar-se-queda-corto">El dilema de las preguntas y respuestas: Por qué el chat estándar se queda corto<a href="https://www.plugnmeet.org/es/blog/custom-qna-webinar-rtmp-broadcast-api#el-dilema-de-las-preguntas-y-respuestas-por-qu%C3%A9-el-chat-est%C3%A1ndar-se-queda-corto" class="hash-link" aria-label="Enlace directo al El dilema de las preguntas y respuestas: Por qué el chat estándar se queda corto" title="Enlace directo al El dilema de las preguntas y respuestas: Por qué el chat estándar se queda corto" translate="no">​</a></h3>
<p>En un webinar grande, el chat público puede convertirse rápidamente en un torrente de comentarios, saludos y preguntas. Si bien es excelente para la interacción general, es una herramienta deficiente para gestionar una sesión estructurada de preguntas y respuestas. Las preguntas importantes se pierden y el anfitrión puede pasar por alto fácilmente consultas críticas.</p>
<p>Un sistema de preguntas y respuestas personalizado, integrado directamente en su sitio web o aplicación, ofrece varias ventajas:</p>
<ul>
<li class=""><strong>Moderación:</strong> Las preguntas pueden ser revisadas y aprobadas antes de llegar al anfitrión.</li>
<li class=""><strong>Priorización:</strong> Las preguntas importantes pueden ser destacadas o reordenadas.</li>
<li class=""><strong>Marca:</strong> La experiencia de preguntas y respuestas se integra perfectamente en su plataforma.</li>
<li class=""><strong>Control:</strong> Usted dicta el flujo y la presentación de las preguntas.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="construyendo-su-sistema-de-preguntas-y-respuestas-personalizado-con-roombroadcasttoroom">Construyendo su sistema de preguntas y respuestas personalizado con <code>room/broadcastToRoom</code><a href="https://www.plugnmeet.org/es/blog/custom-qna-webinar-rtmp-broadcast-api#construyendo-su-sistema-de-preguntas-y-respuestas-personalizado-con-roombroadcasttoroom" class="hash-link" aria-label="Enlace directo al construyendo-su-sistema-de-preguntas-y-respuestas-personalizado-con-roombroadcasttoroom" title="Enlace directo al construyendo-su-sistema-de-preguntas-y-respuestas-personalizado-con-roombroadcasttoroom" translate="no">​</a></h3>
<p>Aquí es donde la nueva API <code>room/broadcastToRoom</code> se vuelve invaluable. Permite que su sistema de backend personalizado envíe mensajes directamente a una sala activa de Plug-N-Meet, apareciendo como si vinieran de un participante.</p>
<p>Aquí está el concepto:</p>
<ol>
<li class=""><strong>Envío de la audiencia:</strong> Su audiencia ve la transmisión RTMP en su sitio web. En la misma página (o una vinculada), ven un formulario personalizado para enviar preguntas.</li>
<li class=""><strong>Moderación del backend:</strong> Estas preguntas se envían a <em>su</em> backend personalizado, donde un moderador puede revisarlas, editarlas o aprobarlas.</li>
<li class=""><strong>Inyección de API:</strong> Una vez que se aprueba una pregunta, su backend utiliza la API <code>room/broadcastToRoom</code> para enviarla como un mensaje de chat directamente al anfitrión (o a todos los administradores) dentro de la sala del estudio de transmisión de Plug-N-Meet.</li>
</ol>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="más-que-solo-preguntas-y-respuestas-otros-casos-de-uso-poderosos">Más que solo Preguntas y Respuestas: Otros Casos de Uso Poderosos<a href="https://www.plugnmeet.org/es/blog/custom-qna-webinar-rtmp-broadcast-api#m%C3%A1s-que-solo-preguntas-y-respuestas-otros-casos-de-uso-poderosos" class="hash-link" aria-label="Enlace directo al Más que solo Preguntas y Respuestas: Otros Casos de Uso Poderosos" title="Enlace directo al Más que solo Preguntas y Respuestas: Otros Casos de Uso Poderosos" translate="no">​</a></h3>
<p>La API <code>room/broadcastToRoom</code> abre un mundo de posibilidades más allá de las preguntas y respuestas moderadas. Al conectar su aplicación externa con la sala de reuniones en vivo, puede crear experiencias altamente interactivas y personalizadas.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="e-commerce-en-vivo-y-venta-de-productos">E-commerce en Vivo y Venta de Productos<a href="https://www.plugnmeet.org/es/blog/custom-qna-webinar-rtmp-broadcast-api#e-commerce-en-vivo-y-venta-de-productos" class="hash-link" aria-label="Enlace directo al E-commerce en Vivo y Venta de Productos" title="Enlace directo al E-commerce en Vivo y Venta de Productos" translate="no">​</a></h4>
<ul>
<li class=""><strong>Escenario:</strong> Organice un show de compras en vivo donde los espectadores puedan interactuar en tiempo real.</li>
<li class=""><strong>Cómo funciona:</strong> Un espectador hace clic en un botón "Comprar ahora" o "Más información" en su sitio. Su backend llama a la API para enviar una notificación privada al anfitrión o a un asistente de ventas en la sala: <code>"El usuario 'Jane Doe' está interesado en el Producto #1234."</code></li>
<li class=""><strong>Beneficio:</strong> Cree un enlace directo y en tiempo real entre su audiencia y su equipo de ventas, capturando clientes potenciales e impulsando conversiones durante el evento en vivo.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="programas-de-entrevistas-virtuales-y-llamadas-filtradas">Programas de Entrevistas Virtuales y "Llamadas" Filtradas<a href="https://www.plugnmeet.org/es/blog/custom-qna-webinar-rtmp-broadcast-api#programas-de-entrevistas-virtuales-y-llamadas-filtradas" class="hash-link" aria-label="Enlace directo al Programas de Entrevistas Virtuales y &quot;Llamadas&quot; Filtradas" title="Enlace directo al Programas de Entrevistas Virtuales y &quot;Llamadas&quot; Filtradas" translate="no">​</a></h4>
<ul>
<li class=""><strong>Escenario:</strong> Produzca un programa de entrevistas o podcast profesional donde desee filtrar a los miembros de la audiencia antes de que "llamen" para hablar.</li>
<li class=""><strong>Cómo funciona:</strong> Los miembros de la audiencia solicitan hablar a través de su aplicación. Un productor revisa las solicitudes y luego usa la API para enviar un mensaje privado al anfitrión: <code>"A continuación: John de California, preguntando sobre nuestra nueva función."</code></li>
<li class=""><strong>Beneficio:</strong> El anfitrión puede producir un programa fluido y de calidad profesional al estar preparado para cada interacción con la audiencia, todo mientras la audiencia se siente comprometida e involucrada.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="alertas-y-anuncios-a-nivel-de-sistema">Alertas y Anuncios a Nivel de Sistema<a href="https://www.plugnmeet.org/es/blog/custom-qna-webinar-rtmp-broadcast-api#alertas-y-anuncios-a-nivel-de-sistema" class="hash-link" aria-label="Enlace directo al Alertas y Anuncios a Nivel de Sistema" title="Enlace directo al Alertas y Anuncios a Nivel de Sistema" translate="no">​</a></h4>
<ul>
<li class=""><strong>Escenario:</strong> Necesita enviar un anuncio urgente a todos los participantes en una sesión en vivo.</li>
<li class=""><strong>Cómo funciona:</strong> Su backend administrativo llama a la API para enviar un mensaje de notificación a toda la sala: <code>"La sesión se extenderá por 15 minutos."</code></li>
<li class=""><strong>Beneficio:</strong> Una forma confiable de comunicar información crítica a todos en la sala al instante.</li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="idea-de-implementación-paso-a-paso">Idea de implementación paso a paso<a href="https://www.plugnmeet.org/es/blog/custom-qna-webinar-rtmp-broadcast-api#idea-de-implementaci%C3%B3n-paso-a-paso" class="hash-link" aria-label="Enlace directo al Idea de implementación paso a paso" title="Enlace directo al Idea de implementación paso a paso" translate="no">​</a></h3>
<p>Describamos cómo puede configurar esto para un sistema de preguntas y respuestas:</p>
<p><strong>Paso 1: Configure su sala de webinar de Plug-N-Meet.</strong>
Cree su sala de Plug-N-Meet a través de la <a class="" href="https://www.plugnmeet.org/es/docs/api/room/create">API de Creación de Sala</a>, asegurándose de que RTMP esté habilitado. Esta será su "estudio de transmisión" privado donde se reunirán sus presentadores y el equipo de producción.</p>
<p><strong>Paso 2: Configure la transmisión RTMP.</strong>
Para transmitir su webinar a una audiencia pública, el moderador puede iniciar la transmisión en vivo desde dentro de la sala de Plug-N-Meet.</p>
<ol>
<li class="">Abra el menú <strong>Más Opciones</strong> (...) en la barra de control inferior y seleccione <strong>Iniciar Transmisión en Vivo</strong>.</li>
<li class="">Ingrese la <strong>Clave de Transmisión</strong> y la <strong>URL de Transmisión</strong> proporcionadas por su plataforma de streaming (por ejemplo, YouTube, Facebook).</li>
<li class="">Haga clic en <strong>Iniciar Transmisión</strong> para comenzar a transmitir la sesión.</li>
</ol>
<p><strong>Paso 3: Desarrolle su frontend de preguntas y respuestas personalizado (orientado a la audiencia).</strong>
Cree un formulario web simple en su sitio web donde su audiencia pueda escribir y enviar sus preguntas. Este formulario enviará las preguntas a <em>su</em> servidor de backend personalizado.</p>
<p><strong>Paso 4: Implemente su backend de preguntas y respuestas (moderación y llamada a la API).</strong>
Este es el núcleo de su sistema personalizado:</p>
<ol>
<li class=""><strong>Recibir preguntas:</strong> Su backend recibe preguntas del formulario orientado a la audiencia.</li>
<li class=""><strong>Panel de moderación:</strong> Construya un panel simple para su moderador de preguntas y respuestas. Aquí, pueden ver las preguntas entrantes, aprobarlas/rechazarlas y quizás reordenarlas.</li>
<li class=""><strong>Llamar a <code>room/broadcastToRoom</code>:</strong> Cuando el moderador aprueba una pregunta, su backend realiza una llamada a la API al endpoint <code>room/broadcastToRoom</code> de Plug-N-Meet.</li>
</ol>
<p><strong>Ejemplo de carga útil JSON para la llamada a la API de su backend a Plug-N-Meet:</strong></p>
<div class="language-json codeBlockContainer_CGS3 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_VyHs"><pre tabindex="0" class="prism-code language-json codeBlock_xlWw thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_nhOh"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"room_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"su-id-de-sala-de-webinar"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"only_to_admins"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"chat_msg"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"message"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Pregunta de la audiencia: [Texto de la pregunta aprobada aquí]"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Esto entregará la pregunta aprobada directamente al panel de chat de su estudio de transmisión de Plug-N-Meet, visible solo para sus anfitriones y administradores. Su anfitrión puede leer la pregunta en voz alta o responder según corresponda.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="beneficios-de-este-enfoque">Beneficios de este enfoque<a href="https://www.plugnmeet.org/es/blog/custom-qna-webinar-rtmp-broadcast-api#beneficios-de-este-enfoque" class="hash-link" aria-label="Enlace directo al Beneficios de este enfoque" title="Enlace directo al Beneficios de este enfoque" translate="no">​</a></h3>
<ul>
<li class=""><strong>Preguntas y respuestas curadas:</strong> Solo las preguntas aprobadas llegan al anfitrión, manteniendo la profesionalidad.</li>
<li class=""><strong>Menos distracciones:</strong> El anfitrión puede concentrarse en la presentación sin un chat público que se desplaza constantemente.</li>
<li class=""><strong>Control mejorado:</strong> Usted tiene control total sobre el proceso de preguntas y respuestas, desde el envío hasta la entrega.</li>
<li class=""><strong>Experiencia de marca:</strong> La audiencia interactúa con su plataforma personalizada, reforzando su marca.</li>
<li class=""><strong>Flexibilidad:</strong> Puede extender su sistema de preguntas y respuestas personalizado con funciones como votación, categorización o incluso agrupación de preguntas impulsada por IA.</li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="conclusión-su-webinar-sus-reglas">Conclusión: Su webinar, sus reglas<a href="https://www.plugnmeet.org/es/blog/custom-qna-webinar-rtmp-broadcast-api#conclusi%C3%B3n-su-webinar-sus-reglas" class="hash-link" aria-label="Enlace directo al Conclusión: Su webinar, sus reglas" title="Enlace directo al Conclusión: Su webinar, sus reglas" translate="no">​</a></h3>
<p>La arquitectura API-first de Plug-N-Meet le permite ir más allá de las soluciones prediseñadas y crear experiencias de webinar realmente personalizadas. Al combinar la transmisión RTMP profesional con un sistema de preguntas y respuestas personalizado impulsado por la API <code>room/broadcastToRoom</code>, puede ofrecer webinars altamente atractivos, moderados y de marca que se destacan.</p>
<p>Deje de permitir que las herramientas genéricas dicten la interacción con su audiencia. Comience a construir una experiencia de webinar que sea únicamente suya.</p>
<hr>
<p><strong>¿Listo para construir su webinar de preguntas y respuestas personalizado?</strong></p>
<ul>
<li class=""><strong><a class="" href="https://www.plugnmeet.org/es/docs/api/room/broadcast-to-room">Explore la documentación de la API <code>room/broadcastToRoom</code></a></strong></li>
<li class=""><strong><a class="" href="https://www.plugnmeet.org/es/blog/hosting-large-scale-events-the-smart-way">Descubra cómo organizar eventos a gran escala</a></strong></li>
<li class=""><strong><a class="" href="https://www.plugnmeet.org/es/docs/api/intro">Consulte nuestra documentación de la API para empezar a construir</a>.</strong></li>
</ul>]]></content:encoded>
            <category>webinar</category>
            <category>rtmp</category>
            <category>transmisión</category>
            <category>api</category>
            <category>preguntas-y-respuestas-personalizadas</category>
            <category>integración</category>
            <category>desarrollador</category>
            <category>transmisión-en-vivo</category>
            <category>interacción</category>
            <category>código-abierto</category>
            <category>seminario-web</category>
        </item>
        <item>
            <title><![CDATA[Optimice sus Repeticiones de Sesión: Presentamos la Nueva API para Fusionar Grabaciones]]></title>
            <link>https://www.plugnmeet.org/es/blog/merge-recordings-api</link>
            <guid>https://www.plugnmeet.org/es/blog/merge-recordings-api</guid>
            <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[En Plug-N-Meet, trabajamos constantemente para mejorar la experiencia post-sesión tanto para administradores como para usuarios finales. Un desafío común en eventos de larga duración como seminarios web, clases en línea o sesiones de capacitación de varias partes es la gestión de múltiples segmentos de grabación. Detener e iniciar una grabación suele ser necesario, pero esto deja una colección fragmentada de archivos de video.]]></description>
            <content:encoded><![CDATA[<p>En Plug-N-Meet, trabajamos constantemente para mejorar la experiencia post-sesión tanto para administradores como para usuarios finales. Un desafío común en eventos de larga duración como seminarios web, clases en línea o sesiones de capacitación de varias partes es la gestión de múltiples segmentos de grabación. Detener e iniciar una grabación suele ser necesario, pero esto deja una colección fragmentada de archivos de video.</p>
<p>Hoy, nos complace resolver este problema con la introducción de la API <code>/recording/mergeRecordings</code>, una nueva y potente herramienta diseñada para consolidar múltiples archivos de grabación en un único video sin interrupciones. Esta función es imprescindible para cualquiera que ejecute un <strong>servidor de videoconferencias</strong> autoalojado y busque ofrecer una experiencia pulida y profesional.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="el-problema-grabaciones-fragmentadas">El Problema: Grabaciones Fragmentadas<a href="https://www.plugnmeet.org/es/blog/merge-recordings-api#el-problema-grabaciones-fragmentadas" class="hash-link" aria-label="Enlace directo al El Problema: Grabaciones Fragmentadas" title="Enlace directo al El Problema: Grabaciones Fragmentadas" translate="no">​</a></h3>
<p>Imagine que está organizando un taller de tres horas en su <strong>servidor de videollamadas</strong>. Pausa la grabación durante un descanso de 15 minutos y luego la reanuda. O quizás tenga que reiniciar una grabación debido a un problema técnico. Al final de la sesión, tiene dos o más archivos de video separados.</p>
<p>Esto genera una experiencia poco fluida para quienes ven la repetición. También genera trabajo adicional para los administradores que tienen que descargar, editar y volver a cargar manualmente los archivos para crear un video único y coherente.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="la-solución-la-api-mergerecordings">La Solución: La API <code>mergeRecordings</code><a href="https://www.plugnmeet.org/es/blog/merge-recordings-api#la-soluci%C3%B3n-la-api-mergerecordings" class="hash-link" aria-label="Enlace directo al la-solución-la-api-mergerecordings" title="Enlace directo al la-solución-la-api-mergerecordings" translate="no">​</a></h3>
<p>La API <code>mergeRecordings</code> automatiza todo este proceso. Le permite combinar programáticamente múltiples archivos de grabación de una sesión en un solo video continuo. Los archivos originales se mantienen intactos y se crea una nueva grabación fusionada con su propio <code>record_id</code> único.</p>
<p>Este proceso ocurre de forma asíncrona en segundo plano, por lo que no ocupa su sistema. Simplemente realiza la solicitud a la API, y cuando la fusión se completa, su aplicación recibe una notificación de webhook (<code>recording_proceeded</code>) con los detalles del nuevo archivo de grabación unificado.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="caso-de-uso-destacado-fusión-perfecta-en-nuestro-plugin-de-videoconferencia-para-moodle">Caso de Uso Destacado: Fusión Perfecta en Nuestro Plugin de Videoconferencia para Moodle<a href="https://www.plugnmeet.org/es/blog/merge-recordings-api#caso-de-uso-destacado-fusi%C3%B3n-perfecta-en-nuestro-plugin-de-videoconferencia-para-moodle" class="hash-link" aria-label="Enlace directo al Caso de Uso Destacado: Fusión Perfecta en Nuestro Plugin de Videoconferencia para Moodle" title="Enlace directo al Caso de Uso Destacado: Fusión Perfecta en Nuestro Plugin de Videoconferencia para Moodle" translate="no">​</a></h3>
<p>Esta no es solo una característica teórica, ya está mejorando nuestro <a class="" href="https://www.plugnmeet.org/es/docs/user-guide/moodle-integration">Plugin oficial de Plug-N-Meet para Moodle</a>. Como un plugin líder de <strong>videoconferencia para Moodle</strong>, creemos en proporcionar flujos de trabajo fluidos para los educadores.</p>
<p><strong>El Escenario:</strong> Un profesor imparte una clase larga y la graba en dos partes. Después de la sesión, ve ambas grabaciones listadas en su actividad de Moodle.</p>
<p><strong>La Forma Antigua:</strong> El profesor tendría que indicar a los estudiantes que vieran ambos videos en orden, o descargarlos y editarlos manualmente.</p>
<p><strong>La Nueva Forma con la API:</strong></p>
<ol>
<li class="">El profesor navega a la pestaña "Grabaciones" en la actividad de su curso de Moodle.</li>
<li class="">Selecciona las grabaciones que desea combinar.</li>
<li class="">Hace clic en un botón "Fusionar" directamente dentro de la interfaz de Moodle.</li>
<li class="">El backend de Moodle llama a la API <code>mergeRecordings</code>.</li>
<li class="">Poco tiempo después, un nuevo archivo de grabación único aparece automáticamente en la lista, listo para que los estudiantes lo vean.</li>
</ol>
<p><strong>El Resultado:</strong> Un flujo de trabajo increíblemente simple e intuitivo para los educadores. Pueden crear una repetición de sesión pulida y única sin salir de su panel de Moodle, demostrando el poder de esta API para crear funciones fáciles de usar en cualquier <strong>servidor de videoconferencias</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="cómo-funciona-dos-potentes-estrategias-para-fusionar-grabaciones">Cómo Funciona: Dos Potentes Estrategias Para Fusionar Grabaciones<a href="https://www.plugnmeet.org/es/blog/merge-recordings-api#c%C3%B3mo-funciona-dos-potentes-estrategias-para-fusionar-grabaciones" class="hash-link" aria-label="Enlace directo al Cómo Funciona: Dos Potentes Estrategias Para Fusionar Grabaciones" title="Enlace directo al Cómo Funciona: Dos Potentes Estrategias Para Fusionar Grabaciones" translate="no">​</a></h3>
<p>La API ofrece dos formas flexibles de combinar sus grabaciones:</p>
<ol>
<li class="">
<p><strong>Fusionar por Sesión (<code>by_session</code>)</strong>: Este es el método más simple. Proporciona un <code>room_sid</code> (el identificador único de una sesión), y la API encuentra automáticamente todos los archivos de grabación asociados con esa sesión y los fusiona en orden cronológico. Incluso puede optar por excluir grabaciones específicas si necesita eliminar un inicio falso o un segmento no deseado.</p>
</li>
<li class="">
<p><strong>Fusionar por IDs (<code>by_ids</code>)</strong>: Este método le brinda un control granular. Proporciona una lista explícita de <code>recording_ids</code> en el orden exacto en que desea que se fusionen. Esto es perfecto para escenarios más complejos donde podría estar combinando grabaciones de diferentes sesiones en una sola compilación.</p>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="vistazo-técnico-rápido">Vistazo Técnico Rápido<a href="https://www.plugnmeet.org/es/blog/merge-recordings-api#vistazo-t%C3%A9cnico-r%C3%A1pido" class="hash-link" aria-label="Enlace directo al Vistazo Técnico Rápido" title="Enlace directo al Vistazo Técnico Rápido" translate="no">​</a></h3>
<ul>
<li class=""><strong>Operación Asíncrona</strong>: Este es un trabajo en segundo plano. Su aplicación realiza la llamada a la API y obtiene una confirmación inmediata. El procesamiento real es manejado por una instancia de <code>plugnmeet-recorder</code>.</li>
<li class=""><strong>Notificación de Webhook</strong>: Debe tener un endpoint de webhook configurado para recibir el evento <code>recording_proceeded</code>. Este evento indicará que el archivo fusionado está listo y proporcionará su nuevo <code>record_id</code>.</li>
<li class=""><strong>Los Originales Están Seguros</strong>: El proceso de fusión no es destructivo. Sus archivos de grabación originales nunca se eliminan, lo que le da la libertad de gestionarlos como mejor le parezca.</li>
</ul>
<p>Para ejemplos detallados de solicitud y respuesta, consulte la <a class="" href="https://www.plugnmeet.org/es/docs/api/recording/merge-recordings">Documentación oficial de la API <code>mergeRecordings</code></a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="conclusión-una-experiencia-más-fluida-para-todos">Conclusión: Una Experiencia Más Fluida para Todos<a href="https://www.plugnmeet.org/es/blog/merge-recordings-api#conclusi%C3%B3n-una-experiencia-m%C3%A1s-fluida-para-todos" class="hash-link" aria-label="Enlace directo al Conclusión: Una Experiencia Más Fluida para Todos" title="Enlace directo al Conclusión: Una Experiencia Más Fluida para Todos" translate="no">​</a></h3>
<p>La API <code>mergeRecordings</code> cambia las reglas del juego para cualquiera que necesite ofrecer repeticiones de sesión pulidas y profesionales. Al automatizar la consolidación de grabaciones fragmentadas, ahorra tiempo a los administradores, simplifica los flujos de trabajo de postproducción y proporciona una experiencia de visualización perfecta para su audiencia.</p>
<p>Esta función es un ejemplo perfecto de nuestro compromiso de proporcionar una plataforma flexible y basada en API que pueda adaptarse a sus necesidades únicas, haciendo que su <strong>servidor de videollamadas</strong> sea más potente que nunca.</p>
<hr>
<p><strong>¿Listo para simplificar la gestión de sus grabaciones?</strong></p>
<ul>
<li class=""><strong><a class="" href="https://www.plugnmeet.org/es/docs/api/recording/merge-recordings">Explore la Documentación de la API <code>mergeRecordings</code></a></strong></li>
<li class=""><strong><a class="" href="https://www.plugnmeet.org/es/docs/api/intro">Consulte nuestra Referencia Completa de la API</a></strong></li>
<li class=""><strong><a class="" href="https://www.plugnmeet.org/es/docs/user-guide/moodle-integration">Obtenga más información sobre nuestra Integración con Moodle</a></strong></li>
</ul>]]></content:encoded>
            <category>API</category>
            <category>desarrollador</category>
            <category>grabación</category>
            <category>integración</category>
            <category>automatización</category>
            <category>edición de video</category>
            <category>Moodle</category>
            <category>caso de uso</category>
            <category>plugin videoconferencia Moodle</category>
            <category>servidor de videollamadas</category>
            <category>servidor de videoconferencia</category>
        </item>
        <item>
            <title><![CDATA[Inyectando Contenido en Tiempo Real: Guía para Desarrolladores de la Nueva API `uploadWhiteboardFile`]]></title>
            <link>https://www.plugnmeet.org/es/blog/programmatic-whiteboard-uploads-api</link>
            <guid>https://www.plugnmeet.org/es/blog/programmatic-whiteboard-uploads-api</guid>
            <pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[En Plug-N-Meet, nuestro objetivo es ofrecer una plataforma, no solo un producto. Si bien nuestra interfaz de usuario es rica en funciones, el verdadero poder de nuestra arquitectura reside en su diseño "API-first". Hoy, nos complace presentar un nuevo endpoint que brinda a los desarrolladores un control sin precedentes sobre las sesiones en vivo: /room/uploadWhiteboardFile.]]></description>
            <content:encoded><![CDATA[<p>En Plug-N-Meet, nuestro objetivo es ofrecer una plataforma, no solo un producto. Si bien nuestra interfaz de usuario es rica en funciones, el verdadero poder de nuestra arquitectura reside en su diseño "API-first". Hoy, nos complace presentar un nuevo endpoint que brinda a los desarrolladores un control sin precedentes sobre las sesiones en vivo: <code>/room/uploadWhiteboardFile</code>.</p>
<p>Esta API permite que su aplicación backend cargue archivos programáticamente directamente en la pizarra de una reunión activa, abriendo la puerta a flujos de trabajo de contenido potentes, fluidos y automatizados. Esta guía le mostrará los casos de uso clave de esta nueva función y cómo puede transformar su integración.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="por-qué-una-nueva-api-de-carga-el-poder-del-tiempo-real">¿Por qué una Nueva API de Carga? El Poder del Tiempo Real<a href="https://www.plugnmeet.org/es/blog/programmatic-whiteboard-uploads-api#por-qu%C3%A9-una-nueva-api-de-carga-el-poder-del-tiempo-real" class="hash-link" aria-label="Enlace directo al ¿Por qué una Nueva API de Carga? El Poder del Tiempo Real" title="Enlace directo al ¿Por qué una Nueva API de Carga? El Poder del Tiempo Real" translate="no">​</a></h3>
<p>Puede que esté familiarizado con la opción <code>preload_file</code> en nuestra <a class="" href="https://www.plugnmeet.org/es/docs/api/room/create">API de Creación de Salas</a>. Aunque útil, está diseñada para un propósito diferente: cargar un documento <em>antes</em> de que comience una sesión.</p>
<p>El nuevo endpoint <code>uploadWhiteboardFile</code> es fundamentalmente diferente. Está diseñado para inyectar contenido en una <strong>sesión en vivo y en curso</strong>. Esta capacidad en tiempo real cambia las reglas del juego para las aplicaciones dinámicas. Cuando su backend llama a esta API, el archivo aparece instantáneamente en la lista de archivos del presentador dentro de la reunión en vivo, listo para ser mostrado.</p>
<p>Veamos lo que puede crear con esto.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="caso-de-uso-1-integración-fluida-con-almacenamiento-en-la-nube-google-drive-dropbox-etc">Caso de Uso 1: Integración Fluida con Almacenamiento en la Nube (Google Drive, Dropbox, etc.)<a href="https://www.plugnmeet.org/es/blog/programmatic-whiteboard-uploads-api#caso-de-uso-1-integraci%C3%B3n-fluida-con-almacenamiento-en-la-nube-google-drive-dropbox-etc" class="hash-link" aria-label="Enlace directo al Caso de Uso 1: Integración Fluida con Almacenamiento en la Nube (Google Drive, Dropbox, etc.)" title="Enlace directo al Caso de Uso 1: Integración Fluida con Almacenamiento en la Nube (Google Drive, Dropbox, etc.)" translate="no">​</a></h3>
<p><strong>El Escenario:</strong> Un usuario de su aplicación desea presentar un archivo almacenado en su Google Drive.</p>
<p><strong>La Forma Antigua:</strong> El usuario tendría que descargar el archivo de Google Drive a su computadora y luego cargarlo manualmente a través de la interfaz de usuario de Plug-N-Meet. Este es un proceso torpe y de varios pasos.</p>
<p><strong>La Nueva Forma con la API:</strong></p>
<ol>
<li class="">La interfaz de usuario de su aplicación proporciona un botón: "Presentar desde Google Drive".</li>
<li class="">Utilizando la API de Google Drive, permite al usuario seleccionar un archivo.</li>
<li class="">Su servidor backend descarga de forma segura el archivo de Google Drive.</li>
<li class="">Su backend luego llama inmediatamente a la API <code>uploadWhiteboardFile</code>, enviando el archivo directamente a la sesión en vivo de Plug-N-Meet.</li>
</ol>
<p><strong>El Resultado:</strong> Una experiencia fluida y profesional. El usuario pasa de seleccionar un archivo en su aplicación a tenerlo listo para presentar en la reunión con un solo clic.</p>
<p><strong>Consejo Profesional:</strong> Para un flujo de trabajo aún más eficiente, puede usar el parámetro <code>document_link</code>. En lugar de descargar el archivo a su servidor primero, puede generar una URL temporal de acceso público para el archivo en el almacenamiento en la nube y pasar ese enlace a la API. El servidor de Plug-N-Meet se encargará de la descarga directamente.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="caso-de-uso-2-biblioteca-centralizada-de-recursos-para-empresas-y-educación">Caso de Uso 2: Biblioteca Centralizada de Recursos para Empresas y Educación<a href="https://www.plugnmeet.org/es/blog/programmatic-whiteboard-uploads-api#caso-de-uso-2-biblioteca-centralizada-de-recursos-para-empresas-y-educaci%C3%B3n" class="hash-link" aria-label="Enlace directo al Caso de Uso 2: Biblioteca Centralizada de Recursos para Empresas y Educación" title="Enlace directo al Caso de Uso 2: Biblioteca Centralizada de Recursos para Empresas y Educación" translate="no">​</a></h3>
<p><strong>El Escenario:</strong> Una empresa quiere asegurarse de que todas las presentaciones de ventas utilicen la última plantilla aprobada, o una universidad quiere proporcionar a los profesores una biblioteca de materiales de curso oficiales.</p>
<p><strong>La Forma Antigua:</strong> Los presentadores tendrían que buscar y descargar el archivo correcto desde un portal separado o una unidad compartida antes de cada reunión.</p>
<p><strong>La Nueva Forma con la API:</strong></p>
<ol>
<li class="">Usted construye una "Biblioteca de Recursos" directamente en el panel de control de su aplicación.</li>
<li class="">Un presentador, ya en una reunión en vivo, puede navegar por esta biblioteca desde la interfaz de su aplicación.</li>
<li class="">Cuando hacen clic en "Añadir a la Pizarra" en un recurso específico (por ejemplo, <code>Q3-Sales-Deck.pptx</code>), su backend recupera el archivo de su almacenamiento centralizado.</li>
<li class="">Su backend llama a la API <code>uploadWhiteboardFile</code> para inyectarlo en la sesión actual del presentador.</li>
</ol>
<p><strong>El Resultado:</strong> Perfecta coherencia de marca y acceso sin esfuerzo a materiales actualizados y oficiales, todo gestionado desde una única fuente de verdad.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="caso-de-uso-3-generación-dinámica-de-informes-y-análisis-sobre-la-marcha">Caso de Uso 3: Generación Dinámica de Informes y Análisis sobre la Marcha<a href="https://www.plugnmeet.org/es/blog/programmatic-whiteboard-uploads-api#caso-de-uso-3-generaci%C3%B3n-din%C3%A1mica-de-informes-y-an%C3%A1lisis-sobre-la-marcha" class="hash-link" aria-label="Enlace directo al Caso de Uso 3: Generación Dinámica de Informes y Análisis sobre la Marcha" title="Enlace directo al Caso de Uso 3: Generación Dinámica de Informes y Análisis sobre la Marcha" translate="no">​</a></h3>
<p><strong>El Escenario:</strong> Un equipo está en una reunión en vivo discutiendo métricas de rendimiento. Se dan cuenta de que necesitan ver un informe específico y actualizado al minuto que aún no existe.</p>
<p><strong>La Forma Antigua:</strong> Alguien tendría que salir de la reunión, generar el informe, guardarlo y luego cargarlo manualmente. El impulso de la reunión se pierde.</p>
<p><strong>La Nueva Forma con la API:</strong></p>
<ol>
<li class="">Su aplicación tiene un botón "Generar Informe en Vivo" integrado en su panel de control.</li>
<li class="">Un usuario en la reunión hace clic en el botón y selecciona los parámetros requeridos.</li>
<li class="">Su backend genera el informe (por ejemplo, un PDF de un gráfico) sobre la marcha.</li>
<li class="">Tan pronto como se crea el archivo, su backend llama a la API <code>uploadWhiteboardFile</code>.</li>
</ol>
<p><strong>El Resultado:</strong> Se genera un informe y se entrega a la reunión en vivo en segundos, lo que permite una toma de decisiones verdaderamente en tiempo real y basada en datos.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="caso-de-uso-4-integración-con-moodle---uniendo-contenido-y-aula">Caso de Uso 4: Integración con Moodle - Uniendo Contenido y Aula<a href="https://www.plugnmeet.org/es/blog/programmatic-whiteboard-uploads-api#caso-de-uso-4-integraci%C3%B3n-con-moodle---uniendo-contenido-y-aula" class="hash-link" aria-label="Enlace directo al Caso de Uso 4: Integración con Moodle - Uniendo Contenido y Aula" title="Enlace directo al Caso de Uso 4: Integración con Moodle - Uniendo Contenido y Aula" translate="no">​</a></h3>
<p><strong>El Escenario:</strong> Nuestro <a class="" href="https://www.plugnmeet.org/es/docs/user-guide/moodle-integration">Plugin oficial de Plug-N-Meet para Moodle</a> ya aprovecha esta API para crear una experiencia fluida para los educadores. Los profesores pueden gestionar un repositorio central de materiales del curso dentro de Moodle.</p>
<p><strong>La Nueva Forma con la API:</strong></p>
<ol>
<li class="">Un profesor está impartiendo una clase en vivo utilizando la actividad Plug-N-Meet en Moodle.</li>
<li class="">Decide que necesita mostrar un PDF o una presentación específica de los archivos de su curso de Moodle.</li>
<li class="">Desde una interfaz dentro de Moodle (fuera de la ventana de la sesión en vivo), el profesor selecciona el archivo.</li>
<li class="">El backend de Moodle llama a la API <code>uploadWhiteboardFile</code>, enviando instantáneamente el documento seleccionado al aula virtual en vivo.</li>
</ol>
<p><strong>El Resultado:</strong> El profesor nunca tiene que salir de su entorno Moodle. Puede inyectar materiales del curso en la sesión en vivo sobre la marcha, creando una experiencia de enseñanza fluida e ininterrumpida. Esto demuestra cómo la API puede unir un sistema de gestión de contenido externo directamente con una sesión en vivo.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="vistazo-técnico-rápido-y-consideraciones-importantes">Vistazo Técnico Rápido y Consideraciones Importantes<a href="https://www.plugnmeet.org/es/blog/programmatic-whiteboard-uploads-api#vistazo-t%C3%A9cnico-r%C3%A1pido-y-consideraciones-importantes" class="hash-link" aria-label="Enlace directo al Vistazo Técnico Rápido y Consideraciones Importantes" title="Enlace directo al Vistazo Técnico Rápido y Consideraciones Importantes" translate="no">​</a></h3>
<p>Este endpoint utiliza una solicitud <code>multipart/form-data</code>, que requiere un método de autenticación diferente al de nuestras APIs JSON estándar.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="autenticación">Autenticación<a href="https://www.plugnmeet.org/es/blog/programmatic-whiteboard-uploads-api#autenticaci%C3%B3n" class="hash-link" aria-label="Enlace directo al Autenticación" title="Enlace directo al Autenticación" translate="no">​</a></h4>
<p>La <code>HASH-SIGNATURE</code> debe generarse utilizando su <code>API-SECRET</code> con el valor del encabezado <code>Room-Id</code> como cuerpo del mensaje. Esto es diferente de otras APIs donde la firma se genera a partir del cuerpo de la solicitud.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="restricciones-de-archivo">Restricciones de Archivo<a href="https://www.plugnmeet.org/es/blog/programmatic-whiteboard-uploads-api#restricciones-de-archivo" class="hash-link" aria-label="Enlace directo al Restricciones de Archivo" title="Enlace directo al Restricciones de Archivo" translate="no">​</a></h4>
<ul>
<li class=""><strong>Tipos de Archivo Compatibles</strong>: Esta API está optimizada para documentos de oficina y presentaciones (<code>PDF</code>, <code>PPT</code>, <code>DOC</code>, etc.). Los archivos de imagen como <code>JPG</code> o <code>PNG</code> <strong>no</strong> son compatibles y serán rechazados.</li>
<li class=""><strong>Tamaño del Archivo</strong>: El archivo no debe exceder el límite <code>max_size_whiteboard_file</code> definido en la configuración de su servidor.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="comportamiento-del-servidor">Comportamiento del Servidor<a href="https://www.plugnmeet.org/es/blog/programmatic-whiteboard-uploads-api#comportamiento-del-servidor" class="hash-link" aria-label="Enlace directo al Comportamiento del Servidor" title="Enlace directo al Comportamiento del Servidor" translate="no">​</a></h4>
<ul>
<li class=""><strong>Cargas Concurrentes</strong>: El servidor procesa solo una carga a la vez por sala. Si envía una nueva solicitud de carga mientras otra está en curso para la misma sala, recibirá un error <code>409 Conflict</code>.</li>
<li class=""><strong>Tiempos de Espera y Procesamiento en Segundo Plano</strong>: La conversión de archivos puede consumir muchos recursos. Si su llamada inicial a la API agota el tiempo de espera, no se preocupe. El servidor continúa procesando el archivo en segundo plano. Una vez completado, el archivo aparecerá en la sala y el bloqueo de carga se liberará.</li>
</ul>
<p>Para un ejemplo completo de <code>curl</code> y descripciones detalladas de los parámetros, consulte la <strong><a class="" href="https://www.plugnmeet.org/es/docs/api/room/upload-whiteboard-file">Documentación oficial de la API uploadWhiteboardFile</a></strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="conclusión-su-aplicación-es-ahora-el-copresentador">Conclusión: Su Aplicación es Ahora el Copresentador<a href="https://www.plugnmeet.org/es/blog/programmatic-whiteboard-uploads-api#conclusi%C3%B3n-su-aplicaci%C3%B3n-es-ahora-el-copresentador" class="hash-link" aria-label="Enlace directo al Conclusión: Su Aplicación es Ahora el Copresentador" title="Enlace directo al Conclusión: Su Aplicación es Ahora el Copresentador" translate="no">​</a></h3>
<p>La API <code>uploadWhiteboardFile</code> transforma la pizarra de una simple herramienta controlada por el usuario en un lienzo programable y dinámico. Permite que su aplicación se convierta en un participante activo en la reunión, entregando contenido relevante exactamente cuando se necesita.</p>
<p>Esta función profundiza el potencial de integración, permitiéndole construir flujos de trabajo más inteligentes, más automatizados y altamente profesionales que distinguen a su aplicación.</p>
<hr>
<p><strong>¿Listo para empezar a construir?</strong></p>
<ul>
<li class=""><strong><a class="" href="https://www.plugnmeet.org/es/docs/api/room/upload-whiteboard-file">Explore la Documentación de la API <code>uploadWhiteboardFile</code></a></strong></li>
<li class=""><strong><a class="" href="https://www.plugnmeet.org/es/docs/api/intro">Consulte nuestra Referencia Completa de la API</a></strong></li>
<li class=""><strong><a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Pruebe nuestra Demostración en Vivo</a> para ver la pizarra en acción.</strong></li>
</ul>]]></content:encoded>
            <category>API</category>
            <category>desarrollo</category>
            <category>pizarra virtual</category>
            <category>integración</category>
            <category>automatización</category>
            <category>tiempo real</category>
            <category>subida de archivos</category>
            <category>Moodle</category>
            <category>plugin Moodle</category>
            <category>videoconferencia</category>
            <category>servidor de videollamadas</category>
            <category>servidor de videoconferencia</category>
        </item>
        <item>
            <title><![CDATA[Más allá de la Presentación: Diseñando Webinars Interactivos con Plug-N-Meet]]></title>
            <link>https://www.plugnmeet.org/es/blog/designing-interactive-webinars-with-plugnmeet</link>
            <guid>https://www.plugnmeet.org/es/blog/designing-interactive-webinars-with-plugnmeet</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Todos hemos estado en un webinar que se siente menos como un evento en vivo y más como una presentación de diapositivas glorificada. El presentador habla a la audiencia, el chat pasa desapercibido y el compromiso disminuye. En el mundo digital actual, simplemente transmitir información no es suficiente. Su audiencia espera participar, contribuir y sentirse parte activa de la experiencia.]]></description>
            <content:encoded><![CDATA[<p>Todos hemos estado en un webinar que se siente menos como un evento en vivo y más como una presentación de diapositivas glorificada. El presentador habla <em>a</em> la audiencia, el chat pasa desapercibido y el compromiso disminuye. En el mundo digital actual, simplemente transmitir información no es suficiente. Su audiencia espera participar, contribuir y sentirse parte activa de la experiencia.</p>
<p>En Plug-N-Meet, creemos que los webinars deben ser dinámicos, atractivos y verdaderamente interactivos. No se trata de reemplazar su presentación, sino de mejorarla con herramientas que fomenten la colaboración y los comentarios en tiempo real. Esta guía le mostrará cómo aprovechar las potentes funciones de Plug-N-Meet para diseñar webinars que cautiven a su audiencia y ofrezcan resultados medibles.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="el-problema-de-los-webinars-pasivos">El Problema de los Webinars Pasivos<a href="https://www.plugnmeet.org/es/blog/designing-interactive-webinars-with-plugnmeet#el-problema-de-los-webinars-pasivos" class="hash-link" aria-label="Enlace directo al El Problema de los Webinars Pasivos" title="Enlace directo al El Problema de los Webinars Pasivos" translate="no">​</a></h3>
<p>Los webinars tradicionales a menudo se quedan cortos porque tratan a la audiencia como consumidores pasivos. Esto conduce a:</p>
<ul>
<li class=""><strong>Bajo Compromiso:</strong> Los asistentes se desconectan, realizan múltiples tareas o simplemente se van.</li>
<li class=""><strong>Oportunidades Perdidas:</strong> Se pierden valiosas ideas y preguntas de la audiencia.</li>
<li class=""><strong>Aprendizaje Ineficaz:</strong> La retención de información es deficiente sin una participación activa.</li>
<li class=""><strong>Experiencia Genérica:</strong> Su evento se siente indistinguible de muchos otros.</li>
</ul>
<p>Plug-N-Meet le permite liberarse de este molde y crear webinars memorables e impactantes.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="el-kit-de-herramientas-interactivas-de-plug-n-meet">El Kit de Herramientas Interactivas de Plug-N-Meet<a href="https://www.plugnmeet.org/es/blog/designing-interactive-webinars-with-plugnmeet#el-kit-de-herramientas-interactivas-de-plug-n-meet" class="hash-link" aria-label="Enlace directo al El Kit de Herramientas Interactivas de Plug-N-Meet" title="Enlace directo al El Kit de Herramientas Interactivas de Plug-N-Meet" translate="no">​</a></h3>
<p>Nuestra plataforma está repleta de funciones diseñadas para convertir a su audiencia en participantes activos. Así es como puede utilizarlas:</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="1-encuestas-en-vivo-comentarios-instantáneos-y-toma-de-decisiones">1. Encuestas en Vivo: Comentarios Instantáneos y Toma de Decisiones<a href="https://www.plugnmeet.org/es/blog/designing-interactive-webinars-with-plugnmeet#1-encuestas-en-vivo-comentarios-instant%C3%A1neos-y-toma-de-decisiones" class="hash-link" aria-label="Enlace directo al 1. Encuestas en Vivo: Comentarios Instantáneos y Toma de Decisiones" title="Enlace directo al 1. Encuestas en Vivo: Comentarios Instantáneos y Toma de Decisiones" translate="no">​</a></h4>
<p>Olvídese de intentar contar respuestas en un chat caótico. Las Encuestas en Vivo le permiten hacer preguntas estructuradas y obtener comentarios inmediatos y cuantificables de toda su audiencia.</p>
<ul>
<li class=""><strong>Cómo usarlo:</strong> Lance cuestionarios rápidos para verificar la comprensión, evaluar opiniones sobre una nueva característica de producto o incluso tomar decisiones grupales. Puede ver los resultados en tiempo real y publicarlos para su discusión. Para más ideas, lea nuestra publicación sobre <a class="" href="https://www.plugnmeet.org/es/blog/engaging-audience-with-live-polls">Cómo Involucrar a la Audiencia con Encuestas en Vivo</a>.</li>
<li class=""><strong>Impacto:</strong> Aumenta el compromiso, proporciona datos valiosos y mantiene a la audiencia involucrada en el contenido.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="2-salas-de-grupo-colaboración-en-pequeños-grupos-a-escala">2. Salas de Grupo: Colaboración en Pequeños Grupos a Escala<a href="https://www.plugnmeet.org/es/blog/designing-interactive-webinars-with-plugnmeet#2-salas-de-grupo-colaboraci%C3%B3n-en-peque%C3%B1os-grupos-a-escala" class="hash-link" aria-label="Enlace directo al 2. Salas de Grupo: Colaboración en Pequeños Grupos a Escala" title="Enlace directo al 2. Salas de Grupo: Colaboración en Pequeños Grupos a Escala" translate="no">​</a></h4>
<p>Para talleres, sesiones de capacitación o sesiones de lluvia de ideas, las discusiones en grupos pequeños son invaluables. Las Salas de Grupo le permiten dividir a su gran audiencia en sub-reuniones más pequeñas y privadas.</p>
<ul>
<li class=""><strong>Cómo usarlo:</strong> Asigne a los participantes de forma aleatoria o manual a los grupos. Cada sala tiene su propia pizarra interactiva privada, bloc de notas compartido y capacidades completas de audio/video. Como moderador, puede transmitir mensajes a todas las salas o unirse a grupos específicos. Obtenga más información en nuestra guía para <a class="" href="https://www.plugnmeet.org/es/blog/mastering-breakout-rooms">Dominar las Salas de Grupo</a>.</li>
<li class=""><strong>Impacto:</strong> Fomenta una colaboración más profunda, anima a los participantes más reservados a expresarse y permite la resolución de problemas de forma enfocada.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="3-pizarra-interactiva-y-bloc-de-notas-compartido-colaboración-visual-y-textual">3. Pizarra Interactiva y Bloc de Notas Compartido: Colaboración Visual y Textual<a href="https://www.plugnmeet.org/es/blog/designing-interactive-webinars-with-plugnmeet#3-pizarra-interactiva-y-bloc-de-notas-compartido-colaboraci%C3%B3n-visual-y-textual" class="hash-link" aria-label="Enlace directo al 3. Pizarra Interactiva y Bloc de Notas Compartido: Colaboración Visual y Textual" title="Enlace directo al 3. Pizarra Interactiva y Bloc de Notas Compartido: Colaboración Visual y Textual" translate="no">​</a></h4>
<p>Vaya más allá de las diapositivas estáticas. Nuestra pizarra interactiva y bloc de notas compartido integrados proporcionan lienzos dinámicos para la ideación y la toma de notas colectivas.</p>
<ul>
<li class=""><strong>Cómo usarlo:</strong> Suba presentaciones o documentos a la pizarra y anótelos en tiempo real. Habilite el modo de dibujo multiusuario para la lluvia de ideas colaborativa. Utilice el bloc de notas compartido para la toma de notas colectiva, la redacción de ideas o la creación de listas de elementos de acción. Profundice en nuestra <a class="" href="https://www.plugnmeet.org/es/blog/integrated-whiteboard-experience">Experiencia de Pizarra Interactiva Integrada</a>.</li>
<li class=""><strong>Impacto:</strong> Mejora el aprendizaje visual, aclara conceptos abstractos y crea artefactos compartidos de la sesión.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="4-preguntas-y-respuestas--levantar-la-mano-interacción-estructurada-con-la-audiencia">4. Preguntas y Respuestas / Levantar la Mano: Interacción Estructurada con la Audiencia<a href="https://www.plugnmeet.org/es/blog/designing-interactive-webinars-with-plugnmeet#4-preguntas-y-respuestas--levantar-la-mano-interacci%C3%B3n-estructurada-con-la-audiencia" class="hash-link" aria-label="Enlace directo al 4. Preguntas y Respuestas / Levantar la Mano: Interacción Estructurada con la Audiencia" title="Enlace directo al 4. Preguntas y Respuestas / Levantar la Mano: Interacción Estructurada con la Audiencia" translate="no">​</a></h4>
<p>Gestione las preguntas de manera efectiva sin interrumpir el flujo de su presentación.</p>
<ul>
<li class=""><strong>Cómo usarlo:</strong> Anime a los asistentes a utilizar la función "Levantar la Mano" para indicar que tienen una pregunta. Como moderador, puede silenciarlos y luego reactivar su micrófono individualmente. Utilice el chat público para comentarios generales, pero dirija las preguntas específicas a un segmento dedicado de Preguntas y Respuestas. Nuestra <a class="" href="https://www.plugnmeet.org/es/blog/moderator-guide-room-lock-settings">Guía del Moderador para la Configuración de Bloqueo de Sala</a> proporciona más detalles sobre la gestión de interacciones.</li>
<li class=""><strong>Impacto:</strong> Mantiene el orden, asegura que todas las preguntas sean abordadas y da a cada participante la oportunidad de ser escuchado.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="5-incrustar-contenido-web-presentaciones-dinámicas">5. Incrustar Contenido Web: Presentaciones Dinámicas<a href="https://www.plugnmeet.org/es/blog/designing-interactive-webinars-with-plugnmeet#5-incrustar-contenido-web-presentaciones-din%C3%A1micas" class="hash-link" aria-label="Enlace directo al 5. Incrustar Contenido Web: Presentaciones Dinámicas" title="Enlace directo al 5. Incrustar Contenido Web: Presentaciones Dinámicas" translate="no">​</a></h4>
<p>Traiga la web directamente a su reunión sin la torpeza de compartir la pantalla.</p>
<ul>
<li class=""><strong>Cómo usarlo:</strong> Comparta cualquier sitio web, aplicación en línea (como un Google Doc, un tablero de Miro o una herramienta de gestión de proyectos) o contenido interactivo directamente dentro de la ventana de la reunión. Descubra más en <a class="" href="https://www.plugnmeet.org/es/blog/embed-web-content-dynamic-collaboration">Traiga la Web a su Reunión</a>.</li>
<li class=""><strong>Impacto:</strong> Crea una experiencia de presentación fluida e integrada, reduce las distracciones y permite el trabajo colaborativo en tiempo real sobre recursos externos.</li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="diseñando-su-webinar-interactivo-un-ejemplo-de-flujo-de-trabajo">Diseñando su Webinar Interactivo: Un Ejemplo de Flujo de Trabajo<a href="https://www.plugnmeet.org/es/blog/designing-interactive-webinars-with-plugnmeet#dise%C3%B1ando-su-webinar-interactivo-un-ejemplo-de-flujo-de-trabajo" class="hash-link" aria-label="Enlace directo al Diseñando su Webinar Interactivo: Un Ejemplo de Flujo de Trabajo" title="Enlace directo al Diseñando su Webinar Interactivo: Un Ejemplo de Flujo de Trabajo" translate="no">​</a></h3>
<p>Así es como podría estructurar un webinar interactivo de 60 minutos utilizando Plug-N-Meet:</p>
<ul>
<li class="">
<p><strong>Configuración Pre-Webinar:</strong></p>
<ul>
<li class=""><strong>Habilitar Funciones:</strong> Al crear su sala (a través de la API o el panel de control), asegúrese de que <code>polls_features</code>, <code>breakout_room_features</code>, <code>whiteboard_features</code>, <code>shared_note_pad_features</code>, y <code>display_external_link_features</code> estén todos habilitados. Puede encontrar parámetros detallados de la API en nuestra <a class="" href="https://www.plugnmeet.org/es/docs/api/room/create">Documentación de la API para Crear Sala</a>.</li>
<li class=""><strong>Configuración de Bloqueo Predeterminada:</strong> Para un webinar, podría comenzar con los micrófonos y las cámaras web bloqueados para los asistentes por defecto para mantener el control. Consulte nuestra <a class="" href="https://www.plugnmeet.org/es/docs/user-guide/moderator">Guía del Moderador</a> para obtener más información sobre la configuración de bloqueo.</li>
<li class=""><strong>Webhooks:</strong> Configure un webhook para automatizar tareas post-webinar como el envío de grabaciones o resúmenes. Aprenda cómo en <a class="" href="https://www.plugnmeet.org/es/blog/how-to-build-your-first-webhook-workflow">Cómo Construir su Primer Flujo de Trabajo Automatizado con Webhooks</a>.</li>
</ul>
</li>
<li class="">
<p><strong>0-5 Minutos: Bienvenida y Rompehielos (Pizarra Interactiva)</strong></p>
<ul>
<li class="">Comience con una actividad sencilla y atractiva. Suba un mapa mundial a la pizarra y pida a los participantes que marquen su ubicación utilizando la herramienta de dibujo multiusuario. Esto hace que todos se sientan cómodos con las herramientas y crea una representación visual de su audiencia global.</li>
</ul>
</li>
<li class="">
<p><strong>5-20 Minutos: Presentación Principal y Verificación Rápida (Encuestas en Vivo)</strong></p>
<ul>
<li class="">Entregue su contenido inicial. Después de un segmento clave, lance una encuesta rápida para verificar la comprensión o recopilar opiniones. "¿En una escala del 1 al 5, qué tan relevante es este tema para su trabajo?" Publique los resultados y discútalos brevemente.</li>
</ul>
</li>
<li class="">
<p><strong>20-40 Minutos: Actividad Colaborativa (Salas de Grupo con Pizarra/Bloc de Notas)</strong></p>
<ul>
<li class="">Introduzca un problema o tema de discusión. Divida a su audiencia en pequeños grupos utilizando las Salas de Grupo. Indíqueles que utilicen sus pizarras privadas para la lluvia de ideas o los blocs de notas compartidos para esbozar soluciones. Transmita un mensaje de "¡Quedan 5 minutos!" antes de traerlos de vuelta.</li>
</ul>
</li>
<li class="">
<p><strong>40-50 Minutos: Resumen, Preguntas y Respuestas (Encuestas en Vivo y Levantar la Mano)</strong></p>
<ul>
<li class="">Una vez de vuelta en la sala principal, lance otra encuesta: "¿Qué solución encontró su grupo más prometedora?" Publique los resultados. Luego, abra el turno de preguntas utilizando la función "Levantar la Mano", reactivando el micrófono de los participantes uno por uno.</li>
</ul>
</li>
<li class="">
<p><strong>50-60 Minutos: Contenido Dinámico y Llamada a la Acción (Embeber Contenido Web)</strong></p>
<ul>
<li class="">En lugar de simplemente decir a la gente adónde ir, utilice "Compartir Enlace Externo" para mostrar su sitio web, un formulario de registro o un recurso relevante directamente en la reunión. Concluya con una encuesta final para obtener la opinión general.</li>
</ul>
</li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="conclusión-su-audiencia-merece-más">Conclusión: Su Audiencia Merece Más<a href="https://www.plugnmeet.org/es/blog/designing-interactive-webinars-with-plugnmeet#conclusi%C3%B3n-su-audiencia-merece-m%C3%A1s" class="hash-link" aria-label="Enlace directo al Conclusión: Su Audiencia Merece Más" title="Enlace directo al Conclusión: Su Audiencia Merece Más" translate="no">​</a></h3>
<p>Ir más allá de la presentación pasiva transforma sus webinars de transmisiones olvidables en eventos memorables y de alto impacto. Con Plug-N-Meet, usted tiene un completo kit de herramientas de código abierto para diseñar experiencias verdaderamente interactivas que involucren a su audiencia, fomenten la colaboración y ofrezcan un valor real.</p>
<p>En lugar de solo hablar a su audiencia, trabaje junto a ella.</p>
<hr>
<p><strong>¿Listo para diseñar su próximo webinar interactivo?</strong></p>
<ul>
<li class=""><strong><a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Pruebe estas funciones en nuestra Demostración en Vivo</a></strong></li>
<li class=""><strong><a href="https://github.com/mynaparrot/plugNmeet-server" target="_blank" rel="noopener noreferrer" class="">Explore nuestro Proyecto de Código Abierto en GitHub</a></strong></li>
<li class=""><strong><a class="" href="https://www.plugnmeet.org/es/docs/user-guide/moderator">Lea nuestra Guía del Moderador</a> para obtener más consejos sobre la gestión de sesiones interactivas.</strong></li>
</ul>]]></content:encoded>
            <category>webinario</category>
            <category>webinario interactivo</category>
            <category>participación</category>
            <category>encuestas</category>
            <category>salas de grupos</category>
            <category>pizarra</category>
            <category>q&amp;a</category>
            <category>moderador</category>
            <category>funciones</category>
            <category>código abierto</category>
        </item>
        <item>
            <title><![CDATA[5 Ways an AI Assistant Can Transform Your Virtual Classroom]]></title>
            <link>https://www.plugnmeet.org/es/blog/ai-transforms-virtual-classroom</link>
            <guid>https://www.plugnmeet.org/es/blog/ai-transforms-virtual-classroom</guid>
            <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The shift to online learning has opened up incredible opportunities, but it also comes with unique challenges. How do you keep students engaged when they're just another face in a grid? How do you cater to different learning styles and language needs through a screen?]]></description>
            <content:encoded><![CDATA[<p>The shift to online learning has opened up incredible opportunities, but it also comes with unique challenges. How do you keep students engaged when they're just another face in a grid? How do you cater to different learning styles and language needs through a screen?</p>
<p>The answer isn't to work harder; it's to teach smarter. Imagine having a silent partner in every session, one that makes your virtual classroom more inclusive, accessible, and effective. This is the power of an <strong>AI Teaching Assistant</strong>. Here are 5 ways it can revolutionize your online teaching.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="1-make-every-student-feel-included-with-live-translation">1. Make Every Student Feel Included with Live Translation<a href="https://www.plugnmeet.org/es/blog/ai-transforms-virtual-classroom#1-make-every-student-feel-included-with-live-translation" class="hash-link" aria-label="Enlace directo al 1. Make Every Student Feel Included with Live Translation" title="Enlace directo al 1. Make Every Student Feel Included with Live Translation" translate="no">​</a></h3>
<p><strong>The Challenge:</strong> A student’s primary language isn't the one being spoken in class. They struggle to keep up, hesitate to participate, and quickly become disengaged.</p>
<p><strong>The AI Solution:</strong> With a single click, that student can enable live, real-time translation. As you speak, they see captions in their native language, allowing them to understand the material and formulate questions. This simple tool breaks down language barriers and fosters a truly global, inclusive classroom where every student has a voice.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="2-boost-comprehension-for-every-learning-style">2. Boost Comprehension for Every Learning Style<a href="https://www.plugnmeet.org/es/blog/ai-transforms-virtual-classroom#2-boost-comprehension-for-every-learning-style" class="hash-link" aria-label="Enlace directo al 2. Boost Comprehension for Every Learning Style" title="Enlace directo al 2. Boost Comprehension for Every Learning Style" translate="no">​</a></h3>
<p><strong>The Challenge:</strong> Students have diverse learning needs. Some are visual learners, some may be in a noisy environment, and others may have hearing impairments.</p>
<p><strong>The AI Solution:</strong> Live transcription provides real-time captions of everything you say. This reinforces your lesson visually, helps students catch anything they might have missed, and provides a critical accessibility tool. It ensures that all students can follow along, improving focus and knowledge retention for everyone.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="3-get-instant-answers-with-a-built-in-research-assistant">3. Get Instant Answers with a Built-in Research Assistant<a href="https://www.plugnmeet.org/es/blog/ai-transforms-virtual-classroom#3-get-instant-answers-with-a-built-in-research-assistant" class="hash-link" aria-label="Enlace directo al 3. Get Instant Answers with a Built-in Research Assistant" title="Enlace directo al 3. Get Instant Answers with a Built-in Research Assistant" translate="no">​</a></h3>
<p><strong>The Challenge:</strong> You mention a concept or historical figure that a student isn't familiar with. To understand it, the student has to open a new browser tab, search, and read, causing them to miss the next part of the lesson.</p>
<p><strong>The AI Solution:</strong> The AI Assistant acts as a built-in research tool. A student can privately ask the AI general knowledge questions like, "Who was Marie Curie?" or "What is the Pythagorean theorem?" and get a quick, concise answer without ever leaving the meeting window. This helps them fill knowledge gaps instantly and stay focused on the live lesson.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="4-create-perfect-searchable-study-guidesautomatically">4. Create Perfect, Searchable Study Guides—Automatically<a href="https://www.plugnmeet.org/es/blog/ai-transforms-virtual-classroom#4-create-perfect-searchable-study-guidesautomatically" class="hash-link" aria-label="Enlace directo al 4. Create Perfect, Searchable Study Guides—Automatically" title="Enlace directo al 4. Create Perfect, Searchable Study Guides—Automatically" translate="no">​</a></h3>
<p><strong>The Challenge:</strong> After a long lecture, you need to share your notes, and students need a reliable way to review the material.</p>
<p><strong>The AI Solution:</strong> Forget manual note-taking. Once the session is over, the AI Assistant automatically generates a concise summary of the entire lesson, complete with key concepts and action items. This becomes a perfect, searchable study guide that saves both you and your students hours of work.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="5-focus-on-teaching-not-juggling-tasks">5. Focus on Teaching, Not Juggling Tasks<a href="https://www.plugnmeet.org/es/blog/ai-transforms-virtual-classroom#5-focus-on-teaching-not-juggling-tasks" class="hash-link" aria-label="Enlace directo al 5. Focus on Teaching, Not Juggling Tasks" title="Enlace directo al 5. Focus on Teaching, Not Juggling Tasks" translate="no">​</a></h3>
<p><strong>The Challenge:</strong> As an educator, you're juggling multiple roles at once: presenting content, managing participants, monitoring the chat, and trying to take notes.</p>
<p><strong>The AI Solution:</strong> By offloading the tasks of transcription and post-meeting summarization to the AI, you are free to do what you do best: teach. You can focus entirely on student-interaction, gauge understanding, and deliver a more dynamic and engaging lesson.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="your-new-superpower">Your New Superpower<a href="https://www.plugnmeet.org/es/blog/ai-transforms-virtual-classroom#your-new-superpower" class="hash-link" aria-label="Enlace directo al Your New Superpower" title="Enlace directo al Your New Superpower" translate="no">​</a></h2>
<p>AI isn't about replacing great teachers; it's about giving them superpowers. It automates the tedious tasks, breaks down barriers to participation, and allows you to create a more powerful and equitable learning experience for every student.</p>
<p>At plugNmeet, we believe this technology should be simple and accessible for everyone.</p>
<p><strong>For educators</strong>, our platform integrates seamlessly into the tools you already use. Get started in minutes with our guides for <a class="" href="https://www.plugnmeet.org/es/docs/user-guide/moodle-integration">Moodle</a>, <a class="" href="https://www.plugnmeet.org/es/docs/user-guide/wordPress-integration">WordPress</a>, or <a class="" href="https://www.plugnmeet.org/es/docs/user-guide/joomla-integration">Joomla</a>.</p>
<p><strong>For developers</strong>, our flexible, open-source foundation is so powerful you can <a class="" href="https://www.plugnmeet.org/es/blog/build-video-conferencing-app-in-under-an-hour">build a complete video conferencing app in under an hour</a>.</p>
<p><strong>Ready to see how an AI assistant can transform your classroom?</strong></p>
<ul>
<li class=""><strong><a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Try our Live Demo</a></strong> to experience these features firsthand.</li>
<li class=""><strong>Want to learn how it works?</strong> Read our technical guide on <a class="" href="https://www.plugnmeet.org/es/blog/how-to-add-ai-meeting-assistant-features">how to add an AI meeting assistant</a>.</li>
</ul>]]></content:encoded>
            <category>ai</category>
            <category>online-classroom</category>
            <category>virtual-classroom</category>
            <category>student-engagement</category>
            <category>ai-for-education</category>
            <category>teaching-assistant</category>
            <category>inclusive-classroom</category>
            <category>online-teaching</category>
        </item>
        <item>
            <title><![CDATA[Integración profunda, funciones potentes: ¡Ya está aquí el nuevo plugin de plugNmeet para Moodle!]]></title>
            <link>https://www.plugnmeet.org/es/blog/new-plugnmeet-moodle-plugin-deep-integration</link>
            <guid>https://www.plugnmeet.org/es/blog/new-plugnmeet-moodle-plugin-deep-integration</guid>
            <pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Descubra el plugin plugNmeet para Moodle 4.5+ completamente reconstruido. Con una integración profunda con los sistemas centrales de Moodle, asistencia acumulativa, artefactos de IA y una experiencia de marca blanca fluida.]]></description>
            <content:encoded><![CDATA[<p>Enviar a los estudiantes a un enlace de videoconferencia externo interrumpe el flujo de aprendizaje, crea una experiencia desarticulada y los aleja del entorno de Moodle que usted ha construido cuidadosamente. ¿Qué pasaría si su aula virtual no fuera un desvío, sino un destino: una parte nativa de su curso?</p>
<p>Hoy, nos complace anunciar el lanzamiento del plugin plugNmeet para Moodle, completamente reconstruido. Esto no es solo una actualización; es un rediseño desde cero centrado en un objetivo: una integración profunda y fluida que hace que su aula virtual se sienta como una actividad central de Moodle.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="un-gran-salto-adelante">Un gran salto adelante<a href="https://www.plugnmeet.org/es/blog/new-plugnmeet-moodle-plugin-deep-integration#un-gran-salto-adelante" class="hash-link" aria-label="Enlace directo al Un gran salto adelante" title="Enlace directo al Un gran salto adelante" translate="no">​</a></h3>
<p>Si bien nuestro plugin anterior ofrecía funciones básicas de marca y grabación, esta nueva versión se encuentra en una liga diferente. Lo hemos reconstruido desde cero con un enfoque preciso en los <strong>estándares de Moodle 4.5+</strong>, creando una solución robusta, segura y profundamente integrada. La interfaz de usuario ahora es más limpia e intuitiva, con funciones ubicadas lógicamente dentro del contexto de la actividad de Moodle, tal como cabría esperar.</p>
<p>Entonces, ¿qué hace que esta nueva versión sea tan especial? Sumerjámonos en las funciones que cambiarán la forma en que enseña en línea.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="más-que-un-plugin-es-parte-de-moodle">Más que un plugin: es parte de Moodle<a href="https://www.plugnmeet.org/es/blog/new-plugnmeet-moodle-plugin-deep-integration#m%C3%A1s-que-un-plugin-es-parte-de-moodle" class="hash-link" aria-label="Enlace directo al Más que un plugin: es parte de Moodle" title="Enlace directo al Más que un plugin: es parte de Moodle" translate="no">​</a></h3>
<p>Fuimos más allá de la simple incrustación para integrar profundamente plugNmeet en los sistemas centrales de Moodle.</p>
<ul>
<li class=""><strong>Seguimiento de finalización avanzado:</strong> Vaya más allá de las simples métricas de "visto". Nuestro plugin introduce <strong>criterios de finalización acumulativos</strong>. Realice un seguimiento de la participación del usuario en <em>todas</em> las sesiones dentro de una única actividad de Moodle. Marque la actividad como completada según:<!-- -->
<ul>
<li class="">Minutos totales de asistencia</li>
<li class="">Duración total de la cámara web o del micrófono</li>
<li class="">Número de mensajes de chat enviados</li>
<li class="">Levantar la mano, votar en una encuesta y más...</li>
</ul>
</li>
<li class=""><strong>Integración automática con el calendario:</strong> Cuando programa una sesión utilizando la fecha "Disponible desde", el plugin crea automáticamente un evento en el Calendario de Moodle. Sus estudiantes verán las próximas clases en su tablero y calendarios de cursos, lo que aumenta la visibilidad y la asistencia.</li>
<li class=""><strong>Integración con el libro de calificaciones:</strong> Asigne una calificación para su actividad de plugNmeet. El plugin puede calcular automáticamente una calificación basada en el progreso de finalización de los criterios que establezca.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="transparencia-y-conocimientos-basados-en-datos">Transparencia y conocimientos basados en datos<a href="https://www.plugnmeet.org/es/blog/new-plugnmeet-moodle-plugin-deep-integration#transparencia-y-conocimientos-basados-en-datos" class="hash-link" aria-label="Enlace directo al Transparencia y conocimientos basados en datos" title="Enlace directo al Transparencia y conocimientos basados en datos" translate="no">​</a></h3>
<p>El conocimiento es poder, no solo para los profesores, sino también para los estudiantes. Este plugin le proporciona los datos que necesita para comprender el compromiso como nunca antes.</p>
<ul>
<li class=""><strong>Nuevo tablero de autoinforme para estudiantes:</strong> Los estudiantes ya no tienen que preguntarse sobre su progreso. Ahora tienen acceso a un hermoso tablero personalizado que muestra sus datos de participación acumulada en un diseño moderno basado en tarjetas.</li>
<li class=""><strong>Seguimiento visual del progreso:</strong> Si se establecen criterios de finalización, los estudiantes ven tarjetas de estado codificadas por colores (Verde para cumplido, Amarillo para pendiente) con insignias claras que indican exactamente lo que deben hacer para completar la actividad.</li>
<li class=""><strong>Informes de asistencia acumulada:</strong> Los profesores obtienen una lista de asistencia consolidada para toda la actividad. Vea de un vistazo quién asiste y durante cuánto tiempo a través de una serie de clases, con la capacidad de exportar los datos a Excel.</li>
<li class=""><strong>Tablero de sesión en vivo:</strong> ¿Necesita saber qué está sucediendo en una clase en vivo en este momento? Los profesores pueden ver un tablero en tiempo real que muestra el número de participantes, cámaras web activas, micrófonos y más.</li>
<li class=""><strong>Artefactos de sesión en Moodle:</strong> Después de una sesión, todos los archivos generados, incluidos los resúmenes de reuniones impulsados por IA, las transcripciones completas (archivos VTT) y los informes de análisis detallados, están disponibles directamente en la página de actividad de Moodle.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="construido-para-administradores-y-desarrolladores">Construido para administradores y desarrolladores<a href="https://www.plugnmeet.org/es/blog/new-plugnmeet-moodle-plugin-deep-integration#construido-para-administradores-y-desarrolladores" class="hash-link" aria-label="Enlace directo al Construido para administradores y desarrolladores" title="Enlace directo al Construido para administradores y desarrolladores" translate="no">​</a></h3>
<p>Construimos este plugin para que sea tan potente para los administradores como lo es para los profesores.</p>
<ul>
<li class=""><strong>Experiencia 100% de marca blanca:</strong> Utilizando el modo de cliente <code>Remoto (Incrustado)</code>, el aula plugNmeet se carga directamente dentro del diseño de su sitio Moodle. No hay redireccionamientos ni marcas de terceros. Para sus usuarios, es simplemente <em>su</em> aula virtual, impulsada por Moodle.</li>
<li class=""><strong>Acceso granular basado en roles:</strong> Hemos implementado un conjunto completo de capacidades de Moodle para brindarle un control detallado sobre quién puede administrar salas, ver grabaciones, descargar artefactos y ver informes de asistencia.</li>
<li class=""><strong>API de eventos extensible:</strong> El plugin recibe datos en tiempo real de su servidor plugNmeet a través de webhooks y los retransmite inmediatamente como eventos estándar de Moodle. Esto permite a los desarrolladores conectarse fácilmente a eventos como <code>participant_joined</code> o <code>recording_proceeded</code> para construir integraciones personalizadas y ampliar la funcionalidad.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="una-experiencia-fluida-para-todos">Una experiencia fluida para todos<a href="https://www.plugnmeet.org/es/blog/new-plugnmeet-moodle-plugin-deep-integration#una-experiencia-fluida-para-todos" class="hash-link" aria-label="Enlace directo al Una experiencia fluida para todos" title="Enlace directo al Una experiencia fluida para todos" translate="no">​</a></h3>
<ul>
<li class=""><strong>Acceso seguro para invitados:</strong> Un nuevo flujo de trabajo seguro le permite generar enlaces de invitados de un solo uso y de tiempo limitado para oradores invitados o participantes externos, sin comprometer la seguridad de su sitio.</li>
<li class=""><strong>Página de grabaciones rediseñada:</strong> Gestionar las grabaciones en la nube ahora es muy fácil. Vea y controle la visibilidad de sus grabaciones desde una interfaz limpia e intuitiva dentro de la página de actividad.</li>
</ul>
<hr>
<p><strong>¿Listo para mejorar sus cursos de Moodle?</strong></p>
<ul>
<li class=""><strong><a href="https://moodle.org/plugins/mod_plugnmeet" target="_blank" rel="noopener noreferrer" class="">Descargue el plugin oficial de Moodle</a></strong></li>
<li class=""><strong><a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Pruebe la demostración en vivo</a> para explorar las herramientas de enseñanza.</strong></li>
<li class=""><strong>Siga nuestra <a class="" href="https://www.plugnmeet.org/es/docs/installation">Guía de instalación</a> para poner en marcha su servidor.</strong></li>
</ul>]]></content:encoded>
            <category>moodle</category>
            <category>plugnmeet</category>
            <category>virtual classroom</category>
            <category>e-learning</category>
            <category>video conferencing</category>
            <category>moodle-virtual-classroom</category>
            <category>moodle-plugin</category>
            <category>moodle-integration</category>
            <category>online-learning</category>
            <category>education-technology</category>
        </item>
        <item>
            <title><![CDATA[Unlock True Control: Why Self-Hosted, Open Source Webinar Software is Your Best Bet]]></title>
            <link>https://www.plugnmeet.org/es/blog/self-hosted-open-source-webinar-software</link>
            <guid>https://www.plugnmeet.org/es/blog/self-hosted-open-source-webinar-software</guid>
            <pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In an era dominated by digital communication, webinars and online meetings have become indispensable. Yet, many organizations find themselves trapped in the rigid, often expensive, ecosystems of proprietary software like Zoom or GoToWebinar. These tools, while convenient, often come with hidden costs, limited customization, and significant concerns about data privacy and ownership.]]></description>
            <content:encoded><![CDATA[<p>In an era dominated by digital communication, webinars and online meetings have become indispensable. Yet, many organizations find themselves trapped in the rigid, often expensive, ecosystems of proprietary software like Zoom or GoToWebinar. These tools, while convenient, often come with hidden costs, limited customization, and significant concerns about data privacy and ownership.</p>
<p>What if you could host professional webinars and meetings with unparalleled control, complete data privacy, and the flexibility to tailor every aspect to your brand and workflow? This is the promise of <strong>open source webinar software</strong> and <strong>self-hosted meeting</strong> platforms. At plugNmeet, we believe in empowering you to reclaim ownership of your digital interactions.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="the-power-of-open-source-webinar-software-more-than-just-a-tool">The Power of Open Source Webinar Software: More Than Just a Tool<a href="https://www.plugnmeet.org/es/blog/self-hosted-open-source-webinar-software#the-power-of-open-source-webinar-software-more-than-just-a-tool" class="hash-link" aria-label="Enlace directo al The Power of Open Source Webinar Software: More Than Just a Tool" title="Enlace directo al The Power of Open Source Webinar Software: More Than Just a Tool" translate="no">​</a></h2>
<p>When you search for "open source webinar software," you're looking for freedom. You want to own your brand, manage your audience, and create a unique, professional presentation without being locked into a vendor's ecosystem.</p>
<p>Proprietary webinar tools often treat a webinar like a glorified meeting, lacking the specific features needed for a structured, engaging event. An open-source platform, however, allows for:</p>
<ol>
<li class=""><strong>Clear Roles &amp; Moderation:</strong> Distinguish between presenters and attendees, with granular control over permissions. A dedicated admin can manage the audience, while the presenter focuses on content delivery, as detailed in our post on <a class="" href="https://www.plugnmeet.org/es/blog/open-source-webinar-software-platform">open source webinar software platforms</a>.</li>
<li class=""><strong>Structured Engagement:</strong> Move beyond chaotic chat. Implement live polls for Q&amp;A, quizzes, and use features like "Raise Hand" for organized interaction.</li>
<li class=""><strong>Complete Branding:</strong> Your webinar is your show. Open-source solutions, especially those built with an API-first approach like plugNmeet, allow for deep customization – from logos and colors to entirely rebuilding the layout to match your brand identity perfectly.</li>
<li class=""><strong>Content Ownership:</strong> Recordings are valuable assets. With open-source, you own your content, saving it to your servers and automating post-webinar workflows (e.g., uploading to YouTube, sending to attendees).</li>
</ol>
<p>Open source isn't just about cost; it's about community, transparency, and the ability to adapt the software to your exact needs, rather than adapting your needs to the software.</p>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="why-self-hosted-meeting-solutions-are-non-negotiable-for-control--privacy">Why Self-Hosted Meeting Solutions are Non-Negotiable for Control &amp; Privacy<a href="https://www.plugnmeet.org/es/blog/self-hosted-open-source-webinar-software#why-self-hosted-meeting-solutions-are-non-negotiable-for-control--privacy" class="hash-link" aria-label="Enlace directo al Why Self-Hosted Meeting Solutions are Non-Negotiable for Control &amp; Privacy" title="Enlace directo al Why Self-Hosted Meeting Solutions are Non-Negotiable for Control &amp; Privacy" translate="no">​</a></h2>
<p>The "self-hosted meeting" aspect takes control to the next level. When you host your own video conferencing infrastructure, you gain benefits that proprietary cloud services simply cannot offer:</p>
<ul>
<li class=""><strong>Unmatched Data Ownership &amp; Privacy:</strong> Your conversations, recordings, and user data reside entirely within your infrastructure. This is critical for compliance with regulations like GDPR, HIPAA, and other industry-specific privacy standards. You are in command of your data, not a third-party vendor.</li>
<li class=""><strong>Cost-Effectiveness at Scale:</strong> Proprietary solutions often charge per-user or per-minute, leading to escalating costs. Self-hosting offers predictable infrastructure costs, making it a significantly more cost-effective solution for long-term, large-scale deployments. For strategies on <a class="" href="https://www.plugnmeet.org/es/blog/hosting-large-scale-events-the-smart-way">hosting large-scale events</a>, we recommend a broadcast studio model to maximize scalability and minimize costs.</li>
<li class=""><strong>Tailored Performance &amp; Reliability:</strong> By hosting on your own servers, you can optimize network and resources specifically for your users. This ensures a smoother, more reliable experience, especially when combined with smart streaming techniques like Simulcast and Dynacast, which adapt video quality to individual network conditions and pause off-screen video streams to save bandwidth, as explained in our article on <a class="" href="https://www.plugnmeet.org/es/blog/smart-video-streaming">smart video streaming</a>.</li>
<li class=""><strong>Deep Customization &amp; Integration:</strong> Beyond just branding, self-hosting allows for profound customization. You can integrate video conferencing directly into your existing applications and workflows, using powerful APIs to define feature sets for each room, embed web content, and even connect with traditional telephony via <a class="" href="https://www.plugnmeet.org/es/blog/sip-dial-in-for-video-conferencing">SIP Dial-In</a> for participants without internet access.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="plugnmeet-your-foundation-for-open-source-self-hosted-excellence">plugNmeet: Your Foundation for Open Source, Self-Hosted Excellence<a href="https://www.plugnmeet.org/es/blog/self-hosted-open-source-webinar-software#plugnmeet-your-foundation-for-open-source-self-hosted-excellence" class="hash-link" aria-label="Enlace directo al plugNmeet: Your Foundation for Open Source, Self-Hosted Excellence" title="Enlace directo al plugNmeet: Your Foundation for Open Source, Self-Hosted Excellence" translate="no">​</a></h2>
<p>plugNmeet is built from the ground up to deliver on these promises. As an open-source, WebRTC-based platform, it provides the flexible, powerful, and secure foundation you need to build a professional, branded, and automated webinar and meeting experience that is truly your own.</p>
<p>Key features that highlight our commitment to open source and self-hosting include:</p>
<ul>
<li class=""><strong>Adaptive Streaming (Simulcast &amp; Dynacast):</strong> Ensures smooth, uninterrupted calls even on challenging networks by intelligently managing video streams.</li>
<li class=""><strong>RTMP &amp; WHIP Ingress:</strong> Stream like a pro by bringing professional tools like OBS Studio directly into your meeting room, appearing as a participant, as detailed in our guide on <a class="" href="https://www.plugnmeet.org/es/blog/obs-rtmp-whip-ingress">OBS RTMP WHIP Ingress</a>.</li>
<li class=""><strong>SIP Dial-In:</strong> Bridge the gap for participants without internet access, allowing them to join audio via any standard telephone.</li>
<li class=""><strong>AI Meeting Agent:</strong> Enhance productivity with live spoken translations, automated summaries, and full transcriptions.</li>
<li class=""><strong>End-to-End Encryption (E2EE):</strong> For the <a class="" href="https://www.plugnmeet.org/es/docs/security-overview">highest level of privacy</a>, ensuring your conversations remain completely confidential.</li>
<li class=""><strong>Comprehensive APIs &amp; SDKs:</strong> For developers to build custom solutions and integrate deeply with existing systems.</li>
<li class=""><strong>CMS Plugins:</strong> Ready-to-use plugins for WordPress, Joomla, and Moodle for easy integration without coding. For example, you can <a class="" href="https://www.plugnmeet.org/es/blog/no-code-video-conferencing-service-with-wordpress">start your Webinar meeting with WordPress</a> in minutes.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="take-control-of-your-communication-future">Take Control of Your Communication Future<a href="https://www.plugnmeet.org/es/blog/self-hosted-open-source-webinar-software#take-control-of-your-communication-future" class="hash-link" aria-label="Enlace directo al Take Control of Your Communication Future" title="Enlace directo al Take Control of Your Communication Future" translate="no">​</a></h2>
<p>In a world where digital interactions are paramount, settling for generic, proprietary solutions means sacrificing control, privacy, and the ability to truly brand and tailor your user experience.</p>
<p>Choose an <strong>open source webinar software</strong> and <strong>self-hosted meeting</strong> platform like plugNmeet to empower your organization with a secure, scalable, and fully customized video conferencing solution. Reclaim ownership of your communication and deliver an unparalleled experience to your users.</p>
<hr>
<p><strong>Ready to build your perfect webinar and meeting platform?</strong></p>
<ul>
<li class=""><strong>Explore our <a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Live Demo</a> to see the features in action.</strong></li>
<li class=""><strong>Visit our <a href="https://github.com/mynaparrot/plugNmeet-server" target="_blank" rel="noopener noreferrer" class="">GitHub Repository</a> to get started with self-hosting.</strong></li>
<li class=""><strong>Dive into our <a class="" href="https://www.plugnmeet.org/es/docs/api/intro">API Documentation</a> to begin building your custom solution.</strong></li>
</ul>]]></content:encoded>
            <category>webinar</category>
            <category>open-source</category>
            <category>self-hosted</category>
            <category>video-conferencing</category>
            <category>platform</category>
            <category>privacy</category>
            <category>customization</category>
            <category>control</category>
            <category>scalability</category>
            <category>events</category>
        </item>
        <item>
            <title><![CDATA[Why Self-Hosted, Customizable Video Conferencing with plugNmeet Outperforms Proprietary Solutions]]></title>
            <link>https://www.plugnmeet.org/es/blog/self-hosted-customizable-video-conferencing</link>
            <guid>https://www.plugnmeet.org/es/blog/self-hosted-customizable-video-conferencing</guid>
            <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In today's interconnected world, video conferencing has become indispensable. But as businesses, educators, and healthcare professionals rely more heavily on these tools, a critical question arises: who truly controls your communication? Proprietary solutions often come with hidden costs, limited flexibility, and significant privacy concerns.]]></description>
            <content:encoded><![CDATA[<p>In today's interconnected world, video conferencing has become indispensable. But as businesses, educators, and healthcare professionals rely more heavily on these tools, a critical question arises: <strong>who truly controls your communication?</strong> Proprietary solutions often come with hidden costs, limited flexibility, and significant privacy concerns.</p>
<p>Enter plugNmeet: an open-source, self-hosted WebRTC platform designed to give you ultimate control, unparalleled customization, and robust security, fundamentally outperforming generic, off-the-shelf alternatives.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="the-power-of-self-hosting-unmatched-control--privacy">The Power of Self-Hosting: Unmatched Control &amp; Privacy<a href="https://www.plugnmeet.org/es/blog/self-hosted-customizable-video-conferencing#the-power-of-self-hosting-unmatched-control--privacy" class="hash-link" aria-label="Enlace directo al The Power of Self-Hosting: Unmatched Control &amp; Privacy" title="Enlace directo al The Power of Self-Hosting: Unmatched Control &amp; Privacy" translate="no">​</a></h2>
<p>When you choose a proprietary video conferencing service, your data resides on their servers, subject to their policies, security practices, and potential data mining. Self-hosting with plugNmeet flips this script, putting you firmly in command.</p>
<ul>
<li class=""><strong>Data Ownership &amp; Privacy:</strong> Your conversations, recordings, and user data remain entirely within your infrastructure. This is crucial for compliance with regulations like HIPAA, GDPR, and other industry-specific privacy standards. With plugNmeet, you own your data, ensuring maximum privacy and peace of mind. For a deeper dive into our security architecture, refer to our <a class="" href="https://www.plugnmeet.org/es/docs/security-overview">Security Overview</a>.</li>
<li class=""><strong>Cost-Effectiveness at Scale:</strong> Proprietary solutions often charge per-user or per-minute, leading to escalating costs as your needs grow. Self-hosting offers predictable infrastructure costs, making it a significantly more cost-effective solution for long-term, large-scale deployments.</li>
<li class=""><strong>Reliability &amp; Performance:</strong> By hosting on your own servers, you can optimize your network and resources specifically for your users, ensuring a smoother, more reliable experience tailored to your audience's geographical location and bandwidth.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="beyond-branding-true-customization-for-your-unique-needs">Beyond Branding: True Customization for Your Unique Needs<a href="https://www.plugnmeet.org/es/blog/self-hosted-customizable-video-conferencing#beyond-branding-true-customization-for-your-unique-needs" class="hash-link" aria-label="Enlace directo al Beyond Branding: True Customization for Your Unique Needs" title="Enlace directo al Beyond Branding: True Customization for Your Unique Needs" translate="no">​</a></h2>
<p>Many "white-label" solutions merely allow you to swap a logo. plugNmeet offers a level of customization that transforms the platform into an integral part of your ecosystem, not just an embedded tool.</p>
<ul>
<li class=""><strong>Pixel-Perfect Branding:</strong> From custom URLs and logos to colors and layouts, plugNmeet allows you to tailor every visual aspect to match your brand identity seamlessly. For more on this, see our post on <a class="" href="https://www.plugnmeet.org/es/blog/true-white-label-video-conferencing">True White-Label Video Conferencing</a>. Our <code>getClientFiles</code> API even allows you to inject the client directly into your application for a truly native feel, as detailed in our <a class="" href="https://www.plugnmeet.org/es/docs/developer-guide/design-customisation">Design Customization Guide</a> and <a class="" href="https://www.plugnmeet.org/es/docs/api/get-client-files">getClientFiles API Documentation</a>.</li>
<li class=""><strong>Feature Control via API:</strong> Our powerful server-side API lets you define the exact feature set for each room. Need a minimalist one-to-one chat? Disable the whiteboard and polls. Building a virtual classroom? Enable breakout rooms, shared notepads, and advanced moderation tools. This granular control ensures your users only see what's relevant, creating a streamlined and focused experience.</li>
<li class=""><strong>Tailored Workflows:</strong> Whether you're building a telehealth platform, an online learning environment, or a secure corporate communication hub, plugNmeet's flexibility allows you to integrate video conferencing directly into your existing workflows and applications.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="feature-spotlight-what-makes-plugnmeet-stand-out">Feature Spotlight: What Makes plugNmeet Stand Out<a href="https://www.plugnmeet.org/es/blog/self-hosted-customizable-video-conferencing#feature-spotlight-what-makes-plugnmeet-stand-out" class="hash-link" aria-label="Enlace directo al Feature Spotlight: What Makes plugNmeet Stand Out" title="Enlace directo al Feature Spotlight: What Makes plugNmeet Stand Out" translate="no">​</a></h2>
<p>While control and customization are paramount, plugNmeet also boasts a rich set of features that rival, and often surpass, proprietary offerings.</p>
<ul>
<li class=""><strong>AI Meeting Agent:</strong> Transform your meetings into actionable insights with live spoken translations, automated summaries, and full transcriptions. This intelligent agent enhances productivity and accessibility. Learn more about <a class="" href="https://www.plugnmeet.org/es/blog/how-to-add-ai-meeting-assistant-features">How to Add AI Features</a>.</li>
<li class=""><strong>End-to-End Encryption (E2EE):</strong> Beyond standard WebRTC security, plugNmeet adds an additional layer of true E2EE, ensuring that even the server cannot access the content of your private conversations. This is privacy by design. Explore our <a class="" href="https://www.plugnmeet.org/es/blog/e2ee-key-models-guide">E2EE Key Models Guide</a> and <a class="" href="https://www.plugnmeet.org/es/blog/how-to-enable-end-to-end-encryption">How to Enable End-to-End Encryption</a>.</li>
<li class=""><strong>Advanced Collaboration Tools:</strong> Boost productivity with interactive whiteboards, collaborative notepads, screen sharing, and breakout rooms for focused group discussions.</li>
<li class=""><strong>Scalability &amp; Performance:</strong> Built with modern technologies like Go, LiveKit, and NATS, plugNmeet is engineered for horizontal scaling, supporting hundreds of participants with optimal performance, even on challenging networks thanks to adaptive streaming. Discover how our <a class="" href="https://www.plugnmeet.org/es/blog/scaling-architecture-saves-money">Scaling Architecture Saves Money</a> and dive into our <a class="" href="https://www.plugnmeet.org/es/blog/backend-architecture-deep-dive">Backend Architecture Deep Dive</a>.</li>
<li class=""><strong>Recording &amp; Broadcasting:</strong> Capture sessions in HD as portable MP4 files to your own server, or stream live to platforms like YouTube and Facebook using built-in RTMP/WHIP support. You own your content, always. Read our <a class="" href="https://www.plugnmeet.org/es/blog/guide-to-managing-meeting-recordings">Guide to Managing Meeting Recordings</a> and learn about <a class="" href="https://www.plugnmeet.org/es/blog/smart-scaling-ha-recorder">Smart Scaling HA Recorder</a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="seamless-integration--migration">Seamless Integration &amp; Migration<a href="https://www.plugnmeet.org/es/blog/self-hosted-customizable-video-conferencing#seamless-integration--migration" class="hash-link" aria-label="Enlace directo al Seamless Integration &amp; Migration" title="Enlace directo al Seamless Integration &amp; Migration" translate="no">​</a></h2>
<p>Worried about switching from an existing platform? plugNmeet makes it easy.</p>
<ul>
<li class=""><strong>Easy Migration:</strong> For users looking to move away from platforms like BigBlueButton, plugNmeet offers a modern, performant, and highly customizable alternative. Our architecture simplifies the transition, allowing you to leverage your existing knowledge while gaining superior control and features. See our guide on <a class="" href="https://www.plugnmeet.org/es/docs/tutorials/migration-from-bbb">Migration from BigBlueButton</a>.</li>
<li class=""><strong>CMS Plugins:</strong> Integrate plugNmeet effortlessly into popular content management systems like WordPress, Joomla, and Moodle with our official plugins, requiring no coding. Find out more in our guides for <a class="" href="https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide">WordPress Video Conferencing</a>, <a class="" href="https://www.plugnmeet.org/es/blog/joomla-video-conferencing-guide">Joomla Video Conferencing</a>, and <a class="" href="https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide">Moodle Video Conferencing</a>.</li>
<li class=""><strong>Developer-Friendly SDKs:</strong> For custom applications, our comprehensive <a class="" href="https://www.plugnmeet.org/es/docs/api/intro">API Documentation</a> and SDKs (PHP, JavaScript, Python) provide the tools developers need for deep integration.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_eV_2" id="conclusion-choose-control-choose-customization-choose-plugnmeet">Conclusion: Choose Control, Choose Customization, Choose plugNmeet<a href="https://www.plugnmeet.org/es/blog/self-hosted-customizable-video-conferencing#conclusion-choose-control-choose-customization-choose-plugnmeet" class="hash-link" aria-label="Enlace directo al Conclusion: Choose Control, Choose Customization, Choose plugNmeet" title="Enlace directo al Conclusion: Choose Control, Choose Customization, Choose plugNmeet" translate="no">​</a></h2>
<p>In a world increasingly reliant on digital communication, settling for generic, proprietary video conferencing solutions means sacrificing control, privacy, and the ability to truly brand and tailor your user experience.</p>
<p>plugNmeet offers a powerful, open-source alternative that empowers you to build a secure, scalable, and fully customized video conferencing platform that is truly your own. Reclaim ownership of your communication and deliver an unparalleled experience to your users.</p>
<p><strong>Ready to take control of your video conferencing?</strong></p>
<ul>
<li class=""><strong>Explore our <a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Live Demo</a> to see the features in action.</strong></li>
<li class=""><strong>Visit our <a href="https://github.com/mynaparrot/plugNmeet-server" target="_blank" rel="noopener noreferrer" class="">GitHub Repository</a> to get started with self-hosting.</strong></li>
<li class=""><strong>Dive into our <a class="" href="https://www.plugnmeet.org/es/docs/api/intro">API Documentation</a> to begin building your custom solution.</strong></li>
</ul>]]></content:encoded>
            <category>self-hosted</category>
            <category>open-source</category>
            <category>customization</category>
            <category>white-label</category>
            <category>security</category>
            <category>webrtc</category>
            <category>zoom-alternative</category>
            <category>video-conferencing</category>
            <category>platform</category>
        </item>
        <item>
            <title><![CDATA[How to Reduce Video Conferencing Costs by up to 80% with Open-Source Software]]></title>
            <link>https://www.plugnmeet.org/es/blog/how-to-reduce-video-conferencing-costs-with-open-source</link>
            <guid>https://www.plugnmeet.org/es/blog/how-to-reduce-video-conferencing-costs-with-open-source</guid>
            <pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Your organization relies on video conferencing. It's essential for team meetings, sales demos, and customer support. But as your company grows, your monthly bill from services like Zoom, Google Meet, or Microsoft Teams is growing with it. That predictable per-user, per-month fee is starting to look less like a convenience and more like a major operational expense.]]></description>
            <content:encoded><![CDATA[<p>Your organization relies on video conferencing. It's essential for team meetings, sales demos, and customer support. But as your company grows, your monthly bill from services like Zoom, Google Meet, or Microsoft Teams is growing with it. That predictable per-user, per-month fee is starting to look less like a convenience and more like a major operational expense.</p>
<p>What if you could cut that bill by up to 80% while gaining more control and better branding?</p>
<p>It's not a fantasy. By switching from a proprietary SaaS "rental" model to a self-hosted "ownership" model with an open-source platform like <strong>Plug-N-Meet</strong>, you can dramatically reduce your Total Cost of Ownership (TCO). This article will break down the numbers and show you how.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="the-saas-rental-model-a-penalty-on-growth">The SaaS "Rental" Model: A Penalty on Growth<a href="https://www.plugnmeet.org/es/blog/how-to-reduce-video-conferencing-costs-with-open-source#the-saas-rental-model-a-penalty-on-growth" class="hash-link" aria-label="Enlace directo al The SaaS &quot;Rental&quot; Model: A Penalty on Growth" title="Enlace directo al The SaaS &quot;Rental&quot; Model: A Penalty on Growth" translate="no">​</a></h3>
<p>The pricing model for most SaaS video platforms is simple and seductive: a flat fee per host, per month. It's easy to budget for when you have 10 employees. But what happens when you have 100?</p>
<p>Let's look at a common scenario.</p>
<p><strong>Scenario: A Company with 50 Hosts</strong></p>
<ul>
<li class=""><strong>SaaS Provider Cost (e.g., Zoom Pro):</strong>
<ul>
<li class="">Price per host: ~$15.99 / month</li>
<li class="">Total monthly cost: 50 hosts * $15.99 = <strong>$799.50 / month</strong></li>
<li class="">Total annual cost: <strong>$9,594 / year</strong></li>
</ul>
</li>
</ul>
<p>This is a significant, recurring operational expense (OpEx). And it gets worse. This model penalizes you for success. If your company grows to 100 hosts, your bill doubles to nearly <strong>$20,000 per year</strong>. You are paying more for the exact same service, simply because your team is bigger.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="the-self-hosted-ownership-model-predictable-and-scalable">The Self-Hosted "Ownership" Model: Predictable and Scalable<a href="https://www.plugnmeet.org/es/blog/how-to-reduce-video-conferencing-costs-with-open-source#the-self-hosted-ownership-model-predictable-and-scalable" class="hash-link" aria-label="Enlace directo al The Self-Hosted &quot;Ownership&quot; Model: Predictable and Scalable" title="Enlace directo al The Self-Hosted &quot;Ownership&quot; Model: Predictable and Scalable" translate="no">​</a></h3>
<p>Now, let's compare this to a self-hosted model using the open-source Plug-N-Meet platform. With this model, you don't pay any license fees. Your only significant cost is the server hardware you run the software on.</p>
<p><strong>Scenario: The Same Company with 50 Hosts (or 100, or 200)</strong></p>
<ul>
<li class=""><strong>Self-Hosted Infrastructure Cost (e.g., Hetzner Cloud Server):</strong>
<ul>
<li class="">Recommended server: A powerful cloud instance like the Hetzner CCX33 (8 vCPUs, 32 GB RAM).</li>
<li class="">Total monthly cost: <strong>~€55 / month (approx. $60 / month)</strong></li>
<li class="">Total annual cost: <strong>~$720 / year</strong></li>
</ul>
</li>
</ul>
<p>Let's compare the annual costs:</p>
<ul>
<li class=""><strong>SaaS Model:</strong> <strong>$9,594</strong></li>
<li class=""><strong>Self-Hosted Model:</strong> <strong>$720</strong></li>
</ul>
<p>That's a cost reduction of <strong>over 92%</strong>.</p>
<p>Even if you choose a more expensive cloud provider or a larger server for higher capacity, the savings are dramatic. A comparable server on DigitalOcean or AWS might cost $150-$250 per month, which still represents a <strong>cost saving of over 80%</strong> compared to the SaaS alternative.</p>
<p>The best part? This cost is <strong>fixed</strong>. If your company grows from 50 to 100 hosts, your server cost doesn't change. You can accommodate more users for the same price, rewarding your growth instead of penalizing it.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="but-what-about-hidden-costs">But What About "Hidden" Costs?<a href="https://www.plugnmeet.org/es/blog/how-to-reduce-video-conferencing-costs-with-open-source#but-what-about-hidden-costs" class="hash-link" aria-label="Enlace directo al But What About &quot;Hidden&quot; Costs?" title="Enlace directo al But What About &quot;Hidden&quot; Costs?" translate="no">​</a></h3>
<p>Skeptics of self-hosting often point to hidden costs like maintenance and setup. Let's address those directly.</p>
<ul>
<li class=""><strong>Setup Complexity:</strong> This used to be a valid concern. Today, with automated tools, it's largely a solved problem. Plug-N-Meet provides a <strong><a class="" href="https://www.plugnmeet.org/es/docs/installation">one-line installation script</a></strong> that sets up a production-ready server in about 15 minutes. You don't need to be a systems administration expert.</li>
<li class=""><strong>Maintenance:</strong> The server requires minimal maintenance. Running a software update is as simple as executing another one-line script. For most organizations, this amounts to less than an hour of work per month.</li>
<li class=""><strong>Reliability:</strong> Modern cloud providers offer extremely high uptime (often 99.99%). Your self-hosted solution, running on reliable infrastructure, is just as dependable as a SaaS service, with the added benefit that you aren't affected by their widespread outages.</li>
</ul>
<p>When you weigh a few hours of optional maintenance per year against a potential saving of thousands of dollars, the financial case becomes overwhelmingly clear.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="conclusion-stop-renting-start-owning">Conclusion: Stop Renting, Start Owning<a href="https://www.plugnmeet.org/es/blog/how-to-reduce-video-conferencing-costs-with-open-source#conclusion-stop-renting-start-owning" class="hash-link" aria-label="Enlace directo al Conclusion: Stop Renting, Start Owning" title="Enlace directo al Conclusion: Stop Renting, Start Owning" translate="no">​</a></h3>
<p>The per-user, per-month SaaS model is a brilliant business strategy—for the provider. For the customer, it's a treadmill of escalating costs that actively works against your growth.</p>
<p>By switching to a self-hosted, open-source platform like Plug-N-Meet, you move from being a tenant to an owner. You gain a predictable, low-cost infrastructure that scales with your success. You also get the invaluable strategic benefits of full brand control, deeper integration, and absolute data privacy.</p>
<p>If your organization is feeling the pain of rising SaaS subscription costs, it's time to run the numbers. The move to self-hosting isn't just a technical decision; it's one of the smartest financial decisions you can make.</p>
<hr>
<p><strong>Ready to slash your video conferencing costs?</strong></p>
<ul>
<li class=""><strong>See our detailed <a class="" href="https://www.plugnmeet.org/es/blog/scaling-architecture-saves-money">Server Recommendations</a>.</strong></li>
<li class=""><strong>Follow our simple <a class="" href="https://www.plugnmeet.org/es/docs/installation">Installation Guide</a> to get started.</strong></li>
<li class=""><strong>Read more about the <a class="" href="https://www.plugnmeet.org/es/blog/own-vs-rent-video-platform">Business Case for Self-Hosting</a>.</strong></li>
</ul>]]></content:encoded>
            <category>business</category>
            <category>cost-saving</category>
            <category>tco</category>
            <category>open-source</category>
            <category>saas-alternative</category>
            <category>pricing</category>
            <category>self-hosting</category>
        </item>
        <item>
            <title><![CDATA[How to Secure Your Online Classroom: A Teacher's Guide to Privacy and Safety]]></title>
            <link>https://www.plugnmeet.org/es/blog/how-to-secure-your-online-classroom-for-teachers</link>
            <guid>https://www.plugnmeet.org/es/blog/how-to-secure-your-online-classroom-for-teachers</guid>
            <pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[As an educator, your primary goal is to create a safe, respectful, and effective learning environment. In a physical classroom, you have established routines for this: you close the door to prevent interruptions, you set rules for speaking, and you manage the flow of the conversation.]]></description>
            <content:encoded><![CDATA[<p>As an educator, your primary goal is to create a safe, respectful, and effective learning environment. In a physical classroom, you have established routines for this: you close the door to prevent interruptions, you set rules for speaking, and you manage the flow of the conversation.</p>
<p>But how do you replicate this in a virtual classroom? An unsecured online meeting can quickly devolve into chaos, with uninvited guests, background noise, and constant interruptions.</p>
<p>This guide will walk you through the simple but powerful tools available in Plug-N-Meet that allow you to take control of your digital classroom. Think of these features as your new classroom management toolkit, designed to ensure your online sessions are as safe, private, and productive as your in-person ones.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="1-lock-the-door-the-waiting-room">1. Lock the Door: The Waiting Room<a href="https://www.plugnmeet.org/es/blog/how-to-secure-your-online-classroom-for-teachers#1-lock-the-door-the-waiting-room" class="hash-link" aria-label="Enlace directo al 1. Lock the Door: The Waiting Room" title="Enlace directo al 1. Lock the Door: The Waiting Room" translate="no">​</a></h3>
<p>You wouldn't let just anyone walk into your classroom off the street. The same principle should apply online. The <strong>Waiting Room</strong> is your digital lobby, giving you complete control over who enters your session.</p>
<ul>
<li class=""><strong>How it Works:</strong> When you enable the Waiting Room for your class, any student who clicks the join link is placed on a "waiting" screen. You, the teacher, will see a notification and a list of everyone waiting to get in. You can then admit them one by one or all at once.</li>
<li class=""><strong>Why it's Essential:</strong>
<ul>
<li class=""><strong>Prevents "Zoombombing":</strong> This is the single most effective way to stop uninvited guests from disrupting your class. If you don't recognize a name, you don't have to let them in.</li>
<li class=""><strong>Control the Start Time:</strong> It allows you to prepare your lesson materials and admit all students at the same time, ensuring everyone starts on the same page.</li>
</ul>
</li>
</ul>
<p><strong>How to Enable it:</strong> You can enable the Waiting Room in your room settings when you create the class in your LMS (like <strong><a class="" href="https://www.plugnmeet.org/es/blog/no-code-video-conferencing-moodle">Moodle</a></strong>) or via the API.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="2-set-the-rules-granular-lock-settings">2. Set the Rules: Granular Lock Settings<a href="https://www.plugnmeet.org/es/blog/how-to-secure-your-online-classroom-for-teachers#2-set-the-rules-granular-lock-settings" class="hash-link" aria-label="Enlace directo al 2. Set the Rules: Granular Lock Settings" title="Enlace directo al 2. Set the Rules: Granular Lock Settings" translate="no">​</a></h3>
<p>Once your students are in the room, you need to set the ground rules for participation. Plug-N-Meet's <strong><a class="" href="https://www.plugnmeet.org/es/blog/moderator-guide-room-lock-settings">Room Lock Settings</a></strong> panel is your command center for this.</p>
<ul>
<li class=""><strong>Lock Microphones (Your Most-Used Tool):</strong> This is the equivalent of asking the class to be quiet while you're speaking. It mutes all participants and prevents them from unmuting themselves. This is essential for lectures, presentations, or when a specific student is speaking.</li>
<li class=""><strong>Lock Webcams:</strong> In large classes, having dozens of webcams active can be distracting and consume a lot of bandwidth. Locking webcams helps focus attention on the speaker or the shared content.</li>
<li class=""><strong>Lock Public Chat:</strong> While chat is a great tool, it can sometimes become a source of distraction. You can temporarily lock the chat to bring focus back to the lesson, and then unlock it for a dedicated Q&amp;A session.</li>
<li class=""><strong>Lock Screen Sharing:</strong> Keep this locked by default to prevent students from accidentally taking over the presentation. You can unlock it when you want a student to share their work.</li>
</ul>
<p><strong>Pro Tip:</strong> Use these settings dynamically. Start your class with everything unlocked for a few minutes of social time, then lock microphones and chat when the formal lesson begins.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="3-the-gold-standard-of-privacy-end-to-end-encryption-e2ee">3. The Gold Standard of Privacy: End-to-End Encryption (E2EE)<a href="https://www.plugnmeet.org/es/blog/how-to-secure-your-online-classroom-for-teachers#3-the-gold-standard-of-privacy-end-to-end-encryption-e2ee" class="hash-link" aria-label="Enlace directo al 3. The Gold Standard of Privacy: End-to-End Encryption (E2EE)" title="Enlace directo al 3. The Gold Standard of Privacy: End-to-End Encryption (E2EE)" translate="no">​</a></h3>
<p>For sensitive conversations, such as a one-on-one meeting with a student or a parent, you may need the highest possible level of privacy. <strong>End-to-End Encryption (E2EE)</strong> provides a mathematical guarantee that no one—not even the server administrator—can access the audio or video of your conversation.</p>
<ul>
<li class=""><strong>How it Works:</strong> When E2EE is enabled, the video and audio are encrypted on your device and only decrypted on the recipient's device.</li>
<li class=""><strong>When to Use It:</strong> This is ideal for any situation requiring absolute confidentiality, such as discussions about grades, student well-being, or any other private matter.</li>
</ul>
<p><strong>How to Enable it:</strong> E2EE can be enabled on a per-room basis. Our guide on <strong><a class="" href="https://www.plugnmeet.org/es/blog/how-to-enable-end-to-end-encryption">How to Enable E2EE</a></strong> explains the simple steps. It's important to note that when you enable the highest level of E2EE, features that require the server to "see" the media, like cloud recording, are automatically disabled for your protection.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="conclusion-you-are-in-control">Conclusion: You Are in Control<a href="https://www.plugnmeet.org/es/blog/how-to-secure-your-online-classroom-for-teachers#conclusion-you-are-in-control" class="hash-link" aria-label="Enlace directo al Conclusion: You Are in Control" title="Enlace directo al Conclusion: You Are in Control" translate="no">​</a></h3>
<p>A secure and productive online classroom doesn't happen by accident. It happens by design. By using these simple but powerful features, you can move from being a passive host to an active and effective classroom manager.</p>
<p>Start with the Waiting Room to control who enters, use the Lock Settings to manage the flow of conversation, and deploy E2EE for sensitive discussions. With these tools at your fingertips, you can create a virtual learning environment that is just as safe, private, and conducive to learning as your physical classroom.</p>
<hr>
<p><strong>Ready to take control of your virtual classroom?</strong></p>
<ul>
<li class=""><strong>Try these moderator features in our <a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Live Demo</a>.</strong></li>
<li class=""><strong>Read our full <a class="" href="https://www.plugnmeet.org/es/docs/user-guide/moderator">Moderator Guide</a> for more tips.</strong></li>
<li class=""><strong>Learn more about our commitment to <a class="" href="https://www.plugnmeet.org/es/blog/privacy-by-design-zero-trust">Privacy by Design</a>.</strong></li>
</ul>]]></content:encoded>
            <category>tutorial</category>
            <category>how-to</category>
            <category>security</category>
            <category>privacy</category>
            <category>education</category>
            <category>teacher</category>
            <category>moderator</category>
            <category>virtual-classroom</category>
        </item>
        <item>
            <title><![CDATA[Por qué su empresa necesita una solución de videoconferencia con marca blanca]]></title>
            <link>https://www.plugnmeet.org/es/blog/why-your-business-needs-a-white-labeled-video-conferencing-solution</link>
            <guid>https://www.plugnmeet.org/es/blog/why-your-business-needs-a-white-labeled-video-conferencing-solution</guid>
            <pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Su marca es su activo más valioso. Ha invertido mucho tiempo y recursos en crear una identidad única, ofrecer una experiencia memorable a sus clientes y generar confianza con su audiencia.]]></description>
            <content:encoded><![CDATA[<p>Su marca es su activo más valioso. Ha invertido mucho tiempo y recursos en crear una identidad única, ofrecer una experiencia memorable a sus clientes y generar confianza con su audiencia.</p>
<p>Entonces, ¿por qué, justo en el momento más importante de la interacción —una demostración de ventas, una llamada de soporte al cliente o una sesión de capacitación—, envía a sus clientes a una plataforma de terceros con la marca de otra empresa?</p>
<p>Usar una herramienta de videoconferencia genérica y prefabricada es como un restaurante con estrellas Michelin que sirve su comida en una caja de McDonald's. Rompe la experiencia, erosiona el valor de la marca y pierde una gran oportunidad. Por eso, las empresas con visión de futuro se están alejando de las herramientas SaaS genéricas y adoptando <strong>soluciones de videoconferencia de marca blanca</strong> como Plug-N-Meet.</p>
<p>Una plataforma de marca blanca no se trata solo de cambiar el logotipo. Se trata de tener el control de toda la experiencia del cliente y transformar una simple utilidad en un activo estratégico que impulse su negocio.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="1-construye-confianza-en-la-marca-y-profesionalismo">1. Construye confianza en la marca y profesionalismo<a href="https://www.plugnmeet.org/es/blog/why-your-business-needs-a-white-labeled-video-conferencing-solution#1-construye-confianza-en-la-marca-y-profesionalismo" class="hash-link" aria-label="Enlace directo al 1. Construye confianza en la marca y profesionalismo" title="Enlace directo al 1. Construye confianza en la marca y profesionalismo" translate="no">​</a></h3>
<p>Imagine que un nuevo cliente le está pagando por una consulta premium. Le envía un enlace de reunión. ¿Cuál de estos inspira más confianza?</p>
<ul>
<li class=""><code>tu-empresa.zoom.us</code></li>
<li class=""><code>reunion.tu-empresa.com</code></li>
</ul>
<p>La respuesta es obvia. Cuando toda la experiencia —desde la URL hasta el logotipo en la esquina y los colores de la marca de la interfaz— es suya, envía un mensaje poderoso: es profesional, está establecido y ha invertido en su propia plataforma. Elimina la sensación discordante de ser entregado a otra empresa y mantiene el enfoque completamente en su marca.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="2-crea-una-experiencia-de-cliente-fluida-y-sin-fricciones">2. Crea una experiencia de cliente fluida y sin fricciones<a href="https://www.plugnmeet.org/es/blog/why-your-business-needs-a-white-labeled-video-conferencing-solution#2-crea-una-experiencia-de-cliente-fluida-y-sin-fricciones" class="hash-link" aria-label="Enlace directo al 2. Crea una experiencia de cliente fluida y sin fricciones" title="Enlace directo al 2. Crea una experiencia de cliente fluida y sin fricciones" translate="no">​</a></h3>
<p>Una solución de marca blanca, especialmente cuando permite una integración profunda, elimina los "cambios de contexto" propios de las herramientas genéricas. En lugar de llevar al usuario a otra app o pestaña con un diseño completamente diferente, la experiencia de videoconferencia se integra de forma natural con su propia plataforma.</p>
<p>Con una plataforma como Plug-N-Meet, puede usar la <strong><a class="" href="https://www.plugnmeet.org/es/blog/deep-integration-white-label-guide">API <code>getClientFiles</code></a></strong> para integrar el cliente de video directamente en su propia aplicación o portal de clientes. Esto significa que puede:</p>
<ul>
<li class="">Colocar la videollamada junto a los datos relevantes del cliente para sus agentes de soporte.</li>
<li class="">Permitir a los usuarios unirse a un webinar directamente desde la página de su comunidad sin salir de su sitio.</li>
<li class="">Crear una experiencia de "panel único" donde el video es solo un componente integrado de un flujo de trabajo más grande.</li>
</ul>
<p>Esta fluidez reduce la fricción, mejora la usabilidad y mantiene a su usuario comprometido dentro de su ecosistema.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="3-usted-controla-el-conjunto-de-características-y-el-recorrido-del-usuario">3. Usted controla el conjunto de características y el recorrido del usuario<a href="https://www.plugnmeet.org/es/blog/why-your-business-needs-a-white-labeled-video-conferencing-solution#3-usted-controla-el-conjunto-de-caracter%C3%ADsticas-y-el-recorrido-del-usuario" class="hash-link" aria-label="Enlace directo al 3. Usted controla el conjunto de características y el recorrido del usuario" title="Enlace directo al 3. Usted controla el conjunto de características y el recorrido del usuario" translate="no">​</a></h3>
<p>No todas las conversaciones son iguales. Una llamada de ventas individual tiene necesidades muy diferentes a las de un webinar de capacitación para 100 personas.</p>
<p>Las plataformas genéricas ofrecen la misma configuración básica para todos. Con una opción de marca blanca basada en API, realmente puede personalizar todo para que funcione exactamente como lo necesite.</p>
<ul>
<li class=""><strong>Para una llamada de soporte simple:</strong> Puede deshabilitar todas las funciones excepto video, audio y chat para crear una interfaz limpia y minimalista.</li>
<li class=""><strong>Para un taller interactivo:</strong> Puede habilitar la pizarra, las salas de grupos pequeños y las encuestas para fomentar la colaboración.</li>
<li class=""><strong>Para una presentación formal:</strong> Puede bloquear todos los controles de los participantes para asegurar que el enfoque permanezca en el orador.</li>
</ul>
<p>Poder diseñar la experiencia del usuario de forma programada le permite crear la herramienta adecuada para cada situación, algo que las plataformas genéricas normalmente no pueden igualar.</p>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="4-convierte-un-centro-de-costos-en-una-posible-fuente-de-ingresos">4. Convierte un centro de costos en una posible fuente de ingresos<a href="https://www.plugnmeet.org/es/blog/why-your-business-needs-a-white-labeled-video-conferencing-solution#4-convierte-un-centro-de-costos-en-una-posible-fuente-de-ingresos" class="hash-link" aria-label="Enlace directo al 4. Convierte un centro de costos en una posible fuente de ingresos" title="Enlace directo al 4. Convierte un centro de costos en una posible fuente de ingresos" translate="no">​</a></h3>
<p>Cuando paga una suscripción por usuario por una herramienta SaaS genérica, la videoconferencia es un centro de costos que crece a medida que su equipo crece.</p>
<p>Cuando es dueño de su plataforma, cambia el modelo. Debido a que una solución autoalojada como Plug-N-Meet no tiene tarifas por usuario, puede ofrecer servicios de videoconferencia a sus propios clientes. Con nuestros plugins oficiales para <strong><a class="" href="https://www.plugnmeet.org/es/blog/no-code-video-conferencing-service-with-wordpress">WordPress</a></strong> y <strong><a class="" href="https://www.plugnmeet.org/es/blog/no-code-video-conferencing-service-with-joomla">Joomla</a></strong>, incluso puede usar extensiones de membresía y comercio electrónico para vender acceso a salas de reuniones premium y personalizadas con su marca, sin necesidad de escribir código.</p>
<p>Usted transforma un gasto mensual en un producto generador de ingresos.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="conclusión-deje-de-hacer-publicidad-para-otras-marcas">Conclusión: Deje de hacer publicidad para otras marcas<a href="https://www.plugnmeet.org/es/blog/why-your-business-needs-a-white-labeled-video-conferencing-solution#conclusi%C3%B3n-deje-de-hacer-publicidad-para-otras-marcas" class="hash-link" aria-label="Enlace directo al Conclusión: Deje de hacer publicidad para otras marcas" title="Enlace directo al Conclusión: Deje de hacer publicidad para otras marcas" translate="no">​</a></h3>
<p>Cada vez que un cliente se une a una reunión en una plataforma genérica, en esencia está promocionando esa plataforma de forma gratuita.</p>
<p>Una solución de videoconferencias con marca blanca coloca su marca en el centro de la experiencia. Genera confianza, ofrece una mejor experiencia al cliente y le brinda la flexibilidad de adaptar la herramienta a las necesidades de su negocio. En un mercado competitivo, tener el control de un punto de contacto tan importante con el cliente no es un lujo, sino una necesidad estratégica.</p>
<hr>
<p><strong>¿Listo para poner su marca en primer plano?</strong></p>
<ul>
<li class=""><strong>Obtenga más información sobre nuestras <a class="" href="https://www.plugnmeet.org/es/blog/deep-integration-white-label-guide">Capacidades de Integración Profunda y Marca Blanca</a>.</strong></li>
<li class=""><strong>Pruebe nuestra <a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Demo en Vivo</a> e imagínala con su propia marca.</strong></li>
<li class=""><strong>Sigua nuestra <a class="" href="https://www.plugnmeet.org/es/docs/installation">Guía de Instalación</a> para empezar a construir su propia plataforma.</strong></li>
</ul>]]></content:encoded>
            <category>negocios</category>
            <category>marca</category>
            <category>marca-blanca</category>
            <category>experiencia-cliente</category>
            <category>marketing</category>
            <category>alternativa-saas</category>
        </item>
        <item>
            <title><![CDATA[La Guía Definitiva para la Videoconferencia en Joomla: Integra Reuniones y Webinars en Vivo]]></title>
            <link>https://www.plugnmeet.org/es/blog/joomla-video-conferencing-guide</link>
            <guid>https://www.plugnmeet.org/es/blog/joomla-video-conferencing-guide</guid>
            <pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Joomla es una potencia para construir sitios web robustos y flexibles, desde portales comunitarios hasta sitios de negocios sofisticados. Pero cuando llega el momento de involucrar a tu audiencia con video en vivo, es posible que te encuentres enviándolos lejos del hermoso sitio que has construido a una herramienta de conferencia genérica de terceros. Esto rompe la experiencia del usuario y socava tu marca.]]></description>
            <content:encoded><![CDATA[<p>Joomla es una potencia para construir sitios web robustos y flexibles, desde portales comunitarios hasta sitios de negocios sofisticados. Pero cuando llega el momento de involucrar a tu audiencia con video en vivo, es posible que te encuentres enviándolos lejos del hermoso sitio que has construido a una herramienta de conferencia genérica de terceros. Esto rompe la experiencia del usuario y socava tu marca.</p>
<p>¿Qué pasaría si pudieras integrar una solución de videoconferencia segura, completamente personalizada y potente directamente en tu sitio Joomla, convirtiéndola en una parte nativa del viaje de tu usuario?</p>
<p>Con el <strong>componente oficial de Plug-N-Meet para Joomla</strong>, puedes hacerlo. Esta guía te mostrará cómo transformar tu sitio web Joomla en una plataforma de comunicación dinámica, perfecta para reuniones comunitarias, webinars, capacitación en línea e incluso servicios monetizados.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="por-qué-una-integración-nativa-de-joomla-supera-a-las-herramientas-externas">Por qué una integración nativa de Joomla supera a las herramientas externas<a href="https://www.plugnmeet.org/es/blog/joomla-video-conferencing-guide#por-qu%C3%A9-una-integraci%C3%B3n-nativa-de-joomla-supera-a-las-herramientas-externas" class="hash-link" aria-label="Enlace directo al Por qué una integración nativa de Joomla supera a las herramientas externas" title="Enlace directo al Por qué una integración nativa de Joomla supera a las herramientas externas" translate="no">​</a></h3>
<p>Antes de entrar en la configuración, seamos claros sobre las ventajas estratégicas de usar una solución autoalojada e integrada como Plug-N-Meet en lugar de una herramienta SaaS externa.</p>
<ol>
<li class=""><strong>Una experiencia de marca profesional y sin interrupciones:</strong> Tus usuarios se unen a las reuniones en tu propio dominio, con tu logotipo y colores de marca. Esto refuerza el profesionalismo y la confianza, manteniendo la experiencia del usuario consistente con el resto de tu sitio.</li>
<li class=""><strong>Control total sobre los datos del usuario:</strong> Todos los datos del usuario y las grabaciones de las reuniones se almacenan en tu propio servidor, no en una nube de terceros. Esto es fundamental para mantener la soberanía de los datos y cumplir con las regulaciones de privacidad como el GDPR.</li>
<li class=""><strong>Escalabilidad rentable:</strong> Escapas de las costosas tarifas de suscripción por usuario y por mes que penalizan el crecimiento. Con un modelo autoalojado, tu costo principal es una tarifa de servidor predecible, lo que te permite atender a más usuarios sin que tu factura se dispare.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="la-guía-de-3-pasos-para-tu-primera-reunión-en-joomla">La guía de 3 pasos para tu primera reunión en Joomla<a href="https://www.plugnmeet.org/es/blog/joomla-video-conferencing-guide#la-gu%C3%ADa-de-3-pasos-para-tu-primera-reuni%C3%B3n-en-joomla" class="hash-link" aria-label="Enlace directo al La guía de 3 pasos para tu primera reunión en Joomla" title="Enlace directo al La guía de 3 pasos para tu primera reunión en Joomla" translate="no">​</a></h3>
<p>Puedes tener una sala de reuniones de video en vivo en tu sitio Joomla en menos de 15 minutos.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="paso-1-obtén-tu-motor-de-videoconferencia">Paso 1: Obtén tu motor de videoconferencia<a href="https://www.plugnmeet.org/es/blog/joomla-video-conferencing-guide#paso-1-obt%C3%A9n-tu-motor-de-videoconferencia" class="hash-link" aria-label="Enlace directo al Paso 1: Obtén tu motor de videoconferencia" title="Enlace directo al Paso 1: Obtén tu motor de videoconferencia" translate="no">​</a></h4>
<p>Primero, necesitas el servidor que impulsará tus videollamadas. Puedes autoalojar la versión de código abierto con nuestro <strong><a class="" href="https://www.plugnmeet.org/es/docs/installation">sencillo script de instalación</a></strong> u obtener un servidor instantáneo y gestionado de <strong><a href="https://www.plugnmeet.cloud/" target="_blank" rel="noopener noreferrer" class="">plugnmeet Cloud</a></strong>. Ambos te proporcionarán una <strong>Clave API</strong> y un <strong>Secreto API</strong>.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="paso-2-instala-el-componente-gratuito-de-plug-n-meet">Paso 2: Instala el componente gratuito de Plug-N-Meet<a href="https://www.plugnmeet.org/es/blog/joomla-video-conferencing-guide#paso-2-instala-el-componente-gratuito-de-plug-n-meet" class="hash-link" aria-label="Enlace directo al Paso 2: Instala el componente gratuito de Plug-N-Meet" title="Enlace directo al Paso 2: Instala el componente gratuito de Plug-N-Meet" translate="no">​</a></h4>
<p>From your Joomla administrator panel:</p>
<ol>
<li class="">Go to <strong>System &gt; Install &gt; Extensions</strong>.</li>
<li class="">Install the Plug-N-Meet component, which you can download from the official <a href="https://extensions.joomla.org/extension/plugnmeet/" target="_blank" rel="noopener noreferrer" class="">Joomla Extensions Directory</a>.</li>
<li class="">After installation, navigate to <strong>System &gt; Global Configuration</strong> and select <strong>plugNmeet</strong> from the components list.</li>
<li class="">Enter your <strong>API Key</strong> and <strong>API Secret</strong> and save the configuration.</li>
</ol>
<p>Tu Joomla site is now fully connected to your video conferencing engine.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="paso-3-crea-y-muestra-tu-sala">Paso 3: Crea y muestra tu sala<a href="https://www.plugnmeet.org/es/blog/joomla-video-conferencing-guide#paso-3-crea-y-muestra-tu-sala" class="hash-link" aria-label="Enlace directo al Paso 3: Crea y muestra tu sala" title="Enlace directo al Paso 3: Crea y muestra tu sala" translate="no">​</a></h4>
<ol>
<li class="">Go to <strong>Components &gt; Plug N Meet &gt; Manage Rooms</strong> and click <strong>+ New</strong>.</li>
<li class="">Configure your room's features, such as its name, participant limits, and a welcome message.</li>
<li class="">To display the room, go to <strong>Menus &gt; Main Menu</strong> and click <strong>+ Add New Menu Item</strong>.</li>
<li class="">For the <strong>Menu Item Type</strong>, select <strong>Plug N Meet &gt; Single room</strong>.</li>
<li class="">In the <strong>Select a room</strong> dropdown, choose the room you just created and save the menu item.</li>
</ol>
<p>That's it. A new link will appear on your site's main menu, leading directly to your fully functional, branded video conferencing room.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="sube-de-nivel-3-formas-potentes-de-usar-el-video-en-tu-sitio-joomla">Sube de nivel: 3 formas potentes de usar el video en tu sitio Joomla<a href="https://www.plugnmeet.org/es/blog/joomla-video-conferencing-guide#sube-de-nivel-3-formas-potentes-de-usar-el-video-en-tu-sitio-joomla" class="hash-link" aria-label="Enlace directo al Sube de nivel: 3 formas potentes de usar el video en tu sitio Joomla" title="Enlace directo al Sube de nivel: 3 formas potentes de usar el video en tu sitio Joomla" translate="no">​</a></h3>
<p>With the basics in place, you can now leverage Plug-N-Meet to build sophisticated video-based services.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="caso-de-uso-1-el-portal-privado-para-clientes">Caso de uso 1: El portal privado para clientes<a href="https://www.plugnmeet.org/es/blog/joomla-video-conferencing-guide#caso-de-uso-1-el-portal-privado-para-clientes" class="hash-link" aria-label="Enlace directo al Caso de uso 1: El portal privado para clientes" title="Enlace directo al Caso de uso 1: El portal privado para clientes" translate="no">​</a></h4>
<p>If you're a consultant, coach, or provide any one-on-one service, you can create private, secure meeting rooms for your clients.</p>
<ul>
<li class=""><strong>Cómo hacerlo:</strong> Use Joomla's built-in Access Control Levels (ACL) to create a user group for each client. Create a dedicated menu item for their private meeting room and set its <strong>Access</strong> level to their specific user group. Now, only that logged-in client can see and access their private session link.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="caso-de-uso-2-la-plataforma-de-webinar-comunitaria">Caso de uso 2: La plataforma de webinar comunitaria<a href="https://www.plugnmeet.org/es/blog/joomla-video-conferencing-guide#caso-de-uso-2-la-plataforma-de-webinar-comunitaria" class="hash-link" aria-label="Enlace directo al Caso de uso 2: La plataforma de webinar comunitaria" title="Enlace directo al Caso de uso 2: La plataforma de webinar comunitaria" translate="no">​</a></h4>
<p>Host live webinars and events directly on your site to engage your community.</p>
<ul>
<li class=""><strong>Cómo hacerlo:</strong> Create a new room and configure it for a webinar. In the room settings, you can disable webcams for attendees, enable <strong>Cloud Recording</strong>, and activate features like <strong>Polling</strong> and <strong>Raise Hand</strong>. Set the menu item's access to "Public" or "Registered" and you have an instant webinar platform.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="caso-de-uso-3-el-servicio-de-membresía-monetizado">Caso de uso 3: El servicio de membresía monetizado<a href="https://www.plugnmeet.org/es/blog/joomla-video-conferencing-guide#caso-de-uso-3-el-servicio-de-membres%C3%ADa-monetizado" class="hash-link" aria-label="Enlace directo al Caso de uso 3: El servicio de membresía monetizado" title="Enlace directo al Caso de uso 3: El servicio de membresía monetizado" translate="no">​</a></h4>
<p>This is where you can turn your Joomla site into a revenue-generating business. By combining Plug-N-Meet with a Joomla membership or e-commerce extension, you can sell access to premium video content. For a detailed walkthrough, see our guide on <strong><a class="" href="https://www.plugnmeet.org/es/blog/no-code-video-conferencing-service-with-joomla">How to Launch Your Own No-Code Video Conferencing Service with Joomla</a></strong>.</p>
<ul>
<li class=""><strong>Cómo hacerlo:</strong>
<ol>
<li class="">Use your membership extension to create a "Premium Members" user group that paying subscribers are automatically added to.</li>
<li class="">Create a new menu item that links to your premium Plug-N-Meet room.</li>
<li class="">Set the <strong>Access</strong> level for this menu item to "Premium Members."</li>
</ol>
</li>
</ul>
<p>Now, only paying subscribers will be able to see the link and join your exclusive video sessions, creating an automated paywall.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="conclusión-la-solución-de-video-profesional-para-joomla">Conclusión: La solución de video profesional para Joomla<a href="https://www.plugnmeet.org/es/blog/joomla-video-conferencing-guide#conclusi%C3%B3n-la-soluci%C3%B3n-de-video-profesional-para-joomla" class="hash-link" aria-label="Enlace directo al Conclusión: La solución de video profesional para Joomla" title="Enlace directo al Conclusión: La solución de video profesional para Joomla" translate="no">​</a></h3>
<p>Don't let external tools dictate your user experience. With the Plug-N-Meet component, you can seamlessly integrate a secure, scalable, and fully-branded video conferencing platform into the Joomla ecosystem.</p>
<p>It's a solution that's simple enough to get started in minutes but powerful enough to build a business on.</p>
<hr>
<p><strong>¿Listo para potenciar tu sitio Joomla?</strong></p>
<ul>
<li class=""><strong><a href="https://extensions.joomla.org/extension/plugnmeet/" target="_blank" rel="noopener noreferrer" class="">Descarga el Componente oficial de Joomla</a></strong></li>
<li class=""><strong><a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Prueba la Demo en Vivo</a> para ver todas las características en acción.</strong></li>
<li class=""><strong>Sigue nuestra <a class="" href="https://www.plugnmeet.org/es/docs/installation">Guía de Instalación</a> para poner en marcha tu servidor.</strong></li>
</ul>]]></content:encoded>
            <category>joomla</category>
            <category>videoconferencia</category>
            <category>componente</category>
            <category>sin-codigo</category>
            <category>webinar</category>
            <category>membresia</category>
            <category>joomla-videoconferencia</category>
        </item>
        <item>
            <title><![CDATA[La Guía Definitiva para la Videoconferencia en Moodle: Desde Aulas Virtuales hasta Talleres Colaborativos]]></title>
            <link>https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide</link>
            <guid>https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide</guid>
            <pubDate>Sat, 14 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Como educador o administrador en Moodle, su objetivo es crear un entorno de aprendizaje fluido y atractivo. Pero cuando llega el momento de una clase virtual en vivo, muchos se ven obligados a hacer concesiones, enviando a los estudiantes a un enlace externo de Zoom o Teams. Esto interrumpe el flujo de aprendizaje, crea una experiencia de usuario desarticulada y plantea preocupaciones válidas sobre la privacidad de los datos de los estudiantes.]]></description>
            <content:encoded><![CDATA[<p>Como educador o administrador en Moodle, su objetivo es crear un entorno de aprendizaje fluido y atractivo. Pero cuando llega el momento de una clase virtual en vivo, muchos se ven obligados a hacer concesiones, enviando a los estudiantes a un enlace externo de Zoom o Teams. Esto interrumpe el flujo de aprendizaje, crea una experiencia de usuario desarticulada y plantea preocupaciones válidas sobre la privacidad de los datos de los estudiantes.</p>
<p>¿Y si su aula virtual fuera solo otra actividad nativa de Moodle, tan fácil de agregar como un cuestionario o un foro? ¿Y si fuera un espacio potente e interactivo diseñado específicamente para la enseñanza, no solo una sala de reuniones genérica?</p>
<p>Con el plugin oficial de <strong>Plug-N-Meet para Moodle</strong>, esto no solo es posible; es simple. Esta guía le mostrará cómo transformar su sitio de Moodle en una plataforma de e-learning interactiva de clase mundial.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="por-qué-una-integración-nativa-de-moodle-es-un-cambio-de-juego">Por qué una Integración Nativa de Moodle es un Cambio de Juego<a href="https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide#por-qu%C3%A9-una-integraci%C3%B3n-nativa-de-moodle-es-un-cambio-de-juego" class="hash-link" aria-label="Enlace directo al Por qué una Integración Nativa de Moodle es un Cambio de Juego" title="Enlace directo al Por qué una Integración Nativa de Moodle es un Cambio de Juego" translate="no">​</a></h3>
<p>Antes de llegar al "cómo", centrémonos en el "porqué". Elegir una solución autoalojada y profundamente integrada como Plug-N-Meet en lugar de una herramienta SaaS genérica proporciona tres ventajas críticas para cualquier institución educativa.</p>
<ol>
<li class=""><strong>Una Experiencia Estudiantil Fluida:</strong> Los estudiantes nunca abandonan su sitio de Moodle. Se unen a la clase en vivo directamente desde la página de su curso, con la misma marca e interfaz que ya conocen. Esto reduce la confusión y los mantiene enfocados en el aprendizaje, no en la tecnología.</li>
<li class=""><strong>Control Absoluto sobre los Datos de los Estudiantes:</strong> En la educación, la privacidad es primordial. Con una plataforma autoalojada, todos los datos de los estudiantes y las grabaciones de las clases se almacenan en sus propios servidores, no en una nube de terceros. Esto le da un control total para garantizar el cumplimiento de las regulaciones de privacidad como GDPR y FERPA.</li>
<li class=""><strong>Costos Predecibles y Escalables:</strong> En lugar de pagar una costosa suscripción por anfitrión y por mes que lo penaliza por agregar más maestros, tiene un costo fijo y predecible para su infraestructura de servidor. Este es un modelo mucho más sostenible y rentable para escuelas y universidades.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="la-guía-de-3-pasos-para-su-primera-aula-virtual-en-moodle">La Guía de 3 Pasos para su Primera Aula Virtual en Moodle<a href="https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide#la-gu%C3%ADa-de-3-pasos-para-su-primera-aula-virtual-en-moodle" class="hash-link" aria-label="Enlace directo al La Guía de 3 Pasos para su Primera Aula Virtual en Moodle" title="Enlace directo al La Guía de 3 Pasos para su Primera Aula Virtual en Moodle" translate="no">​</a></h3>
<p>Comenzar es increíblemente rápido. Puede tener su primera sala de reuniones en vivo en menos de 15 minutos. Para un recorrido más detallado, también puede leer nuestra popular guía sobre <strong><a class="" href="https://www.plugnmeet.org/es/blog/no-code-video-conferencing-moodle">How to Add No-Code Video Conferencing to Your Moodle Courses</a></strong>.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="paso-1-obtenga-su-motor-de-videoconferencia">Paso 1: Obtenga su Motor de Videoconferencia<a href="https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide#paso-1-obtenga-su-motor-de-videoconferencia" class="hash-link" aria-label="Enlace directo al Paso 1: Obtenga su Motor de Videoconferencia" title="Enlace directo al Paso 1: Obtenga su Motor de Videoconferencia" translate="no">​</a></h4>
<p>Primero, necesita el servidor que impulsará sus videollamadas. Puede autoalojar la versión de código abierto con nuestro <strong><a class="" href="https://www.plugnmeet.org/es/docs/installation">simple installation script</a></strong> u obtener un servidor administrado instantáneo de <strong><a href="https://www.plugnmeet.cloud/" target="_blank" rel="noopener noreferrer" class="">plugnmeet Cloud</a></strong>. Ambos le proporcionarán una <strong>Clave de API</strong> y un <strong>Secreto de API</strong>.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="paso-2-instale-el-plugin-gratuito-de-plug-n-meet">Paso 2: Instale el Plugin Gratuito de Plug-N-Meet<a href="https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide#paso-2-instale-el-plugin-gratuito-de-plug-n-meet" class="hash-link" aria-label="Enlace directo al Paso 2: Instale el Plugin Gratuito de Plug-N-Meet" title="Enlace directo al Paso 2: Instale el Plugin Gratuito de Plug-N-Meet" translate="no">​</a></h4>
<p>Desde su panel de Administración del sitio de Moodle:</p>
<ol>
<li class="">Vaya a <strong>Administración del sitio &gt; Plugins &gt; Instalar plugins</strong>.</li>
<li class="">Instale el plugin de Plug-N-Meet, que puede descargar desde el <a href="https://moodle.org/plugins/mod_plugnmeet" target="_blank" rel="noopener noreferrer" class="">directorio de plugins oficial de Moodle</a>.</li>
<li class="">Después de la instalación, navegue a la página de configuración del plugin (<strong>Administración del sitio &gt; Plugins &gt; Módulos de actividad &gt; PlugNmeet</strong>).</li>
<li class="">Ingrese su <strong>Clave de API</strong> y <strong>Secreto de API</strong> y guarde los cambios.</li>
</ol>
<p>Su sitio de Moodle ahora está completamente integrado con su motor de videoconferencia.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="paso-3-agregue-la-actividad-plugnmeet-a-su-curso">Paso 3: Agregue la Actividad "PlugNmeet" a su Curso<a href="https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide#paso-3-agregue-la-actividad-plugnmeet-a-su-curso" class="hash-link" aria-label="Enlace directo al Paso 3: Agregue la Actividad &quot;PlugNmeet&quot; a su Curso" title="Enlace directo al Paso 3: Agregue la Actividad &quot;PlugNmeet&quot; a su Curso" translate="no">​</a></h4>
<ol>
<li class="">Navegue al curso de Moodle donde desea agregar la clase en vivo.</li>
<li class="">Active el <strong>Modo de edición</strong>.</li>
<li class="">Haga clic en <strong>Añadir una actividad o un recurso</strong> y seleccione <strong>PlugNmeet</strong> de la lista.</li>
<li class="">Configure su aula virtual, dándole un nombre, un mensaje de bienvenida y estableciendo el horario.</li>
</ol>
<p>Eso es todo. Sus estudiantes ahora pueden unirse a un aula virtual potente e interactiva directamente desde la página de su curso de Moodle.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="suba-de-nivel-3-formas-poderosas-de-usar-el-video-en-moodle">Suba de Nivel: 3 Formas Poderosas de Usar el Video en Moodle<a href="https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide#suba-de-nivel-3-formas-poderosas-de-usar-el-video-en-moodle" class="hash-link" aria-label="Enlace directo al Suba de Nivel: 3 Formas Poderosas de Usar el Video en Moodle" title="Enlace directo al Suba de Nivel: 3 Formas Poderosas de Usar el Video en Moodle" translate="no">​</a></h3>
<p>Plug-N-Meet es más que una simple herramienta de conferencias. Es un conjunto de características diseñadas para la pedagogía moderna.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="caso-de-uso-1-el-aula-virtual-interactiva">Caso de Uso 1: El Aula Virtual Interactiva<a href="https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide#caso-de-uso-1-el-aula-virtual-interactiva" class="hash-link" aria-label="Enlace directo al Caso de Uso 1: El Aula Virtual Interactiva" title="Enlace directo al Caso de Uso 1: El Aula Virtual Interactiva" translate="no">​</a></h4>
<p>Transforme una conferencia pasiva en una experiencia atractiva y bidireccional.</p>
<ul>
<li class=""><strong>Cómo hacerlo:</strong> Use la <strong><a class="" href="https://www.plugnmeet.org/es/blog/integrated-whiteboard-experience">Interactive Whiteboard</a></strong> para cargar sus diapositivas de presentación y anotarlas en tiempo real. Use la función de <strong>Live Polling</strong> para verificar rápidamente la comprensión de los estudiantes o realizar un cuestionario rápido. Todas las sesiones de clase se pueden grabar en la nube y poner a disposición automáticamente en el curso de Moodle para los estudiantes que se perdieron la sesión en vivo.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="caso-de-uso-2-el-taller-colaborativo-con-salas-de-grupos">Caso de Uso 2: El Taller Colaborativo con Salas de Grupos<a href="https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide#caso-de-uso-2-el-taller-colaborativo-con-salas-de-grupos" class="hash-link" aria-label="Enlace directo al Caso de Uso 2: El Taller Colaborativo con Salas de Grupos" title="Enlace directo al Caso de Uso 2: El Taller Colaborativo con Salas de Grupos" translate="no">​</a></h4>
<p>Para el aprendizaje basado en proyectos y el trabajo en grupo, la función de <strong><a class="" href="https://www.plugnmeet.org/es/blog/mastering-breakout-rooms">Breakout Rooms</a></strong> es esencial.</p>
<ul>
<li class=""><strong>Cómo hacerlo:</strong> Desde la sesión en vivo, el maestro puede dividir a los estudiantes en grupos más pequeños. Cada sala de grupos obtiene su propia pizarra privada y completamente funcional y un bloc de notas compartido, lo que permite una verdadera colaboración en grupos pequeños. El maestro puede transmitir mensajes a todas las salas o visitar un grupo específico para verificar su progreso.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="caso-de-uso-3-la-conferencia-segura-uno-a-uno-o-entre-padres-y-maestros">Caso de Uso 3: La Conferencia Segura Uno a Uno o entre Padres y Maestros<a href="https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide#caso-de-uso-3-la-conferencia-segura-uno-a-uno-o-entre-padres-y-maestros" class="hash-link" aria-label="Enlace directo al Caso de Uso 3: La Conferencia Segura Uno a Uno o entre Padres y Maestros" title="Enlace directo al Caso de Uso 3: La Conferencia Segura Uno a Uno o entre Padres y Maestros" translate="no">​</a></h4>
<p>Para conversaciones privadas, necesita un mayor nivel de seguridad.</p>
<ul>
<li class=""><strong>Cómo hacerlo:</strong> Cree una actividad de PlugNmeet y, en la configuración de la sala, habilite el <strong><a class="" href="https://www.plugnmeet.org/es/blog/privacy-by-design-zero-trust">End-to-End Encryption (E2EE)</a></strong>. Esto proporciona una garantía matemática de que la conversación es completamente privada y que ni siquiera el administrador del servidor puede acceder al audio o al video. Esto es ideal para el apoyo individual a los estudiantes, las sesiones de consejería o las conferencias de padres y maestros donde la confidencialidad es crítica.</li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="conclusión-el-aula-virtual-que-moodle-merece">Conclusión: El Aula Virtual que Moodle Merece<a href="https://www.plugnmeet.org/es/blog/moodle-video-conferencing-guide#conclusi%C3%B3n-el-aula-virtual-que-moodle-merece" class="hash-link" aria-label="Enlace directo al Conclusión: El Aula Virtual que Moodle Merece" title="Enlace directo al Conclusión: El Aula Virtual que Moodle Merece" translate="no">​</a></h3>
<p>Deje de hacer concesiones con herramientas externas que interrumpen la experiencia de aprendizaje. Al integrar Plug-N-Meet, puede ofrecer a sus maestros y estudiantes un aula virtual potente, segura y perfectamente integrada que vive justo donde pertenece: dentro de Moodle.</p>
<p>Es una solución lo suficientemente simple para que cualquier maestro la use, pero lo suficientemente potente como para soportar los métodos de enseñanza en línea más innovadores.</p>
<hr>
<p><strong>¿Listo para mejorar sus cursos de Moodle?</strong></p>
<ul>
<li class=""><strong><a href="https://moodle.org/plugins/mod_plugnmeet" target="_blank" rel="noopener noreferrer" class="">Download the official Moodle Plugin</a></strong></li>
<li class=""><strong><a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Try the Live Demo</a> para explorar las herramientas de enseñanza.</strong></li>
<li class=""><strong>Follow our <a class="" href="https://www.plugnmeet.org/es/docs/installation">Installation Guide</a> para poner en marcha su servidor.</strong></li>
</ul>]]></content:encoded>
            <category>moodle</category>
            <category>videoconferencia</category>
            <category>plugin</category>
            <category>sin-código</category>
            <category>aula-virtual</category>
            <category>e-learning</category>
            <category>plugin-de-moodle</category>
            <category>videoconferencia-en-moodle</category>
        </item>
        <item>
            <title><![CDATA[The Ultimate Guide to WordPress Video Conferencing]]></title>
            <link>https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide</link>
            <guid>https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide</guid>
            <pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[WordPress has empowered millions to build anything from a simple blog to a complex e-commerce empire. But when it comes to one of the most critical forms of modern communication—live video—many site owners hit a wall. You're often left juggling clunky Zoom links, sending your users to third-party platforms, and sacrificing the professional, branded experience your website was designed to provide.]]></description>
            <content:encoded><![CDATA[<p>WordPress has empowered millions to build anything from a simple blog to a complex e-commerce empire. But when it comes to one of the most critical forms of modern communication—live video—many site owners hit a wall. You're often left juggling clunky Zoom links, sending your users to third-party platforms, and sacrificing the professional, branded experience your website was designed to provide.</p>
<p>What if you could integrate a powerful, secure, and fully-branded video conferencing solution directly into your WordPress site as easily as you add a new page?</p>
<p>This is not just possible; it's simple. This guide will show you how to use the <strong>Plug-N-Meet plugin</strong> to transform your WordPress site into a true communication hub, whether you need a simple meeting room, a platform for webinars, or a full-fledged, monetized video service.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="why-self-hosted-is-the-smart-choice-for-wordpress">Why Self-Hosted is the Smart Choice for WordPress<a href="https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide#why-self-hosted-is-the-smart-choice-for-wordpress" class="hash-link" aria-label="Enlace directo al Why Self-Hosted is the Smart Choice for WordPress" title="Enlace directo al Why Self-Hosted is the Smart Choice for WordPress" translate="no">​</a></h3>
<p>Before we dive into the "how," let's cover the "why." While embedding a Zoom meeting is an option, a self-hosted solution like Plug-N-Meet offers three transformative advantages for any serious WordPress site owner:</p>
<ol>
<li class=""><strong>You Own Your Brand:</strong> Every meeting happens on your own domain, with your logo and your colors. You're not providing free advertising for a SaaS giant; you're reinforcing your own brand's professionalism and trust.</li>
<li class=""><strong>You Control Your Data:</strong> All data—from user information to recordings—stays on your own server. This gives you absolute control over privacy and is critical for compliance in sensitive industries.</li>
<li class=""><strong>You Escape Per-User Pricing:</strong> Instead of paying a fee for every host on your team, you have a predictable, fixed cost for your server. This model rewards your growth instead of penalizing it.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="the-3-step-guide-to-your-first-wordpress-meeting">The 3-Step Guide to Your First WordPress Meeting<a href="https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide#the-3-step-guide-to-your-first-wordpress-meeting" class="hash-link" aria-label="Enlace directo al The 3-Step Guide to Your First WordPress Meeting" title="Enlace directo al The 3-Step Guide to Your First WordPress Meeting" translate="no">​</a></h3>
<p>Getting started is incredibly fast. You can have your first meeting room live in under 15 minutes.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="step-1-install-the-engine-your-plug-n-meet-server">Step 1: Install the Engine (Your Plug-N-Meet Server)<a href="https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide#step-1-install-the-engine-your-plug-n-meet-server" class="hash-link" aria-label="Enlace directo al Step 1: Install the Engine (Your Plug-N-Meet Server)" title="Enlace directo al Step 1: Install the Engine (Your Plug-N-Meet Server)" translate="no">​</a></h4>
<p>First, you need the server that will power your video calls. You can either self-host the open-source version with our <strong><a class="" href="https://www.plugnmeet.org/es/docs/installation">simple installation script</a></strong> or get an instant, managed server from <strong><a href="https://www.plugnmeet.cloud/" target="_blank" rel="noopener noreferrer" class="">plugnmeet Cloud</a></strong>. Both will provide you with an <strong>API Key</strong> and <strong>API Secret</strong>.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="step-2-install-the-free-plug-n-meet-plugin">Step 2: Install the Free Plug-N-Meet Plugin<a href="https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide#step-2-install-the-free-plug-n-meet-plugin" class="hash-link" aria-label="Enlace directo al Step 2: Install the Free Plug-N-Meet Plugin" title="Enlace directo al Step 2: Install the Free Plug-N-Meet Plugin" translate="no">​</a></h4>
<p>From your WordPress dashboard:</p>
<ol>
<li class="">Go to <strong>Plugins &gt; Add New</strong>.</li>
<li class="">Search for <strong>"plugnmeet"</strong>.</li>
<li class="">Click <strong>Install Now</strong>, then <strong>Activate</strong>.</li>
<li class="">Navigate to the new <strong>Plug-N-Meet &gt; Settings</strong> menu.</li>
<li class="">Enter your <strong>API Key</strong> and <strong>API Secret</strong> and save.</li>
</ol>
<p>Your WordPress site is now fully integrated with your video conferencing engine.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="step-3-create-and-embed-your-room">Step 3: Create and Embed Your Room<a href="https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide#step-3-create-and-embed-your-room" class="hash-link" aria-label="Enlace directo al Step 3: Create and Embed Your Room" title="Enlace directo al Step 3: Create and Embed Your Room" translate="no">​</a></h4>
<ol>
<li class="">Go to <strong>Plug-N-Meet &gt; Rooms</strong> and click <strong>Add New</strong>.</li>
<li class="">Configure your room's features (e.g., name, max participants, welcome message) and get the <strong>Room ID</strong>.</li>
<li class="">After saving, the plugin will generate a unique <strong>Shortcode</strong> for that room (e.g., <code>[plugnmeet_room_view id="your_room_id"]</code>).</li>
<li class="">Create a new WordPress Page, paste the shortcode into the content, and click <strong>Publish</strong>.</li>
</ol>
<p>That's it. You now have a fully functional, branded video conferencing room running directly on your own website.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="level-up-3-powerful-ways-to-use-video-on-your-wordpress-site">Level Up: 3 Powerful Ways to Use Video on Your WordPress Site<a href="https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide#level-up-3-powerful-ways-to-use-video-on-your-wordpress-site" class="hash-link" aria-label="Enlace directo al Level Up: 3 Powerful Ways to Use Video on Your WordPress Site" title="Enlace directo al Level Up: 3 Powerful Ways to Use Video on Your WordPress Site" translate="no">​</a></h3>
<p>Once you've mastered the basics, you can leverage Plug-N-Meet to power a wide range of professional services.</p>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="use-case-1-the-private-coaching-or-consultation-room">Use Case 1: The Private Coaching or Consultation Room<a href="https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide#use-case-1-the-private-coaching-or-consultation-room" class="hash-link" aria-label="Enlace directo al Use Case 1: The Private Coaching or Consultation Room" title="Enlace directo al Use Case 1: The Private Coaching or Consultation Room" translate="no">​</a></h4>
<p>Are you a coach, consultant, or therapist? You can easily create secure, private rooms for your client sessions.</p>
<ul>
<li class=""><strong>How to do it:</strong> Create a separate, password-protected page for each client. Embed the shortcode for a unique meeting room on that page. Only the person with the password can access the session, ensuring complete privacy.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="use-case-2-the-community-webinar-or-live-event">Use Case 2: The Community Webinar or Live Event<a href="https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide#use-case-2-the-community-webinar-or-live-event" class="hash-link" aria-label="Enlace directo al Use Case 2: The Community Webinar or Live Event" title="Enlace directo al Use Case 2: The Community Webinar or Live Event" translate="no">​</a></h4>
<p>Want to host a webinar for your audience? Plug-N-Meet is a powerful open-source webinar platform.</p>
<ul>
<li class=""><strong>How to do it:</strong> Create a room and configure its features specifically for a webinar. In the room settings, you can disable webcams and microphones for attendees by default, enable <strong>Cloud Recording</strong>, and use features like <strong>Polling</strong> and <strong>Raise Hand</strong> to manage audience interaction. Embed the room's shortcode on your "Events" page and you're ready to go live.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_eV_2" id="use-case-3-the-monetized-membership-site">Use Case 3: The Monetized Membership Site<a href="https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide#use-case-3-the-monetized-membership-site" class="hash-link" aria-label="Enlace directo al Use Case 3: The Monetized Membership Site" title="Enlace directo al Use Case 3: The Monetized Membership Site" translate="no">​</a></h4>
<p>This is where you can turn your video feature into a revenue stream. By combining Plug-N-Meet with a popular membership plugin (like Paid Memberships Pro, MemberPress, or Restrict Content Pro), you can create premium video content exclusively for paying subscribers. For a detailed walkthrough of this business model, see our guide on <strong><a class="" href="https://www.plugnmeet.org/es/blog/no-code-video-conferencing-service-with-wordpress">How to Launch Your Own No-Code Video Conferencing Service with WordPress</a></strong>.</p>
<ul>
<li class=""><strong>How to do it:</strong>
<ol>
<li class="">Use your membership plugin to create a "Premium" subscription tier.</li>
<li class="">Create a new WordPress page for your premium content (e.g., "Weekly Mastermind Call").</li>
<li class="">Paste the Plug-N-Meet room shortcode onto this page.</li>
<li class="">Use your membership plugin's settings to <strong>restrict access</strong> to this page so that only users with an active "Premium" subscription can view it.</li>
</ol>
</li>
</ul>
<p>Now, you have a secure, automated paywall for your exclusive video content.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="unlocking-advanced-features-ai-and-zero-trust-security">Unlocking Advanced Features: AI and Zero-Trust Security<a href="https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide#unlocking-advanced-features-ai-and-zero-trust-security" class="hash-link" aria-label="Enlace directo al Unlocking Advanced Features: AI and Zero-Trust Security" title="Enlace directo al Unlocking Advanced Features: AI and Zero-Trust Security" translate="no">​</a></h3>
<p>The Plug-N-Meet WordPress plugin isn't just for basic meetings. It gives you simple, one-click access to enterprise-grade features directly from your room settings.</p>
<ul>
<li class=""><strong>AI-Powered Meeting Assistants:</strong> Imagine having every meeting automatically transcribed and summarized. With the AI features enabled, you can turn your conversations into actionable intelligence. Learn <strong><a class="" href="https://www.plugnmeet.org/es/blog/how-to-add-ai-meeting-assistant-features">how to add AI features</a></strong> with a simple toggle.</li>
<li class=""><strong>Zero-Trust Security:</strong> For telehealth, legal consultations, or any conversation requiring absolute confidentiality, you can enable End-to-End Encryption (E2EE). This ensures that not even your server can access the meeting's content. Discover more about our <strong><a class="" href="https://www.plugnmeet.org/es/blog/privacy-by-design-zero-trust">privacy-by-design philosophy</a></strong>.</li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_eV_2" id="conclusion-the-professional-video-solution-wordpress-deserves">Conclusion: The Professional Video Solution WordPress Deserves<a href="https://www.plugnmeet.org/es/blog/wordpress-video-conferencing-guide#conclusion-the-professional-video-solution-wordpress-deserves" class="hash-link" aria-label="Enlace directo al Conclusion: The Professional Video Solution WordPress Deserves" title="Enlace directo al Conclusion: The Professional Video Solution WordPress Deserves" translate="no">​</a></h3>
<p>Stop treating live video as an afterthought. With Plug-N-Meet, you can seamlessly integrate a secure, scalable, and fully-branded video conferencing platform into the WordPress ecosystem you already know and love.</p>
<p>It's a solution that's simple enough to start in minutes but powerful enough to grow with your biggest ambitions.</p>
<hr>
<p><strong>Ready to power up your WordPress site?</strong></p>
<ul>
<li class=""><strong><a href="https://wordpress.org/plugins/plugnmeet/" target="_blank" rel="noopener noreferrer" class="">Download the official WordPress Plugin</a></strong></li>
<li class=""><strong><a href="https://demo.plugnmeet.com/landing.html" target="_blank" rel="noopener noreferrer" class="">Try the Live Demo</a> to see all the features in action.</strong></li>
<li class=""><strong>Follow our <a class="" href="https://www.plugnmeet.org/es/docs/installation">Installation Guide</a> to get your server running.</strong></li>
</ul>]]></content:encoded>
            <category>wordpress</category>
            <category>video-conferencing</category>
            <category>plugin</category>
            <category>no-code</category>
            <category>webinar</category>
            <category>coaching</category>
            <category>membership</category>
            <category>wordpress-video-conferencing</category>
        </item>
    </channel>
</rss>