Transmisión de memoria
11 min
como se describió anteriormente, el objeto romediastreamer proporciona un medio para especificar una única canalización flexible de procesamiento multimedia sin embargo, la canalización está limitada a tener una sola entrada y una sola salida la función transmisión de memoria agrega un medio para bifurcar el flujo de datos de modo que se puedan crear múltiples salidas y realizar más de un hilo de procesamiento tenga en cuenta que el memory streaming es especialmente importante al servir medios codificados en vivo, como hdmi ® input el memory streaming garantiza que solo se necesite un único codificador para distribuir un flujo codificado en vivo a múltiples clientes http unicast múltiple para transmitir un flujo fuente mediante unicast a múltiples clientes, envíe la fuente (en este caso, hdmi input codificada) a un flujo de memoria m = createobject("romediastreamer") m setpipeline("hdmi , encoder , mem /livehdmi") m start() ahora, una gran cantidad de clientes puede recibir el mismo flujo denominado "livehdmi" (el nombre es arbitrario, pero no debe entrar en conflicto con ningún otro flujo de memoria) cuando un cliente accede a la siguiente url, el código del servidor multimedia http crea una instancia independiente de romediaserver que lee desde la fuente mem /livehdmi/stream ts y la reenvía al socket http http //ip address\ port/mem /livehdmi/stream ts tenga en cuenta que /stream ts debe agregarse al nombre del flujo de memoria para indicar que se debe utilizar el flujo completo en la instancia anterior, el código del media streamer creará realmente el componente fuente memsimple /livehdmi/stream ts porque utiliza menos recursos y es más eficiente una vez que se ha creado el flujo de memoria, también puede transmitirse simultáneamente mediante multicast utilizando otra instancia de media streamer m1 = createobject("romediastreamer") m1 setpipeline("memsimple /livehdmi/stream ts,rtpsimple //239 192 0 0 5004/") m1 start() mem y memsimple al igual que con ciertos otros componentes, existe una versión "simple" y una "no simple" del memory streaming la versión simple ( memsimple ) solo puede utilizarse en una canalización con otros componentes simples, aunque los flujos de memoria simples pueden leer de flujos de memoria no simples mem (como se muestra arriba, donde el componente memsimple /livehdmi lee del componente mem /livehdmi ) sin embargo, lo contrario no es posible el componente fuente mem no puede utilizarse para leer desde un flujo de memoria que se creó con el componente de destino memsimple debido a que los flujos de memoria simples no están indexados, no pueden admitir operaciones de transmisión hls downstream (otros componentes no recibirán información sobre los segmentos hls) como ocurre con otros componentes "simple", los flujos de memoria simples deben utilizarse siempre que sea posible porque consumen menos recursos hls unicast múltiple el unicast múltiple hls funciona de manera similar al ejemplo de multicast http proporcionado anteriormente, pero con una excepción los filtros de indexación de flujo solo funcionan en flujos leídos en el procesador de flujos de transporte, no en flujos leídos en el codificador (ambos manejados por el componente mem ) como resultado, los flujos codificados como hdmi input deben pasarse al componente mem dos veces antes de que puedan transmitirse mediante multicast esto se logra fácilmente utilizando dos llamadas a setpipeline() m = createobject("romediastreamer") m1 = createobject("romediastreamer") m setpipeline("hdmi ,encoder ,mem /hdmi unindexed?size=5") m1 setpipeline("mem /hdmi unindexed/stream ts ,mem /hdmi indexed?size=30\&duration=5") m start() m1 start() tenga en cuenta que debe especificarse un búfer de memoria más grande (30 mb en esta instancia) para el segundo componente mem porque debe contener al menos cinco segmentos completos de 5 segundos en todo momento los clientes generalmente requieren 5 segmentos completos en todo momento para los flujos hls, por lo que a menudo necesitarán esperar al menos 25 segundos antes de que el flujo pueda reproducirse correctamente los clientes pueden acceder a los flujos hls utilizando la siguiente url http //ip address\ port/mem /hdmi indexed/index m3u8 al igual que el multicast http, el media streamer generará instancias adicionales de romediastreamer para cada cliente que se conecte además de los clientes hls, los clientes http y rtsp también pueden conectarse al flujo indexado utilizando las siguientes url http http //ip address\ port/mem /hdmi indexed/stream ts rtsp rtsp\ //ip address\ port/mem /hdmi indexed/stream ts el flujo indexado también puede transmitirse mediante multicast por otra instancia de romediastreamer acceder a un flujo de memoria indexado como se muestra en ejemplos anteriores, agregar stream ts al identificador del flujo de memoria denota el búfer completo, mientras que agregar index m3u8 a un flujo indexado (hls) denota el archivo de índice completo de forma similar, agregar el nombre de un segmento listado en el archivo de índice accederá a ese segmento durante el tiempo de vida de dicho segmento en el búfer del flujo de memoria por ejemplo, si el archivo de índice lista un segmento llamado 000179 ts como disponible en el componente mem /componente de transmisión en vivo , entonces el siguiente componente de origen puede utilizarse para recuperar ese segmento mem /livestream/000179 ts el componente memsimple también puede utilizarse para recuperar el segmento ritmo del flujo de memoria el flujo de datos hacia el flujo de memoria siempre se sincroniza en tiempo real para dar tiempo a los clientes de lectura a mantenerse al día una instancia de romediastreamer que está escribiendo nunca esperará a ninguno de los clientes de lectura; si algún cliente se queda demasiado atrás (lo cual se detecta cuando el extremo de escritura del fifo sobrepasa el extremo de lectura del cliente), el cliente abortará y emitirá un mensaje event eos error debido a esta limitación, es importante tener en cuenta lo siguiente si un flujo de memoria se utiliza para solucionar el hecho de que los datos no pueden pasarse directamente de un codificador a un decodificador (como en el siguiente ejemplo), entonces el procesamiento no puede realizarse más rápido que en tiempo real ejemplo m1 = createobject("romediastreamer") m2 = createobject("romediastreamer") m1 setpipeline("hdmi ,encoder ,mem /hdmi") m2 setpipeline("mem /hdmi/stream ts,decoder ,file ///file ts") m1 start() m2 start() estados del flujo de memoria un flujo de memoria solo se crea cuando el media streamer que lo nombra como destino está al menos en el estado connected esto significa que es posible conectar el pipeline (usando connect() ) que crea el flujo de memoria pero no iniciarlo se puede crear cualquier cantidad de media streamers que lean desde un flujo de memoria (e incluso iniciarlos) antes de que el media streamer original se inicie, comenzando el flujo de datos hacia el flujo de memoria consulte máquina de estados de media streamer docid\ b8aqcs l gwfrh9rttt7c para obtener más información sobre los estados de romediastreamer cifrado y protección contra copia en términos generales, una instancia de romediastreamer que lee desde un flujo de memoria adoptará el mismo cifrado/protección contra copia que la instancia asociada de romediastreamer que está escribiendo en él las reglas específicas son las siguientes escritor simple un destino memsimple no puede marcarse como que requiere protección (ni puede recibir dicho flujo) lector simple un origen memsimple solo leerá desde un flujo de memoria que se marcó como no cifrado (sin requerir protección) cuando se creó escritor no simple un destino mem se marcará como que requiere protección cuando se cree de acuerdo con el origen del pipeline si un flujo pasa a estar protegido más adelante, continuará funcionando si inicialmente se marcó como que requiere protección (opcionalmente con el parámetro cifrar ), de lo contrario se detendrá lector no simple un origen mem hereda el estado de protección de su escritor asociado y, por lo tanto, su salida finalmente requerirá protección hdcp o dtcp si el origen se marcó de manera similar