View a markdown version of this page

Geração automatizada de imagens em tempo real - Amazon Kinesis Video Streams

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Geração automatizada de imagens em tempo real

O Amazon Kinesis Video Streams oferece a capacidade de transcodificar e entregar imagens. O Kinesis Video Streams extrai automaticamente imagens dos dados de vídeo em tempo real e entrega as imagens para o bucket especificado do Amazon S3. A implementação da extração automatizada de imagens em tempo real envolve as seguintes etapas:

  • Criação de um bucket do S3 para receber as imagens geradas.

  • Configurar a propriedade ImageGenerationConfiguration stream que informa ao Kinesis Video Streams como criar as imagens e para onde enviá-las.

  • Adicionar tags de geração de imagem — O Kinesis Video Streams só gera imagens usando fragmentos que têm a tag de geração de imagem. Essas tags são adicionadas ao fazer o upload do vídeo usando o SDK do Kinesis Video Streams Producer junto com o método. putKinesisVideoEventMetadata

Os procedimentos a seguir fornecem instruções para concluir cada uma dessas etapas.

Se você estiver usando uma chave gerenciada pelo cliente, certifique-se de que a função que executa as PutMedia chamadas (carregador) tenha as seguintes permissões necessárias para criptografar e descriptografar dados e para acessar o bucket do Amazon S3.

  • kms:Encrypt

  • kms:GenerateDataKey

  • kms:Decrypt

  • s3:PutObject

Para obter mais informações, consulte Como começo a usar a criptografia no lado do servidor?.

Para configurar o destino das imagens geradas
  1. Crie um bucket de destino do S3 para o qual as imagens serão enviadas.

    Siga o Guia do usuário do Amazon S3 para criar um bucket do Amazon S3.

    Observe o URI do bucket, que você precisará na próxima etapa ao atualizar a configuração de geração de imagem do stream.

  2. Verifique se você tem o AWS CLI instalado e configurado. Para obter mais informações, consulte o Guia AWS Command Line Interface do usuário da versão 2.

  3. Crie um novo arquivo chamado update-image-generation-input.json com o seguinte conteúdo como entrada. Atualize os valores do espaço reservado com os valores que você deseja usar. Para ver os valores máximos e mínimos suportados, consulte a UpdateImageGenerationConfiguration API.

    { "StreamName": "demo-stream", "ImageGenerationConfiguration": { "Status": "ENABLED", "DestinationConfig": { "DestinationRegion": "us-east-1", "Uri": "s3://my-bucket-name" }, "SamplingInterval": 200, "ImageSelectorType": "PRODUCER_TIMESTAMP", "Format": "JPEG", "FormatConfig": { "JPEGQuality": "80" }, "WidthPixels": 320, "HeightPixels": 240 } }
  4. Atualize a configuração de geração de imagem do stream usando a UpdateImageGenerationConfiguration API e anexando o arquivo JSON como entrada, conforme mostrado no comando a seguir. Observe que o caminho do arquivo aponta para o arquivo no diretório atual.

    aws kinesisvideo update-image-generation-configuration \ --cli-input-json file://./update-image-generation-input.json
  5. Após o sucesso, uma resposta vazia é retornada e nada é impresso em seu terminal.

    nota

    Leva pelo menos 1 minuto para iniciar o fluxo de trabalho de geração de imagens depois de atualizar a configuração de geração de imagens. Espere pelo menos 1 minuto antes de enviar o vídeo para seu stream.

  6. Verifique as configurações. Use o AWS CLI para chamar a DescribeImageGenerationConfiguration API do seu stream.

    aws kinesisvideo describe-image-generation-configuration \ --stream-name "demo-stream"

O Kinesis Video Streams só gerará e fornecerá imagens para fragmentos que tenham a tag de geração de imagem. Todos os metadados adicionais de fragmentos fornecidos junto com as tags de geração de imagens do Amazon S3 serão salvos como metadados do Amazon S3.

nota

As tags de geração de imagem se referem a tags de metadados de fragmentos e não a tags de nível de stream.

Importante

As tags de geração de imagens contam para o limite de tags de metadados de fragmentos. Para obter mais informações, consulte Cotas do serviço de metadados de streaming.

Veja a seguir um exemplo de como é a estrutura das tags de metadados do fragmento usando o mkvinfo utilitário. A tag de geração de imagem é uma tag simples MKV com uma chave de AWS_KINESISVIDEO_IMAGE_GENERATION e sem valor. Para obter mais informações, consulte Exemplo de tags de vídeo na documentação da Matroska.

