Actual Combat | ¿Cómo realizar la arquitectura de corte de fotogramas de video basada en la tecnología Serverless?

Prefacio


La transmisión de video en vivo es una forma innovadora de entretenimiento en línea, con características de interacción de varias personas en tiempo real, y tiene una amplia gama de aplicaciones en muchas industrias, como comercio electrónico, juegos, educación en línea y entretenimiento. Con la mejora continua de la infraestructura de la red y la creciente demanda de entretenimiento social, la transmisión de video en vivo continúa penetrando en la vida diaria de todos y ocupando el tiempo de ocio fragmentado de los usuarios. Las capacidades de soporte técnico de la transmisión de video en vivo también están mejorando continuamente, lo que ha promovido el crecimiento del mercado de video en vivo de 21,25 mil millones de yuanes en 2014 a 54,85 ​​mil millones de yuanes en 2020, y continuará desarrollándose rápidamente a una tasa de crecimiento de alrededor del 12,8%. en los próximos cinco años.

‍‍

‍‍

Descripción general de los requisitos de corte de fotogramas de video


La industria de la transmisión en vivo está sujeta a cada vez más leyes, reglamentos y políticas. Bajo las limitaciones de las normas y procedimientos operativos generales de la industria, toda plataforma de transmisión en vivo está obligada a lidiar con el contenido ilegal de transmisión en vivo y la interacción inadecuada entre presentadores y espectadores. Tomar medidas contribuir al desarrollo más estandarizado de la industria de la transmisión en vivo. Cómo detectar el contenido ilegal en la transmisión en vivo por primera vez es un desafío común que debe enfrentar la plataforma de transmisión en vivo.El corte de fotogramas de video es una operación de rutina para satisfacer las necesidades de revisión de contenido.

El fotograma de video se puede cortar en diferentes frecuencias de acuerdo con los diferentes niveles de riesgo del video en vivo. Las imágenes guardadas se pueden cargar en plataformas de revisión de contenido de terceros o de construcción propia con fines pornográficos, políticos y publicitarios. Espere el reconocimiento de la escena. Además, algunos requisitos comerciales específicos también deben cumplirse a través de capturas de pantalla de video, como las aplicaciones de aula en línea para el análisis inteligente del estado de escucha de los estudiantes.

Análisis de la arquitectura de la tecnología de corte de fotogramas de video


La operación de corte de cuadros de la secuencia de video se puede realizar mediante el comando FFmpeg. El comando de corte de fotogramas de FFmpeg es muy simple de usar: cada vez que se toma una foto, la foto se puede cargar en el OSS de almacenamiento de objetos y la información de recorte de fotogramas correspondiente se enviará a la cola de mensajes de Kafka. De esta forma, el servicio de auditoría (que puede ser un servicio de terceros o un servicio autoconstruido) puede obtener la información de captura de tramas de Kafka y extraer la imagen correspondiente del OSS para su procesamiento. En esta arquitectura, Kafka se introduce para aliviar la carga del servicio de auditoría durante los períodos comerciales pico a través de un mecanismo de procesamiento asíncrono.

Aunque FFmpeg es fácil de usar, es una operación que requiere mucha potencia de procesamiento de la CPU. Si el flujo de video se corta a una frecuencia fija de 1 segundo, un ECS de 16 núcleos probablemente pueda asumir la tarea de cortar cuadros para 100 flujos de video al mismo tiempo. Para garantizar la estabilidad del servicio durante las horas pico de actividad, es necesario preparar un gran número de ECS para implementar servicios de corte de fotogramas de vídeo. Sin embargo, la mayoría de las aplicaciones de Internet tienen picos y valles obvios. Por ejemplo, el horario de máxima audiencia de cada noche es el pico del negocio, y el volumen de negocio después de las 24:00 mostrará una tendencia descendente significativa. Estas fluctuaciones comerciales han planteado grandes desafíos a la planificación general de los recursos. Si el servicio de interceptación de tramas se implementa de acuerdo con una escala de clúster de ECS fija, habrá dos inconvenientes muy obvios:

  1. Para soportar los picos comerciales, el tamaño del clúster debe evaluarse de acuerdo con la cantidad de usuarios durante los períodos pico, lo que provocará un gran desperdicio durante los períodos pico bajos.

  2. En algunos escenarios, como el efecto estrella, el volumen de negocios aumentará repentinamente y puede ser necesario expandir temporalmente el clúster. En este caso, la velocidad de expansión a menudo se retrasará con respecto a la tasa de crecimiento del flujo comercial, lo que dará como resultado una degradación tramitación de algunos negocios.

