Transmisor multimedia
35 min
el transmisor multimedia se controla configurando una canalización el componente de origen de flujo y el componente de destino de flujo se especifican pasando una cadena al método romediastreamer setpipeline() esta cadena contiene tanto los componentes de origen como de destino concatenados; las diferentes etapas de la canalización están delimitadas por comas la canalización se inicia llamando al método start() (sin argumentos adicionales) el método stop() se puede utilizar para detener la canalización sin embargo, algunas de las etapas de la canalización (descritas en la sección máquina de estados del transmisor multimedia docid\ b8aqcs l gwfrh9rttt7c a continuación) continuarán ejecutándose internamente, por lo que el método reset() puede ser preferible para finalizar el flujo los reproductores xd5 no admiten codificación puede transmitir archivos existentes a otros reproductores y clientes, pero no puede cambiar la tasa de bits ni la resolución del archivo usando la codificación del transmisor multimedia los reproductores xt5 tienen entrada hdmi solo con audio la entrada protegida con hdcp no se transmite no tienen fuente de pantalla, ni rostreamqueue ni eventos de fin de flujo transmisión simple de archivos el siguiente ejemplo muestra cómo transmitir desde un origen de archivo a un único cliente m = createobject("romediastreamer") m setpipeline("file ///data/clip ts, udp\ //239 192 0 0 1234/") m start() para detener el flujo, llame a m reset() el origen archivo y los destinos udp/rtp no funcionan de la misma manera que en el firmware 4 7 sin embargo, el método de transmisión de archivos de 4 7 sigue estando disponible usando los componentes filesimple , udpsimple y rtpsimple el siguiente ejemplo funciona exactamente igual que la transmisión multimedia en 4 7 m setpipeline("filesimple ///data/clip ts, udpsimple //239 192 0 0 1234/") tenga en cuenta que el componente filesimple solo funciona con udpsimple/rtpsimple , y viceversa no utilice los puertos 8888 o 9999, ya que estos puertos pueden ser utilizados por brightsignos máquina de estados del transmisor multimedia el transmisor multimedia, representado por el método setpipeline() , tiene cuatro estados reset el transmisor multimedia se ha creado, pero no se ha asignado ni ejecutado nada initialised puede que se haya realizado alguna asignación y que algunos recursos estén reservados, pero nada está en ejecución connected todas las estructuras se han creado y todos los componentes de la canalización están conectados entre sí aunque la canalización no produce salida, algunas partes internas de esta ya pueden estar ejecutándose running la canalización está en ejecución cuando se crea un transmisor multimedia, comienza en el estado reset después de llamar a setpipeline() , los estados pueden progresar usando los siguientes métodos de romediastreamer initialise() , conectar() , y start() pasar a un estado posterior hace que cualquier estado intermedio se recorra automáticamente, por lo que una canalización puede iniciarse simplemente llamando a start() cuando un transmisor multimedia está en el estado running, puede retroceder por los estados llamando respectivamente a stop() , disconnect() , y reset() como antes, los estados intermedios pueden omitirse, por lo que es posible detener el transmisor multimedia y liberar todos sus recursos simplemente llamando a reset() aunque stop() detiene cualquier salida de la canalización, aún puede haber cierta actividad interna llamar a setpipeline() siempre hace que el transmisor multimedia vuelva al estado reset todas las funciones de interfaz anteriores, aparte de setpipeline() , no aceptan argumentos componentes de origen esta sección enumera los componentes de origen disponibles actualmente para una canalización de transmisión tenga en cuenta que algunos componentes de origen (es decir, mem / y memsimple / ) no pueden llamarse hasta que primero se creen usando componentes de destino, los cuales se describen en la siguiente sección filesimple ///filename este componente lee el archivo especificado desde el almacenamiento local el archivo debe ser un flujo de transporte mpeg 2 (generalmente con un sufijo ts ) este componente solo puede conectarse a componentes udpsimple , rtpsimple , o memsimple el parámetro opcional bucle puede añadirse para hacer que el archivo de entrada se repita en bucle m setpipeline("filesimple ///file ts?loop, udpsimple //239 192 0 0 1234/") file ///filename este componente puede actuar como origen o destino como origen, lee desde un archivo de flujo de transporte mpeg 2 y puede conectarse de forma más general a otros componentes este componente no simple debe usarse cuando se conecta a componentes de destino hls (porque utiliza un flujo indexado) debido a que utiliza menos recursos, recomendamos usar el componente filesimple en lugar del componente archivo siempre que sea suficiente este componente acepta los parámetros opcionales clave y iv para cifrado / descifrado de archivos docid\ b8aqcs l gwfrh9rttt7c el parámetro opcional loop puede añadirse para hacer que el archivo de entrada se repita en bucle m setpipeline("file ///file ts?loop, hls\ ///file?duration=3") hdmi \[///] este componente recibe audio y video desde la entrada hdmi® luego puede enviarse a través de un componente esencoder de media streamer mostrado a continuación y transmitirse o escribirse en un archivo display \[///] este componente recibe el audio y video de la presentación actual, lo que permite al reproductor codificar y transmitir la salida de visualización actual consulte la página codificación de pantalla docid\ tct6bquxp3ycvlkeiomiz para obtener más información sobre el uso de este componente udp\ //ip address\ port/ este componente recibe un flujo usando el protocolo udp rtp\ //ip address\ port/ este componente recibe un flujo usando el protocolo rtp rtsp\ //ip address\ port/path este componente recibe un flujo usando el protocolo rtsp puede incluirse un parámetro opcional dtcp port para especificar una sesión cifrada dtcp ip rtsp\ //10 1 243 554/stream1?dtcp port=8888 http //ip address\ port/path este componente recibe un flujo usando el protocolo http https //ip address\ port/path este componente recibe un flujo usando el protocolo https gst //ip address\ port/path este componente recibe una canalización gstreamer y genera un flujo no simple usándola gstsimple //ip address\ port/path este componente recibe una canalización gstreamer y genera un flujo simple usándola memsimple /name/stream ts este componente lee desde un componente de flujo de memoria previamente creado (destino) con el nombre especificado y reenvía los resultados a otros componentes simples tenga en cuenta que /stream ts se añade para denotar "el búfer de memoria completo" el siguiente ejemplo realizará multidifusión de un flujo de memoria m setpipeline("memsimple /livestream/stream ts, rtpsimple //239 192 0 0 5004/") un componente de origen memsimple puede originarse a partir de un flujo de memoria simple (usando el componente de destino memsimple ) o de un flujo de memoria no simple e "indexado" (usando el componente de destino mem ) consulte la página streaming de memoria docid\ ob0v0vpr y qim6acte0i para obtener más detalles mem /name/stream ts este componente lee desde un flujo de memoria de destino creado previamente con el nombre dado; luego puede reenviar los resultados a otros componentes no simples tenga en cuenta que /stream ts se agrega para indicar "el búfer de memoria completo" suponiendo recursos suficientes, el siguiente ejemplo transcodificará y transmitirá un flujo de memoria m setpipeline("mem /livestream/stream ts, decoder , encoder , rtp\ //239 192 0 0 5004/") componentes de destino esta sección enumera los componentes de destino disponibles actualmente udpsimple //ip address\ port/ este componente transmite su entrada a través de udp a la dirección ip y puerto proporcionados este destino solo funciona con el componente fuente filesimple o memsimple como entrada rtpsimple //ip address\ port/ este componente transmite su entrada a través de rtp a la dirección ip y puerto proporcionados este destino solo funciona con el componente fuente filesimple o memsimple como entrada httpsimple ///socket=num este componente transmite su entrada a través de una conexión http este destino solo funciona con el componente fuente filesimple o memsimple como entrada está diseñado para utilizarse como un servidor de medios http docid\ zedozrqzv wdxtm7 lqyo y no puede utilizarse para transmitir directamente a un cliente udp\ //ip address\ port/ este componente transmite su entrada a través de udp a la dirección ip y puerto proporcionados rtp\ //ip address\ port/ este componente transmite su entrada a través de rtp a la dirección ip y puerto proporcionados http ///socket=num este componente transmite su entrada a través de una conexión http este componente está diseñado para utilizarse como un servidor de medios http docid\ zedozrqzv wdxtm7 lqyo y no puede utilizarse para transmitir directamente a un cliente file ///filename este componente escribe su entrada en el archivo especificado, que se guardará como un archivo de flujo de transporte mpeg 2 este componente acepta los parámetros opcionales clave y iv para cifrado de archivos docid\ b8aqcs l gwfrh9rttt7c display \[///] este componente le permite ver lo que hay en un flujo (a menudo junto con el componente decoder) y se proporciona únicamente para depuración brightscript utiliza principalmente los objetos rovideoplayer y roaudioplayer para reproducir contenido de streaming memsimple /name este componente funciona únicamente con el componente filesimple escribe su entrada en un flujo de memoria docid\ ob0v0vpr y qim6acte0i llamado /name esto constituye un flujo de memoria simple, lo que significa que no está indexado y no puede utilizarse como entrada para una fuente mem , solo otra fuente memsimple este componente toma un parámetro de tamaño opcional que especifica el tamaño del búfer de memoria en megabytes el tamaño predeterminado del búfer de memoria es de 5mb m setpipeline("filesimple ///file ts, memsimple /file?size=2") mem /name este componente crea un flujo de memoria con el /name especificado este componente puede recibir entrada de componentes generales y escribe en un flujo de memoria docid\ ob0v0vpr y qim6acte0i indexado (en lugar de simple), que puede volver a leerse mediante el componente fuente mem por lo tanto, puede utilizarse para admitir streaming hls m setpipeline("file ///file ts, mem /file?duration=3\&size=25") el componente de destino mem acepta dos parámetros opcionales talla el tamaño del búfer de memoria en mb (megabytes) para streaming hls, este debe ser un búfer grande duración la duración objetivo de los puntos de índice (que se convierten en segmentos hls) hls\ ///path este componente segmenta el flujo entrante y lo escribe en la ruta indicada los segmentos escritos tendrán el nombre "path 000000 ts", "path 0000001 ts", etc , y el archivo de índice se llamará "path index m3u8" el componente de destino hls acepta el parámetro duración , que especifica la longitud objetivo aproximada, en segundos, de los segmentos hls el valor predeterminado es 5, por lo que para segmentar un archivo en duraciones de 3 segundos podría usar código similar al siguiente m setpipeline("file ///file ts, hls\ ///file?duration=3") la función anterior dividiría el archivo file ts en segmentos de aproximadamente 3 segundos cada uno, llamados "file 000000 ts", "file 000001 ts", "file 000002 ts", etc opciones del componente de destino las siguientes opciones se aplican a los componentes de destino udpsimple , rtpsimple , udp y rtp maxbitrate el parámetro maxbitrate limita el bitrate instantáneo máximo (en kbps) de un flujo por ejemplo, el siguiente componente nunca transmitiría a una velocidad superior a aproximadamente 2 mbps rtp\ //ip address\ port/?maxbitrate=2000 este número necesita ajustarse tanto para el contenido que se transmite como para la red a través de la cual se envía tenga en cuenta que puede ser difícil configurar bitrates para algunas redes inalámbricas ttl el parámetro ttl especifica cuántas veces los paquetes multicast pueden reenviarse a través de switches y otra infraestructura de red el valor predeterminado para este parámetro es 1 ejemplo rtp\ //ip address\ port/?ttl=64 otros componentes encoder \[///]\[param=value] este componente recibe una entrada sin codificar y genera datos de audio/video codificados como un flujo de transporte mpeg 2 los siguientes son parámetros válidos retardoaudio=\[retraso en ms] el desfase de sincronización de audio en milisegundos el valor predeterminado es 0 un valor positivo retrasará el audio con respecto al video, mientras que un valor negativo retrasará el video con respecto al audio delay=\[delay in ms] el retraso a2p en milisegundos si este parámetro se establece en 0 (el valor predeterminado), el codificador determina el retraso pframes=\[frames] el número de p slices entre i slices en el gop bframes=\[frames] el número de b slices entre p slices en el gop vbitrate=\[bitrate] el bitrate de video especificado en kbps vformat=\[format] la resolución y la velocidad de fotogramas de la salida de video el formato puede especificarse como cualquiera de los siguientes 480i50 480p25 720p24 720p25 720p30 720p50 720p60 1080i50 1080i60 1080p24 1080p25 1080p30 1080p50 1080p60 este componente utiliza h 264 para video y aac para audio el formato de video predeterminado es 720p30 y la tasa de bits predeterminada es 6mbps con las versiones de firmware 6 2 63 y posteriores, el video h 264 se codifica en perfil high con b frames con versiones anteriores del firmware, el video se codifica en nivel 4 1 sin b frames el siguiente ejemplo codifica video desde hdmi input y lo escribe en el almacenamiento local como un archivo ts m setpipeline("hdmi , encoder\ vformat=480p25\&vbitrate=1000, file ///hdmi ts") esencoder \[///]\[param=value] este componente recibe una entrada sin codificar y genera datos de video como un flujo h 264 elemental (a diferencia del componente estándar codificador que genera un flujo de transporte mpeg 2) el flujo h 264 no contiene datos de audio este componente acepta los mismos parámetros audiodelay , vformat y vbitrate que el componente encoder dado que los componentes no simples esperan un flujo de transporte mpeg 2, este componente solo funciona con los siguientes rtpsimple , udpsimple , httpsimple , y memsimple decoder \[///] este componente recibe una entrada codificada y la decodifica los usos principales de este componente son pasar un flujo de video al destino mostrar para reproducción o pasar un archivo de video a un componente codificador para transcodificación hdcp el objeto romediastreamer respetará el estado de protección contra copia de sus entradas asignando el mismo estado a sus salidas cada flujo puede tener uno de los siguientes niveles de protección contra copia ninguno no hay protección contra copia habilitada estos flujos pueden guardarse en archivos o transmitirse a través de la red sin restricciones hdcp la entrada está protegida con hdcp no puede guardarse ni transmitirse, pero puede enviarse a una pantalla autenticada con hdcp flujo de trabajo de hdcp el objeto romediastreamer gestionará la autenticación y desautenticación hdcp de la siguiente manera si un flujo no autenticado con hdcp pasa a estar autenticado con hdcp, cualquier componente de destino de archivo o transmisión ip se detendrá inmediatamente y enviará un evento eos error si la pantalla conectada no puede autenticarse con hdcp, el destino de pantalla ocultará la salida de video si un flujo que anteriormente estaba autenticado con hdcp deja de estar protegido, los componentes de destino de archivo y transmisión ip no se reanudarán sin embargo, si el destino de pantalla no está autenticado con hdcp, comenzará a mostrar video una pantalla autenticada con hdcp no se verá afectada en ninguno de los casos indicadores de cifrado el nivel de cifrado puede forzarse indicándolo en el componente de origen por ejemplo, el siguiente componente de origen forzará que cualquier pantalla conectada que reciba entrada hdmi esté autenticada con hdcp hdmi\ encryption=hdcp importante el estado de cifrado hdcp de un flujo no puede eliminarse estableciendo el parámetro encryption en none cifrado de archivos los componentes de origen y destino file /// aceptan los parámetros opcionales clave e iv, que pueden utilizarse para cifrar o descifrar un archivo mediante el algoritmo aes ctr los valores de clave e iv deben especificarse como cadenas hexadecimales de 16 bytes tenga en cuenta que este proceso de cifrado de archivos es distinto de la autenticación hdcp no hay restricciones sobre cómo pueden utilizarse los archivos cifrados en un pipeline, pero no puede usar esta forma de cifrado en un flujo que originalmente estaba protegido con hdcp el siguiente ejemplo guarda un flujo hls como un archivo cifrado una vez que se escribe el archivo, puede descifrarse desde un componente de origen file /// utilizando los mismos valores de clave e iv m = createobject("romediastreamer") m setpipeline("http //\<ip address>/playlist m3u8,file ///file ts?key= 30313233343536373839616263646566\&iv=30313233343536373839616263646566") m start() ejemplos de streaming los siguientes fragmentos de código proporcionan ejemplos de tipos comunes de transmisión multimedia transmitir un archivo mpeg 2 ts mediante udp para inicializar la instancia de romediastreamer y comenzar la transmisión, use lo siguiente m = createobject("romediastreamer") m setpipeline("file ///data/clip ts, udp\ //239 192 0 0 1234/") m start() para detener la transmisión, use lo siguiente m reset() también puede usar la forma simple de los componentes para las tareas de transmisión más comunes lo siguiente funcionará de forma idéntica a la transmisión anterior, mientras utiliza menos recursos m setpipeline("filesimple ///data/clip ts, udpsimple //239 192 0 0 1234/") transmitir una entrada hdmi codificada mediante rtp la resolución y la tasa de bits del video transmitido pueden cambiarse agregando parámetros al componente codificador use el siguiente código para transmitir la entrada usando la resolución nativa y la tasa de bits predeterminada m = createobject("romediastreamer") m setpipeline("hdmi , encoder , rtp\ //239 192 0 0 1234/") m start() para detener la transmisión, use lo siguiente m reset() grabar un archivo el siguiente código grabará una entrada hdmi y la guardará como un archivo llamado hdmi ts m = createobject("romediastreamer") m setpipeline("hdmi , encoder , file ///hdmi ts") m start() para detener el proceso de grabación, use lo siguiente m reset() transcodificar y transmitir un archivo la salida de un componente decodificador puede conectarse a la entrada de un componente codificador para transcodificar los datos esto es útil si desea modificar la tasa de bits del video antes de transmitirlo a través de la red el siguiente código transcodificará el video file ts antes de transmitirlo mediante rtp m = createobject("romediastreamer") m setpipeline("file ///file ts, decoder , encoder\ vbitrate=1000, rtp\ //239 192 0 0 5004/") m start() para detener el proceso de transcodificación, use lo siguiente m reset() retransmisión el reproductor puede usarse para emitir una entrada de transmisión utilizando un protocolo diferente conectando un componente cliente ip a un componente servidor ip el siguiente código recibirá una transmisión http y luego la transmitirá usando rtp m = createobject("romediastreamer") m setpipeline("http //172 30 1 37/file ts, rtp\ //239 192 0 0 5004/") m start() para detener la transmisión, use lo siguiente m reset() segmentar un archivo usando hls un archivo ts existente puede segmentarse para transmisión usando el protocolo hls los segmentos de archivo resultantes pueden luego transmitirse directamente realizando solicitudes http a un http media server el siguiente código usará el video file ts para generar segmentos con una duración aproximada de 10 segundos m = createobject("romediastreamer") m setpipeline("file ///file ts, hls\ ///media segment?duration=10") m start() en este caso, los archivos comenzarán con media segment 000000 ts , y el contador se incrementará una vez por cada segmento el archivo de índice se escribirá como "media segment index m3u8" componentes simples y no simples para conservar los recursos del sistema, recomendamos usar las versiones simples de los componentes siempre que sea posible use las siguientes pautas para determinar si deben usarse componentes simples o no simples use componentes simples al transmitir un archivo desde almacenamiento local usando protocolos udp, rtp o http (sin ninguna codificación o transcodificación involucrada en la canalización) use componentes no simples siempre que la canalización incluya codificación, transcodificación o transmisión hls al ingerir una transmisión desde una fuente remota y retransmitirla, use los componentes de destino udpsimple , rtpsimple , y httpsimple si necesita modular la transmisión (o retransmitir usando hls), use componentes no simples dado que un componente de origen memsimple puede leer desde un componente de destino mem , use el componente de origen memsimple junto con udpsimple , rtpsimple , o httpsimple cuando use transmisión de memoria docid\ ob0v0vpr y qim6acte0i el componente de origen mem solo debe usarse con el componente de destino hls (o archivo si está depurando)