|+ Tags | + Tag | // MANDATORY: Predefined MKV tag to trigger image generation for the fragment | + Simple | + Name: AWS_KINESISVIDEO_IMAGE_GENERATION | // OPTIONAL: S3 prefix which will be set as prefix for generated image. | + Simple | + Name: AWS_KINESISVIDEO_IMAGE_PREFIX | + String: image_prefix_in_s3 // 256 bytes max | // OPTIONAL: Key value pairs that will be persisted as S3 Image object metadata. | + Simple | + Name: CUSTOM_KEY_1 // Max 128 bytes | + String: CUSTOM_VALUE_1 // Max 256 bytes | + Simple | + Name: CUSTOM_KEY_2 // Max 128 bytes | + String: CUSTOM_VALUE_2 // Max 256 bytes

Adicionar tags de geração de imagem aos fragmentos

O Kinesis Video Streams gera e entrega imagens somente para fragmentos que têm a tag de geração de imagem. O Kinesis Video Streams reconhece essas tags MKV especiais e inicia o fluxo de trabalho de geração de imagens com base na configuração de processamento de imagem do stream.

Ao usar o SDK do Kinesis Video Streams Producer para fazer upload de mídia, você usa o putKinesisVideoEventMetadata método para adicionar a tag de geração de imagem a cada fragmento que você deseja marcar. Um novo fragmento começa quando putFrame é chamado com uma moldura contendo a keyframe bandeira.

Se você estiver enviando um vídeo pré-gravado, ele poderá ser carregado em uma taxa diferente da taxa em que foi gravado, dependendo da velocidade da sua rede. Recomendamos que você use o timestamp do Producer para configurar a geração de imagens se quiser gerar imagens em intervalos regulares com base nos timestamps originais do vídeo, e não use os timestamps do servidor gerados com base na taxa na qual o Amazon Kinesis Video Streams recebeu seu vídeo.

Para ver um exemplo completo desse código, veja o exemplo VideoOnlyRealtimeStreamingSample de código em GitHub.

// Setup sample frame MEMSET(frameBuffer, 0x00, frameSize); frame.frameData = frameBuffer; frame.version = FRAME_CURRENT_VERSION; frame.trackId = DEFAULT_VIDEO_TRACK_ID; frame.duration = HUNDREDS_OF_NANOS_IN_A_SECOND / DEFAULT_FPS_VALUE; frame.decodingTs = defaultGetTime(); // current time frame.presentationTs = frame.decodingTs; Frame eofr = EOFR_FRAME_INITIALIZER; while(defaultGetTime() > streamStopTime) { frame.index = frameIndex; frame.flags = fileIndex % DEFAULT_KEY_FRAME_INTERVAL == 0 ? FRAME_FLAG_KEY_FRAME : FRAME_FLAG_NONE; frame.size = SIZEOF(frameBuffer); CHK_STATUS(readFrameData(&frame, frameFilePath)); // 1. End the previous fragment if (frame.flags == FRAME_FLAG_KEY_FRAME && !firstFrame) { putKinesisVideoFrame(streamHandle, &eofr); } // 2. putFrame call CHK_STATUS(putKinesisVideoFrame(streamHandle, &frame)); if (frame.flags == FRAME_FLAG_KEY_FRAME) { // 3. Adding the image generation tag CHK_STATUS(putKinesisVideoEventMetadata(streamHandle, STREAM_EVENT_TYPE_IMAGE_GENERATION, NULL);) // 4. Adding fragment metadata for (n = 1; n <= 5; n++) { SNPRINTF(metadataKey, METADATA_MAX_KEY_LENGTH, "SAMPLE_KEY_%d", n); SNPRINTF(metadataValue, METADATA_MAX_VALUE_LENGTH, "SAMPLE_VALUE_%d", frame.index + n); CHK_STATUS(putKinesisVideoFragmentMetadata(streamHandle, metadataKey, metadataValue, FALSE)); } } defaultThreadSleep(frame.duration); frame.decodingTs += frame.duration; frame.presentationTs = frame.decodingTs; frameIndex++; fileIndex++; fileIndex = fileIndex % NUMBER_OF_FRAME_FILES; firstFrame = TRUE; } // 5. End the final fragment putKinesisVideoFrame(streamHandle, &eofr);

Os elementos do código de exemplo para configurar quadros de amostra são explicados da seguinte forma:

  1. Cada fragmento precisa terminar com o final do fragmento ()eofr. Essa declaração diz que sempre que um novo quadro-chave for recebido, o que sinaliza o início do próximo quadro, coloque um eofr antes de adicionar o próximo quadro ao fluxo.

  2. Coloque o quadro atual no fluxo.

  3. Adicione a tag de geração de imagem. O putKinesisVideoEventMetadata método pode ser chamado a qualquer momento após a putFrame(keyFrame) chamada e antes daputFrame(eofr). Ele só deve ser chamado no máximo uma vez por fragmento. Como cada fragmento terá apenas um quadro-chave, nós o chamamos neste momento para simplificar. O valor de retorno de putKinesisVideoEventMetadata é verificado quanto a um código de sucesso (0).

  4. Adicione outros metadados de fragmentos personalizados, que o Kinesis Video Streams transformará em metadados de objetos do Amazon S3.

  5. Encerre o fragmento final nesta sessão de upload.