Para mejorar la utilización de los recursos, las aplicaciones también se pueden implementar en contenedores a través de instancias elásticas de ECS, para adaptar dinámicamente la escala del clúster a los cambios en el volumen comercial real. Sin embargo, en situaciones reales, la implementación de la estrategia de escala elástica de dicho esquema es más complicada, y la capacidad de escala elástica está relativamente retrasada, y el efecto puede no ser demasiado bueno. La razón fundamental es que en la arquitectura de servicio tradicional, una aplicación sigue ejecutándose durante mucho tiempo después de iniciada y procesará simultáneamente varios requisitos comerciales durante la operación. Independientemente de cómo cambie el volumen comercial, la potencia informática ocupada por esta aplicación aumentará. No será imprescindible. El cambio.

¿Existe una manera sencilla de obtener la potencia de cálculo correspondiente para realizar la tarea de interceptar el cuadro después de que se abre una transmisión de video en vivo y liberar automáticamente la potencia de cálculo después de que se cierra la transmisión de video? Este método no requiere que las instancias de la aplicación sean residentes permanentes, puede lograr una verdadera distribución bajo demanda de recursos informáticos y no requiere medios adicionales para ajustar dinámicamente el tamaño del clúster del servicio de interceptación de tramas. Es una solución ideal.

Como representante de la tecnología sin servidor nativa de la nube, Alibaba Cloud Function Computing FC acaba de lograr esta idea.

Arquitectura sin servidor basada en la función informática FC


Function Computing FC es un servicio informático totalmente administrado impulsado por eventos. Al utilizar la computación funcional, los usuarios no necesitan comprar y administrar infraestructura como servidores, solo escribir y cargar código. La función informática preparará automáticamente los recursos informáticos, ejecutará tareas de forma flexible y fiable y proporcionará funciones como consultas de registros, supervisión del rendimiento y alarmas. Con la ayuda del cálculo de funciones FC, puede crear rápidamente cualquier tipo de aplicaciones y servicios, y solo necesita pagar por los recursos realmente consumidos por la tarea.

El cálculo de funciones FC proporciona un modelo de cálculo basado en eventos, y la ejecución de funciones es impulsada por eventos. La ejecución de la función puede ser activada por el usuario de la función o por alguna otra fuente de eventos. Puede crear un activador en una función específica. El activador describe un conjunto de reglas. Cuando un evento cumple con estas reglas, el origen del evento activará la función correspondiente. Por ejemplo, para los desencadenantes HTTP, la solicitud HTTP de un usuario puede desencadenar una función; para los desencadenantes OSS, un archivo nuevo o modificado en OSS puede desencadenar una función. En la escena de corte de fotogramas de video, la función solo necesita activar activamente una función de corte de fotogramas a través del programa de negocios antes de que comience a enviarse cada transmisión en vivo. Por lo tanto, la arquitectura original de corte de fotogramas se puede migrar a la plataforma informática funcional con solo pequeños ajustes para disfrutar del valor de Serverless.

Implementación de tecnología de corte de fotogramas de video sin servidor



Ahora, usamos unos sencillos pasos para construir una arquitectura sin servidor basada en funciones de computación FC para cumplir con los requisitos de fotogramas de video. Function computing FC proporciona un entorno operativo nativo para múltiples lenguajes como Node.js, Python, PHP, Java, etc., especialmente lenguajes de scripting como Python, que pueden modificar directamente el código de programación en la plataforma informática funcional, que es muy fácil de usar. El código de muestra de este artículo está implementado en Python.

Por supuesto, FC de computación funcional no tiene requisitos para lenguajes de desarrollo, y cualquier lenguaje de desarrollo convencional puede tener un buen soporte. A través del Custom Runtime proporcionado por el cálculo de la función FC, se puede establecer un entorno operativo personalizado para el idioma de la tarea. Custom Runtime es esencialmente un servidor HTTP. Este servidor HTTP se hace cargo de todas las solicitudes del sistema informático de funciones, incluidas las llamadas a eventos o las llamadas a funciones HTTP.

