Reproductor multimedia
37 min
el transmisor multimedia se controla configurando una canalización el componente stream source y el componente stream destination se especifican pasando una cadena al método romediastreamer setpipeline() esta cadena contiene tanto los componentes de origen como de destino concatenados juntos; 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 usar 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 terminar la transmisión 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 transmisión simple de archivos el siguiente ejemplo muestra cómo transmitir desde una fuente 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 la transmisión, llame a m reset() las fuentes 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 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 ha sido creado, pero no hay nada asignado ni en ejecución initialised puede haberse realizado alguna asignación y algunos recursos pueden estar reservados, pero no hay nada en ejecución connected todas las estructuras han sido creadas 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, este comienza en el estado reset después de llamar a setpipeline() , se puede avanzar por los estados usando los siguientes métodos de romediastreamer initialise() , connect() , 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() , desconectar() , 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, todavía 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 se creen primero usando componentes de destino, los cuales se describen en la siguiente sección filesimple ///filename este componente lee el archivo con nombre desde el almacenamiento local el archivo debe ser un flujo de transporte mpeg 2 (normalmente con un sufijo ts ) este componente solo se puede conectar a componentes udpsimple , rtpsimple , o memsimple el parámetro opcional bucle se puede agregar 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 como destino como origen, lee desde un archivo de flujo de transporte mpeg 2 y se puede conectar de forma más general a otros componentes este componente no simple debe utilizarse 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 key y iv para cifrado / descifrado de archivos docid\ b8aqcs l gwfrh9rttt7c el parámetro opcional loop se puede agregar 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 que se muestra 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 su salida de pantalla 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 utilizando el protocolo udp rtp\ //ip address\ port/ este componente recibe un flujo utilizando el protocolo rtp rtsp\ //ip address\ port/path este componente recibe un flujo utilizando el protocolo rtsp se puede incluir 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 utilizando el protocolo http https //ip address\ port/path este componente recibe un flujo utilizando el protocolo https gst //ip address\ port/path este componente recibe una canalización de gstreamer y genera un flujo no simple utilizándola gstsimple //ip address\ port/path este componente recibe una canalización de gstreamer y genera un flujo simple utilizándola memsimple /name/stream ts este componente lee desde un componente de flujo de memoria previamente creado (de destino) con el nombre especificado y reenvía los resultados a otros componentes simples tenga en cuenta que /stream ts se agrega 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 stream de memoria de destino creado previamente con el nombre dado; luego puede reenviar los resultados a otros componentes no simples tenga en cuenta que se agrega /stream ts para denotar "todo el búfer de memoria" suponiendo recursos suficientes, el siguiente ejemplo transcodificará y transmitirá un stream 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 el puerto especificados 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 el puerto especificados 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 usarse como un servidor multimedia 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 el puerto especificados rtp\ //ip address\ port/ este componente transmite su entrada a través de rtp a la dirección ip y el puerto especificados http ///socket=num este componente transmite su entrada a través de una conexión http este componente está diseñado para usarse como un servidor multimedia 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 stream de transporte mpeg 2 este componente acepta los parámetros opcionales key y iv para cifrado de archivos docid\ b8aqcs l gwfrh9rttt7c display \[///] este componente le permite ver lo que hay en un stream (a menudo junto con el componente decoder) y se proporciona solo para depuración brightscript utiliza principalmente los objetos rovideoplayer y roaudioplayer para reproducir contenido de streaming memsimple /name este componente funciona solo con el componente filesimple escribe su entrada en un stream de memoria docid\ ob0v0vpr y qim6acte0i denominado /name esto constituye un stream de memoria simple, lo que significa que no está indexado y no puede introducirse en una fuente mem , solo en 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 ser releído por 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 tamaño 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 proporcionada 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 duración 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 de componentes de destino las siguientes opciones se aplican a los componentes de destino udpsimple , rtpsimple , udp , y rtp maxbitrate el parámetro maxbitrate limita la tasa de bits instantánea máxima (en kbps) de un flujo por ejemplo, el siguiente componente nunca transmitiría a una velocidad superior a aproximadamente 2mbps rtp\ //ip address\ port/?maxbitrate=2000 este número requiere ajustes 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 complicado configurar tasas de bits 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 audiodelay=\[delay in ms] el desplazamiento 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 segmentos p entre segmentos i en el gop bframes=\[frames] el número de segmentos b entre segmentos p en el gop vbitrate=\[bitrate] la tasa de bits de video especificada 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 la entrada hdmi 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 codificador , que genera un flujo de transporte mpeg 2 estándar) el flujo h 264 no tiene 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 decodificador \[///] 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 ninguna no hay protección contra copia habilitada estos flujos pueden guardarse en archivos o transmitirse por 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 mediante hdcp pasa a estar autenticado mediante 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 mediante hdcp, el destino de pantalla ocultará la salida de video si un flujo que anteriormente estaba autenticado mediante 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 mediante hdcp, comenzará a mostrar video una pantalla autenticada mediante hdcp no se verá afectada en ningún caso indicadores de cifrado el nivel de cifrado puede forzarse marcándolo en el componente de origen por ejemplo, el siguiente componente de origen forzará a que cualquier pantalla conectada que reciba entrada hdmi esté autenticada mediante hdcp hdmi\ encryption=hdcp importante el estado de cifrado hdcp de un flujo no puede eliminarse configurando el parámetro encryption en none cifrado de archivos los componentes de origen y destino file /// aceptan los parámetros opcionales key e iv, que pueden utilizarse para cifrar o descifrar un archivo utilizando el algoritmo aes ctr los valores de key 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 existen restricciones sobre cómo pueden utilizarse los archivos cifrados en una canalización, pero no puede usar esta forma de cifrado en un flujo que originalmente estaba protegido mediante hdcp el siguiente ejemplo guarda un flujo hls como un archivo cifrado una vez que el archivo se escribe, puede descifrarse desde un componente de origen file /// utilizando los mismos valores de key e iv m = createobject("romediastreamer") m setpipeline("http //\<ip address>/playlist m3u8,file ///file ts?key= 30313233343536373839616263646566\&iv=30313233343536373839616263646566") m start() ejemplos de transmisión los siguientes fragmentos de código proporcionan ejemplos para 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 utilizar la forma simplificada de los componentes para las tareas de transmisión más comunes lo siguiente funcionaría de forma idéntica a la transmisión anterior, utilizando 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 utilizando 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 utilizarse para generar una entrada de streaming usando un protocolo diferente conectando un componente cliente ip a un componente servidor ip el siguiente código recibirá un stream http y luego lo 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 el stream, use lo siguiente m reset() segmentar un archivo usando hls un archivo ts existente puede segmentarse para streaming usando el protocolo hls los segmentos de archivo resultantes pueden 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 recursos del sistema, recomendamos usar las versiones simples de los componentes siempre que sea posible use las siguientes directrices para determinar si deben usarse componentes simples o no simples use componentes simples cuando transmita un archivo desde almacenamiento local usando protocolos udp, rtp o http (sin ningún proceso de codificación o transcodificación involucrado en la canalización) use componentes no simples siempre que la canalización incluya codificación, transcodificación o streaming hls cuando ingiera un stream desde una fuente remota y lo retransmita, use los componentes de destino udpsimple , rtpsimple , y httpsimple si necesita modular el stream (o retransmitir usando hls), use componentes no simples dado que un componente fuente memsimple puede leer desde un componente de destino mem , use el componente fuente memsimple junto con udpsimple , rtpsimple , o httpsimple cuando streaming de memoria docid\ ob0v0vpr y qim6acte0i el componente fuente mem solo debe usarse con el componente de destino hls (o archivo si está depurando)