Usando as amostras para adicionar tags de geração de imagem

Você pode usar o kvs_gstreamer_audio_video_sample no C++ Producer SDK se quiser uma opção de linha de comando para adicionar tags de geração de imagem. Ative esse recurso adicionando o -e both argumento -e image ou, conforme mostrado no exemplo a seguir.

./kvs_gstreamer_audio_video_sample stream-name \ -f video-to-upload.mp4 \ -e both

Para obter mais informações sobre esse aplicativo de amostra, consulte o Amazon Kinesis Video Streams CPP Producer, o GStreamer Plugin e o JNI README em. GitHub

Caminho do objeto do Amazon S3 (imagem)

O caminho do objeto do S3 descreve a localização no bucket configurado do S3 em que a imagem gerada será entregue. Ele usa o seguinte formato:

ImagePrefix_AccountID_StreamName_ImageTimecode_RandomID.file-extension

Os elementos do caminho do objeto são definidos da seguinte forma:

  • ImagePrefix- Valor de AWS_KINESISVIDEO_IMAGE_PREFIX se presente.

  • AccountID- O Conta da AWS ID sob o qual o stream é criado.

  • StreamName- Nome do fluxo a partir do qual a imagem é gerada.

  • ImageTimecode- Código de tempo da época (em milissegundos) no fragmento no qual a imagem é gerada.

  • RandomID- GUID aleatório.

  • file-extension- JPG ou PNG com base no formato de imagem solicitado.

Neste exemplo, o caminho do objeto para as imagens geradas terá a seguinte aparência:

111122223333_demo-stream_16907729324_f20f9add-75e7-4399-a30f-fc7aefb1bab7.jpg

Recuperando metadados de imagem

Você pode usar o console do S3 ou a CLI para recuperar os metadados das imagens geradas.

O Kinesis Video Streams define o número do fragmento, a data e hora do produtor e do servidor e os metadados do tipo de conteúdo da imagem gerada, todos formatados como metadados do objeto Amazon S3. Se alguma tag MKV adicional estiver presente, essas tags também serão adicionadas como metadados de objetos do Amazon S3. O exemplo a seguir mostra como usar o comando da API head-object do Amazon S3 para recuperar os metadados do objeto. A resposta inclui os metadados criados pelo Kinesis Video Streams.

aws s3api head-object --bucket my-bucket-name --key 111122223333_demo-stream_1690707290324_f20f9add-7e57-4399-a30f-fc7aefb1bab7.jpg { "AcceptRanges": "bytes", "LastModified": "2023-07-30T08:54:51+00:00", "ContentLength": 22693, "ETag": "\"63e03cb6d57f77e2db984c1d344b1083\"", "ContentType": "image/jpeg", "ServerSideEncryption": "AES256", "Metadata": { "aws_kinesisvideo_producer_timestamp": "1690707290324", "aws_kinesisvideo_server_timestamp": "1690707289209", "aws_kinesisvideo_fragment_number": "91343852333182036507421233921329142742245756394" } }

Para obter mais informações sobre metadados de objetos do S3, consulte. https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html

Recomendações de URI do Amazon S3 para proteção contra limitação

Se você gravar milhares de imagens no Amazon S3, há o risco de limitação. Para obter mais informações, consulte Limites de solicitação de venda de prefixo do S3.

Um prefixo do Amazon S3 começa com um limite de PUT de 3.500 solicitações PUT por segundo e aumentará gradualmente ao longo do tempo para prefixos exclusivos. Evite usar datas e horas como prefixos do Amazon S3. Os dados codificados por tempo afetarão um prefixo por vez e também serão alterados regularmente, invalidando os aumentos de prefixo anteriores.

Para permitir uma escalabilidade mais rápida e consistente do Amazon S3, recomendamos adicionar um prefixo aleatório, como um código hexadecimal ou UUID, ao URI de destino do Amazon S3. Por exemplo, os prefixos de código hexadecimal naturalmente dividirão suas solicitações aleatoriamente entre 16 prefixos diferentes (um prefixo para cada caractere hexadecimal exclusivo), o que permitirá 56.000 solicitações PUT por segundo após o Amazon S3 ter sido escalado automaticamente.