Transmisión de video de salida

Podemos desarrollar a través de servicios de transmisión de video de terceros, pero para depurar localmente, podemos realizar la salida de transmisiones de video a través de nuestro servicio RTMP autoconstruido. La forma más sencilla es comprar un ECS e implementar Nginx para implementar el servicio RTMP. Esto requiere cargar el módulo nginx-rtmp-module. Podemos encontrar muchos tutoriales relacionados en Internet, y este artículo no los repetiremos.

Con el servicio RTMP, podemos ir a http://ffmpeg.org/ para descargar el paquete FFmpeg compilado y enviar el archivo de video local al servicio RTMP a través del comando FFmpeg. Por ejemplo, use el siguiente método:

ffmpeg -re -i test.flv -vcodec copy -acodec aac -ar 44100 -f flv rtmp://xxx.xxx.xxx.xxx:1935/stream/test

A continuación, abrimos el navegador, ingresamos la dirección de transmisión en vivo de RTMP correspondiente y luego podemos abrir el reproductor correspondiente para ver la transmisión en vivo: rtmp: //xxx.xxx.xxx.xxx: 1935 / stream / test.

Instalar Funcraft

Funcraft es una herramienta que admite la implementación de aplicaciones sin servidor y puede ayudar a los usuarios a administrar de manera conveniente recursos tales como funciones informáticas, puertas de enlace API y servicios de registro. Funcraft puede implementar el desarrollo, la construcción, la implementación y otras operaciones a través de un archivo de configuración de recursos template.yml, que puede reducir en gran medida la carga de trabajo de la configuración y la implementación cuando usamos la función informática FC para implementar la arquitectura sin servidor.

Hay tres formas de instalar Funcraft, incluida la instalación de administración de paquetes npm, la instalación de descarga binaria y la instalación del administrador de paquetes Homebrew. Para entornos donde npm no está instalado, la forma más sencilla es instalar descargando el binario. Podemos descargar el paquete de instalación de Funcraft de la plataforma correspondiente a través de https://github.com/alibaba/funcraft/releases, y luego se puede utilizar después de la descompresión. Puede verificar si el paquete Funcraft se ha instalado correctamente con el siguiente comando:

fun --version


Si se devuelve el número de versión correspondiente a Funcraft después de ejecutar el comando, como 3.6.20, significa que la instalación se realizó correctamente.

Antes de usar la diversión por primera vez, debe ejecutar fun config comandos para la configuración inicial. Esta operación debe proporcionar información general, como la identificación de la cuenta de Alibaba Cloud, la identificación de la clave de acceso, la clave de acceso secreta, el nombre de la región predeterminada, etc., que se puede obtener desde la consola informática de funciones (https: //fc.console.aliyun.com/) en la parte superior derecha de la página de inicio. Para otra información, como el tiempo de espera, utilice el valor predeterminado.

Configurar OSS

Dado que los archivos guardados después de la captura de pantalla se cargan en el OSS de almacenamiento de objetos para la copia de seguridad, debemos activar el servicio Alibaba Cloud OSS y crear el depósito correspondiente. Para operaciones específicas, podemos consultar https://www.aliyun.com/ producto / oss para completar.

Configurar SLS del servicio de registro

Log Service (Log Service) es un servicio integral para los datos de registro proporcionados por Alibaba Cloud. Para almacenar registros de funciones a través del Log Service, debe configurar elementos de registro y almacenes de registros en el servicio correspondiente a la función y otorgar el servicio acceso al servicio de registro Permisos. Los registros de funciones se imprimirán en el almacén de registros configurado y todos los registros de funciones del mismo servicio se imprimirán en el mismo almacén de registros. Puede almacenar el registro de ejecución de funciones en el servicio de registro en la nube de Alibaba y luego realizar operaciones como depuración de código, análisis de fallas y análisis de datos en función del registro de funciones almacenado en el servicio de registro.

Podemos hacer referencia a la creación del proyecto de registro y el almacén de registros (https://help.aliyun.com/document_detail/54604.html) para configurar el servicio de registro SLS. Asegúrese de que el proyecto de registro y el almacén de registros se hayan creado correctamente. Al implementar la función, es necesario utilizar el proyecto de registro y la información del almacén de registros.


Función de escritura

Ahora usamos una parte del código Python más simple para experimentar cómo usar el cálculo de funciones FC para realizar la operación de corte de marco. Para que sea más fácil de entender para los lectores, simplificamos temporalmente la lógica comercial y solo realizamos las siguientes dos acciones:

  1. Capture 1 imagen a través del comando FFmpeg;

  2. Guardar en OSS.

import json, oss2, subprocessHELLO_WORLD = b'Snapshot OK!\n'OSS_BUCKET_NAME = b'snapshot'def handler(environ, start_response):    logger = logging.getLogger()     context = environ['fc.context']    request_uri = environ['fc.request_uri']    for k, v in environ.items():        if k.startswith('HTTP_'):            pass    try:                request_body_size = int(environ.get('CONTENT_LENGTH', 0))    except (ValueError):                request_body_size = 0    #获得直播流的地址    rtmp_url = request_body.decode("UTF-8")    #通过FFmpeg命令截取一张图片    cmd = ['/code/ffmpeg', '-i', rtmp_url, '-frames:v', '1', '/tmp/snapshot.png' ]    try:        subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)    except subprocess.CalledProcessError as exc:        err_ret = {'returncode': exc.returncode, 'cmd': exc.cmd, 'output': exc.output.decode(),'stderr': exc.stderr.decode()}        print(json.dumps(err_ret))    raise Exception(context.request_id + ' transcode failure')    #上传到OSS    creds = context.credentials    auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)    bucket = oss2.Bucket(auth, 'http://oss-{}-internal.aliyuncs.com'.format(context.region), OSS_BUCKET_NAME)    logger.info('upload pictures to OSS ...')    for filename in os.listdir("/tmp"):         bucket.put_object_from_file("example/" + filename, "/tmp/" + filename)    status = '200 OK'    response_headers = [('Content-type', 'text/plain')]    start_response(status, response_headers)    return [HELLO_WORLD]


Analicemos este código. En primer lugar, además de los módulos estándar de Python, el entorno de ejecución de Python de Function Computing FC también contiene algunos módulos de uso común. De hecho, incluye oss2, que se utiliza para operar Alibaba Cloud Object Storage OSS en funciones. Por lo tanto, podemos introducir directamente el módulo oss2 en el código.

Cálculo de funciones FC integra varios tipos de activadores. Esta función de ejemplo utiliza activadores HTTP. Cada solicitud HTTP activa la ejecución de una función. Para el código Python que usa desencadenadores HTTP, la función de entrada es handlerque el parámetro de entorno lleva información sobre el cliente que llama a la función y la información de contexto. Podemos analizar la dirección de la transmisión en vivo de STMP desde el cuerpo de la solicitud HTTP y usar el comando FFmpeg para interceptar una imagen.

En este código, el programa ejecutable FFmpeg se encuentra en el /codedirectorio y se /code/ffmpegpuede ejecutar a través de la ruta. Esto se debe a que cuando implementamos la función, hemos empaquetado el programa ejecutable FFmpeg y este código en este directorio.Cuando introducimos la implementación de la función, presentaremos más a fondo cómo integrar el código de la función y el programa ejecutable. Empaquetar juntos.

En el proceso de subir los archivos de imagen guardados en el directorio / tmp a OSS, podemos obtener directamente las credenciales para acceder a OSS desde el contexto de la función, por lo que no es necesario obtener accessKey, accessSecret y otra información a través del archivo de configuración, reduciendo así la carga de trabajo.

Función de implementación

Primero, creamos un directorio de trabajo localmente y creamos un subdirectorio llamado código en este directorio, copiamos el archivo ejecutable ffmpeg del entorno Linux al codedirectorio, de modo /code/ffmpegque el comando ffmpeg pueda invocarse en el código a través de la ruta .

A continuación, inicie el trabajo más importante, cree un template.ymlarchivo en el directorio de trabajo actual , describa toda la información de implementación.

ROSTemplateFormatVersion: '2015-09-01'Transform: 'Aliyun::Serverless-2018-04-03'Resources:  #服务  snapshotService:    Type: 'Aliyun::Serverless::Service'    Properties:      Description: 'Snapshot Semo'      Policies:        - AliyunOSSFullAccess      #之前创建的日志项目和日志仓库      LogConfig:        Project: fc-bj-pro        Logstore: fc-log    #函数    snapshot:      Type: 'Aliyun::Serverless::Function'      Properties:        Handler: index.handler        Runtime: python3        MemorySize: 128        Timeout: 600        CodeUri: './code'      # HTTP触发器      Events:        http-test:          Type: HTTP          Properties:            AuthType: ANONYMOUS            Methods: ['POST']


La información de configuración es relativamente simple, primero necesitamos definir un servicio. El servicio es la unidad de gestión de recursos informáticos funcionales. Partiendo del escenario empresarial, una aplicación se puede dividir en varios servicios. A partir de la dimensión de uso de recursos, un servicio puede estar compuesto por múltiples funciones. Por ejemplo, un servicio de procesamiento de datos se divide en dos partes: preparación y procesamiento de datos. La función de preparación de datos requiere pocos recursos y puede elegir instancias de pequeño tamaño. Las funciones de procesamiento de datos requieren grandes recursos y se pueden seleccionar instancias a gran escala. Debe crear un servicio antes de crear una función. Todas las funciones del mismo servicio comparten algunas de las mismas configuraciones, como la autorización del servicio y la configuración del registro. En este código, el nombre del servicio que creamos snapshotServicetiene todos los permisos operativos en OSS y hace referencia al proyecto de registro y al almacén de registros creado anteriormente.

En la configuración de las especificaciones de la instancia de función, dado que cada instancia informática solo necesita procesar un flujo de video, elegimos la especificación más baja, que es una instancia con 128M de memoria.

A continuación, tenemos que definir una función, configurar su entorno operativo correspondiente, método de entrada, directorio de códigos, tiempo de espera y otra información, y definir un disparador HTTP para esta función. En este código, se nombra la función snapshot, el entorno operativo correspondiente es Python3 y se define un http-testdesencadenador HTTP con nombre .

En este directorio de trabajo, ejecútelo fun deploy. Si ve un mensaje server SnapshotService deploy success, significa que el código y el programa ffmpeg se han empaquetado e implementado en la nube.

En el menú de servicio y función de la consola , podemos ver la información de servicio y función cargada, e incluso ver y modificar el código de función en línea.


Función de ejecución

Dado que esta es una función de tipo HTTP, podemos usar el comando curl u otras herramientas HTTP, como Postman, para iniciar una solicitud HTTP al cálculo de la función FC para verificar el resultado de la ejecución de la operación de interceptación de tramas. Por supuesto, la consola FC de computación de funciones también proporciona una interfaz de operación visual para verificar la función, en la que se puede iniciar rápidamente una solicitud HTTP.

Si la función se ejecuta con éxito, podemos ir a la consola OSS para comprobar si la imagen capturada se ha subido correctamente. Hasta ahora, hemos construido la arquitectura de interceptación de cuadros de video sin servidor más básica, que puede interceptar una imagen del flujo de video a través del cálculo de la función de activación de solicitud HTTP y cargarla en OSS.



Corte de cuadro continuo



La operación de corte de fotogramas de una sola imagen es muy simple: después de ejecutar el comando FFmpeg, puede cargar directamente la imagen en la carpeta temporal a OSS y luego completar el ciclo de vida de la función. La captura de un solo cuadro de imagen ya puede cumplir con muchos escenarios comerciales, pero si necesita capturar cuadros continuamente a una frecuencia fija y cargar la imagen guardada en OSS en tiempo real, debe realizar algunos cambios en el código.


Configurar la cola de mensajes Kafka

Para reducir la carga de trabajo del servicio de revisión de contenido durante el período comercial pico, podemos introducir la cola de mensajes Kafka entre el servicio de corte de fotogramas y el servicio de revisión de contenido, de modo que el servicio de revisión de contenido pueda realizar de forma asincrónica las imágenes guardadas consumiendo el Los mensajes recibidos de Kafka tratan. En la arquitectura de corte de fotogramas de video, Kafka juega un papel muy importante en la transferencia de información. Cuanto mayor sea la concurrencia de la transmisión en vivo y mayor sea la frecuencia de corte de fotogramas, mayor será la presión sobre Kafka. Especialmente en el período pico de actividad, es necesario mantener estable a Kafka en trabajos de alta carga. El uso directo de la cola de mensajes de Kafka proporcionada por Alibaba Cloud puede ayudarnos a reducir en gran medida la carga de trabajo de mantenimiento de los clústeres de Kafka y utilizar la forma más sencilla de obtener Expansión dinámica Servicio Kafka de alta disponibilidad.

Podemos abrir la interfaz de activación de Kafka (https://common-buy.aliyun.com/?commodityCode=alikafka_pre®ionId=cn-hangzhou) y comprar una instancia de Kafka de la especificación correspondiente según las necesidades del escenario real. En la información básica de la consola de Kafka (https://kafka.console.aliyun.com/?spm=5176.167616.1kquk9v2l.2.6a3d5a1cqKUEUh#/InstanceList?instanceId=alikafka_post-cn-nif1osdl400w®ion seezhou0) Al punto de acceso predeterminado correspondiente a la instancia de Kafka.

A continuación, ingresamos a la interfaz de administración de Temas y creamos un Tema para el servicio de interceptación de tramas.

El punto de acceso predeterminado y el nombre del tema de la instancia de Kafka son la información que necesitamos utilizar en los siguientes pasos.

Instalar el SDK del cliente de Kafka

Antes de eso, también necesitamos pasar algunas operaciones adicionales para obtener la capacidad de la función para escribir en Kafka.

Debido a que necesitamos usar Kafka SDK, podemos instalar el módulo Kafka SDK a través de la herramienta Funcraft combinada con la herramienta de administración de paquetes Python pip:

fun install --runtime python3 --package-type pip kafka-python

Después de ejecutar el comando, aparece el siguiente mensaje:


En este punto, encontraremos que se generará una carpeta .fun en el directorio, y el paquete de dependencia que instalamos está en este directorio:


Abra el acceso a los recursos en la VPC

De forma predeterminada, la computación de funciones no puede acceder a los recursos en la VPC. Debido a que necesitamos permitir que las funciones accedan a los servicios de Kafka implementados en la VPC, necesitamos configurar manualmente las funciones de la VPC y los permisos relacionados para el servicio. Podemos hacer referencia a la función de configuración para acceder a los recursos en la VPC (https://help.aliyun.com/document_detail/72959.html) para abrir la conexión entre la función y el servicio Kafka. El principio es otorgar la tarjeta de red elástica ENI el permiso para acceder a la VPC. E inserte esta tarjeta de red elástica ENI en la instancia que ejecuta la función, para que la función pueda acceder a los recursos en su VPC.


Código

Puede utilizar el siguiente comando FFmpeg para lograr una interceptación de fotogramas continua y frecuente como se especifica:

ffmpeg -i rtmp://xxx.xxx.xxx.xxx:1935/stream/test -r 1 -strftime 1 /tmp/snapshot/%Y%m%d%H%M%S.jpg

En el proceso de ejecución del comando, el proceso actual del programa Python esperará el final de la transmisión de video, por lo que necesitamos modificar el código de función para comenzar un nuevo proceso de escaneo. El proceso de escaneo revisa constantemente el catálogo de imágenes, una vez que encuentra que se genera una nueva imagen, la carga en OSS, envía la información del marco interceptado a Kafka y finalmente borra la imagen del catálogo de imágenes.

import logging, json, oss2, subprocessfrom multiprocessing import Processfrom kafka import KafkaProducerHELLO_WORLD = b'Snapshot OK!\n'OSS_BUCKET_NAME = b'snapshot'logger = logging.getLogger()output_dir = '/tmp/shapshot'# 扫描图片目录def scan(bucket, producer):    flag = 1    while flag:        for filename in os.listdir(output_dir):            if filename == 'over':                # ffmpeg命令完成,准备停止扫描                flag = 0                continue            logger.info("found image: %s", snapshotFile)            try:                 full_path = os.path.join(output_dir, filename)                # 上传到OSS                bucket.put_object_from_file("snapshot/" + filename, full_path)                # 发送到Kafka                producer.send('snapshot', filename.encode('utf-8'))                # 删除图片                os.remove(full_path)            except Exception as e:                logger.error("got exception: %s for %s", e.message, filename)        time.sleep(1)def handler(environ, start_response):    logger = logging.getLogger()     context = environ['fc.context']    #创建图片输出文件夹    if not os.path.exists(output_dir):        os.mkdir(output_dir)    #解析HTTP请求,获得直播流的地址    request_uri = environ['fc.request_uri']    for k, v in environ.items():        if k.startswith('HTTP_'):            pass    try:                request_body_size = int(environ.get('CONTENT_LENGTH', 0))    except (ValueError):                request_body_size = 0    rtmp_url = request_body.decode("UTF-8")    #启动Kafka Producer    producer = KafkaProducer(bootstrap_servers='XX.XX.XX.XX:9092,XX.XX.XX.XX:9092')    #启动OSS Bucket    creds = context.credentials    auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)    bucket = oss2.Bucket(auth, 'http://oss-{}-internal.aliyuncs.com'.format(context.region), OSS_BUCKET_NAME)    #启动扫描进程    scan_process = Process(target=scan, args=(bucket, producer))    #通过FFmpeg命令按每秒1帧的频繁连续截帧    cmd = ["/code/ffmpeg", "-y", "-i", rtmp_url, "-f", "image2", "-r", "1",        "-strftime", "1", os.path.join(output_dir, "%Y%m%d%H%M%S.jpg")]    try:        subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)    except subprocess.CalledProcessError as exc:        err_ret = {'returncode': exc.returncode, 'cmd': exc.cmd, 'output': exc.output.decode(),'stderr': exc.stderr.decode()}        logger.error(json.dumps(err_ret))    raise Exception(context.request_id + ' transcode failure')    #写入标志文件,子进程结束工作    os.system("touch %s" % os.path.join(output_dir, 'over'))    scan_process.join()    producer.close()    status = '200 OK'    response_headers = [('Content-type', 'text/plain')]    start_response(status, response_headers)    return [HELLO_WORLD]


Para permitir que el proceso hijo salga normalmente después de que se ejecute el comando FFmpeg, escribimos un archivo de marca en el directorio de imágenes, el flujo de video del código termina normalmente y no se generan nuevas imágenes, por lo que el proceso hijo puede detener el bucle. De esta manera, podemos activar una nueva función para que se ejecute cuando comience la transmisión de video. A medida que la transmisión de video continúa reproduciéndose, la función cargará continuamente las imágenes generadas por la interceptación al OSS. Cuando finalice la transmisión de video, la vida útil de la función El ciclo ha terminado.

mayor optimización


Videoclip largo

La instancia flexible predeterminada del cálculo de la función FC es 600 segundos, que es el límite superior del tiempo de ejecución de la función de 10 minutos. Es decir, después de que se activa una función, si la tarea de cálculo no se completa durante 10 minutos, salir automáticamente. Esta restricción afectará la operación de corte de fotogramas de secuencias de video con un tiempo de reproducción de más de 10 minutos. Los videos largos son muy comunes. ¿Cómo eludir esta restricción y cortar fotogramas para videos largos? Lo podemos solucionar a través de las siguientes tres soluciones:

  1. Cada función solo corta 1 fotograma: cuando la frecuencia de corte de fotogramas es relativamente baja, o cuando el flujo de video solo necesita cortarse en algunos puntos específicos en el tiempo, no necesitamos mantener el ciclo de vida de la función y la reproducción ciclo de la secuencia de video Consistente, cada función solo puede capturar un solo cuadro de imágenes después de iniciarse. A través del programa de disparo personalizado, puede iniciar la función en el momento necesario, o puede utilizar el flujo de trabajo sin servidor para organizar funciones más complejas. Para obtener más información sobre el flujo de trabajo sin servidor, consulte https: //www.aliyun. com / product / fnf.

  2. Completado por relés de múltiples funciones: el cálculo de funciones FC tiene un módulo fc2 incorporado, que se puede usar para llamadas mutuas entre funciones. De esta manera, podemos controlar el tiempo de ejecución de cada función de corte de cuadros en 10 minutos, por ejemplo, 8 minutos es un período de ejecución fijo. Antes del final de una función, inicie otro relé de función para completar la tarea de cortar fotogramas hasta el final de la secuencia de video. Esta solución es muy adecuada para escenarios donde la precisión de la frecuencia de corte de fotogramas no es particularmente alta, porque cuando se entregan las dos funciones, habrá un tiempo de aproximadamente un segundo, y la precisión de la frecuencia de corte de fotogramas no puede ser estrictamente garantizado.

  3. Utilice instancias de rendimiento: además de las instancias elásticas predeterminadas, Function Compute FC también proporciona instancias de rendimiento. La fortaleza del rendimiento pertenece a instancias a gran escala, con límites de recursos más altos, más escenarios de adaptación y la capacidad de superar el tiempo de ejecución de 10 minutos. límite. La velocidad de expansión de las instancias de rendimiento es lenta y la escalabilidad elástica no es tan buena como la de las instancias elásticas, pero podemos usar la concurrencia múltiple de una sola instancia (https://help.aliyun.com/document_detail/144586.html) y el modo de reserva ( https: // help. aliyun.com/document_detail/138103.html) para mejorar la flexibilidad de las instancias de rendimiento. Para obtener una introducción específica, consulte Modo de reserva y simultaneidad múltiple de instancia única.

Optimización de costos

La computación funcional proporciona una gran cantidad de modelos de medición, precios competitivos e indicadores detallados de uso de recursos, combinados con la arquitectura centrada en aplicaciones de Serverless, lo que hace que la administración de recursos sea más conveniente que nunca y puede obtener un rendimiento altamente competitivo en diferentes escenarios.

Según la diferencia en las especificaciones de recursos y los requisitos de flexibilidad, el cálculo de la función proporciona dos modos de medición: prepago (suscripción anual y mensual) y pospago (pago por uso). En circunstancias normales, solo necesita usar el modelo de pago por uso, solo debe pagar por los recursos informáticos de la función realmente utilizados y no necesita comprar recursos por adelantado. Sin embargo, los usuarios pueden elegir de manera flexible el modo prepago para ahorrar costos de uso de acuerdo con el uso diario real de recursos. El modelo de prepago significa que el usuario compra una cierta cantidad de potencia de cálculo por adelantado. Durante el ciclo de vida de la potencia de cálculo precomprada, los recursos consumidos cuando la función está en ejecución se pueden deducir cada segundo. El precio unitario del modelo de prepago nunca es menor que el del modelo pospago.

En la página del Centro de recursos de Function Computing Console, puede ver el uso real de los recursos de la cuenta corriente de un vistazo, incluida la parte estable y flexible del uso de recursos. A través de esta información, los recursos de prepago y pospago se pueden asignar razonablemente. En el gráfico de detalles de uso de recursos, la curva verde representa el uso de recursos diario real y la línea recta amarilla representa el uso que puede deducirse de los recursos de prepago. Podemos aumentar adecuadamente la proporción de recursos de prepago de acuerdo con la situación real para hacer más El uso de recursos está cubierto por recursos prepagos, lo que reduce los costos de recursos para la clasificación.



para resumir


En la escena del corte de fotogramas de video, el valor de la tecnología sin servidor es muy obvio. El innovador motor de programación de instancias de la computación funcional maximiza las ventajas de la computación en la nube en términos de eficiencia, rendimiento, costo y apertura.

A partir de febrero de 2021, más de 5 grandes empresas de Internet han comenzado a implementar la captura de video basada en la función de computación FC. Bajo diferentes requisitos de captura de cuadros, pueden ahorrar al menos un 20% del costo de uso en comparación con el servicio de implementación tradicional basado en ECS. Puede reducir en gran medida la carga de trabajo del mantenimiento del sistema. En términos de migración y transformación, pueden completar todos los procesos de investigación previa, desarrollo, depuración, pruebas y lanzamiento en una semana, y comenzar a disfrutar de los enormes dividendos que brinda la tecnología sin servidor en la era de la computación en la nube.

En el campo del procesamiento de audio y video, la arquitectura de tecnología sin servidor basada en la computación funcional FC tiene escenarios de aplicaciones más ricos. Puede unirse a Dingding Group 5712134 para intercambiar experiencias prácticas sin servidor y explorar más prácticas de aplicaciones sin servidor en la era nativa de la nube.

IQiyi Sports: experimente la máxima expansión y contracción de Serverless y aumente la utilización de recursos en un 40%

Práctica de construcción del sistema de mensajería en línea de Kuaishou basada en RocketMQ

Zhang Lei, un nuevo miembro de Alibaba CNCF TOC: ¿Por qué la "nube nativa" es tan atractiva para el ecosistema de la computación en nube?

Haga clic en uno para ver, dejar que más personas vean

Supongo que te gusta

Origin blog.csdn.net/weixin_39860915/article/details/114109263
Recomendado
Clasificación