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á.
Escreva e examine o código
Nesta seção doUse a biblioteca de produtores de C++, você examina o código no equipamento de teste C++ (tst/ProducerTestFixture.h
e em outros arquivos). Você fez download desse código na seção anterior.
O exemplo de C ++ Platform Independent mostra o seguinte padrão de codificação:
-
Crie uma instância de
KinesisVideoProducer
para acessar o Kinesis Video Streams. -
Crie uma instância de
KinesisVideoStream
. Isso cria um stream de vídeo do Kinesis em seu Conta da AWS caso ainda não exista um stream com o mesmo nome. -
Chame
putFrame
emKinesisVideoStream
para cada quadro de dados (à medida que ele se tornar disponível) para enviá-lo ao streaming.
As seções a seguir fornecem mais informações sobre esse padrão de codificação.
Crie uma instância de KinesisVideoProducer
Você cria um objeto KinesisVideoProducer
chamando o método KinesisVideoProducer::createSync
. O exemplo a seguir cria KinesisVideoProducer
no arquivo ProducerTestFixture.h
:
kinesis_video_producer_ = KinesisVideoProducer::createSync(move(device_provider_), move(client_callback_provider_), move(stream_callback_provider_), move(credential_provider_), defaultRegion_);
O método createSync
usa os seguintes parâmetros:
-
Um objeto
DeviceInfoProvider
, que retorna um objetoDeviceInfo
contendo informações sobre o dispositivo ou a configuração de armazenamento.nota
Você deve configurar o tamanho do armazenamento de conteúdo usando o parâmetro
deviceInfo.storageInfo.storageSize
. Seus streamings de conteúdo compartilham o armazenamento de conteúdo. Para determinar o requisito de tamanho do storage, multiplique o tamanho médio do quadro pelo número de quadros armazenados para a duração máxima de todos os streamings. Em seguida, multiplique por 1,2 para considerar a desfragmentação. Por exemplo, suponha que o aplicativo tem a seguinte configuração:-
Três streamings
-
3 minutos de duração máxima
-
Cada stream tem 30 quadros por segundo (FPS)
-
Cada quadro tem 10.000 KB de tamanho
O requisito de armazenamento de conteúdo para esse aplicativo é 3 (streams) * 3 (minutos) * 60 (segundos em um minuto) * 10000 (kb) * 1,2 (permissão de desfragmentação) = 194,4 Mb ~ 200 Mb.
-
-
Um objeto
ClientCallbackProvider
, que retorna ponteiros de função que relatam eventos específicos do cliente. -
Um objeto
StreamCallbackProvider
, que retorna ponteiros de função que são chamados de volta quando ocorrem eventos específicos de streaming. -
Um
CredentialProvider
objeto que fornece acesso às variáveis de ambiente de AWS credenciais. -
O Região da AWS (“us-west-2"). O endpoint de serviço é determinado a partir da região.
Crie uma instância de KinesisVideoStream
Você cria um objeto KinesisVideoStream
chamando o método KinesisVideoProducer::CreateStream
com um parâmetro StreamDefinition
. O exemplo cria o KinesisVideoStream
no arquivo ProducerTestFixture.h
com o tipo de trilha como vídeo e com o ID da trilha como 1:
auto stream_definition = make_unique<StreamDefinition>(stream_name, hours(2), tags, "", STREAMING_TYPE_REALTIME, "video/h264", milliseconds::zero(), seconds(2), milliseconds(1), true, true, true); return kinesis_video_producer_->createStream(move(stream_definition));
O objeto StreamDefinition
tem os seguintes campos:
-
Nome do stream.
-
Período de retenção de dados.
-
Tags do streaming. Essas tags podem ser usadas por aplicativos de consumo para encontrar o streaming correto ou obter mais informações sobre o streaming. As tags também podem ser visualizadas no AWS Management Console.
-
AWS KMS chave de criptografia para o stream. Para obter mais informações, consulte Proteção de dados no Kinesis Video Streams.
-
Tipo de streaming. Atualmente, o único valor válido é
STREAMING_TYPE_REALTIME
. -
Tipo de conteúdo de mídia.
-
Latência de mídia. Esse valor não é usado atualmente e deve ser definido como 0.
-
Duração da reprodução de cada fragmento.
-
Escala de código de hora da mídia.
-
Se a mídia usa ou não fragmentação de keyframe.
-
Se a mídia usa ou não códigos de hora.
-
Se a mídia usa ou não horas absolutas de fragmento.
Adicionar uma faixa de áudio ao stream de vídeo do Kinesis
Você pode adicionar detalhes da faixa de áudio a uma definição de fluxo de faixa de vídeo usando o addTrack
método doStreamDefinition
:
stream_definition->addTrack(DEFAULT_AUDIO_TRACKID, DEFAULT_AUDIO_TRACK_NAME, DEFAULT_AUDIO_CODEC_ID, MKV_TRACK_INFO_TYPE_AUDIO);
O addTrack
método requer os seguintes parâmetros:
-
ID da faixa (como uma para áudio). Esse valor deve ser exclusivo e diferente de zero.
-
Nome da faixa definido pelo usuário (por exemplo, “áudio” para a faixa de áudio).
-
ID do codec para essa faixa (por exemplo, para a faixa de áudio “A_ AAC “).
-
Tipo de faixa (por exemplo, use o valor de enumeração de MKV _ TRACK _ INFO _ TYPE _ AUDIO para áudio).
Se você tiver dados privados do codec para a faixa de áudio, poderá transmiti-los ao chamar a addTrack função. Você também pode enviar os dados privados do codec depois de criar o KinesisVideoStream objeto enquanto chama o método start in KinesisVideoStream.
Coloque um quadro no stream de vídeo do Kinesis
Você insere mídia no stream de vídeo do Kinesis usandoKinesisVideoStream::putFrame
, passando um Frame
objeto que contém o cabeçalho e os dados de mídia. O exemplo chama putFrame
no arquivo ProducerApiTest.cpp
:
frame.duration = FRAME_DURATION_IN_MICROS * HUNDREDS_OF_NANOS_IN_A_MICROSECOND; frame.size = SIZEOF(frameBuffer_); frame.frameData = frameBuffer_; MEMSET(frame.frameData, 0x55, frame.size); while (!stop_producer_) { // Produce frames timestamp = std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::system_clock::now().time_since_epoch()).count() / DEFAULT_TIME_UNIT_IN_NANOS; frame.index = index++; frame.decodingTs = timestamp; frame.presentationTs = timestamp; // Key frame every 50th frame.flags = (frame.index % 50 == 0) ? FRAME_FLAG_KEY_FRAME : FRAME_FLAG_NONE; ... EXPECT_TRUE(kinesis_video_stream->putFrame(frame));
nota
O exemplo anterior do produtor de C++ envia um buffer de dados de teste. Em uma situação real, você precisa obter o buffer e o tamanho do quadro dos dados do quadro em uma fonte de mídia (como uma câmera).
O objeto Frame
tem os seguintes campos:
-
Índice de quadros. Este deve ser um valor incremental monotônico.
-
Sinalizadores associados ao quadro. Por exemplo, se o codificador fosse configurado para produzir um keyframe, esse quadro receberia o sinalizador
FRAME_FLAG_KEY_FRAME
. -
Carimbo de data/hora de decodificação.
-
Carimbo de data e hora da apresentação.
-
Duração do quadro (para unidades de 100 ns).
-
Tamanho do quadro em bytes.
-
Dados de quadro.
Para obter mais informações sobre o formato de quadro, consulte Modelo de dados do Kinesis Video Streams.
Coloque um KinesisVideoFrame em uma faixa específica de KinesisVideoStream
Você pode usar a PutFrameHelper
classe para colocar dados do quadro em uma faixa específica. Primeiro, chame o getFrameDataBuffer
para obter um ponteiro para um dos buffers pré-alocados para preencher os dados. KinesisVideoFrame
Em seguida, você pode chamar o putFrameMultiTrack
para enviar o KinesisVideoFrame
junto com o valor booleano para indicar o tipo de dados do quadro. Use true (verdadeiro) se forem dados de vídeo ou false (falso) se o quadro tiver dados de áudio. O putFrameMultiTrack
método usa um mecanismo de enfileiramento para garantir que MKV os fragmentos mantenham carimbos de data/hora de quadros monotonicamente crescentes e que quaisquer dois fragmentos não se sobreponham. Por exemplo, o MKV timestamp do primeiro quadro de um fragmento deve sempre ser maior do que o MKV timestamp do último quadro do fragmento anterior.
PutFrameHelper
tem os seguintes campos:
-
Número máximo de quadros de áudio na fila.
-
Número máximo de quadros de vídeo na fila.
-
Tamanho a ser alocado para um único quadro de áudio.
-
Tamanho a ser alocado para um único quadro de vídeo.
Métricas de acesso e registro de métricas
O produtor de C++ SDK inclui funcionalidade para métricas e registro de métricas.
Você pode usar as getKinesisVideoStreamMetrics
API operações getKinesisVideoMetrics
e para recuperar informações sobre o Kinesis Video Streams e seus streams ativos.
O código a seguir é do arquivo kinesis-video-pic/src/client/include/com/amazonaws/kinesis/video/client/Include.h
.
/** * Gets information about the storage availability. * * @param 1 CLIENT_HANDLE - the client object handle. * @param 2 PKinesisVideoMetrics - OUT - Kinesis Video metrics to be filled. * * @return Status of the function call. */ PUBLIC_API STATUS getKinesisVideoMetrics(CLIENT_HANDLE, PKinesisVideoMetrics); /** * Gets information about the stream content view. * * @param 1 STREAM_HANDLE - the stream object handle. * @param 2 PStreamMetrics - Stream metrics to fill. * * @return Status of the function call. */ PUBLIC_API STATUS getKinesisVideoStreamMetrics(STREAM_HANDLE, PStreamMetrics);
O objeto PClientMetrics
preenchido por getKinesisVideoMetrics
contém as seguintes informações:
-
contentStoreSize: o tamanho geral em bytes do armazenamento de conteúdo (a memória usada para armazenar dados de streaming).
-
contentStoreAvailableTamanho: a memória disponível no armazenamento de conteúdo, em bytes.
-
contentStoreAllocatedTamanho: A memória alocada no armazenamento de conteúdo.
-
totalContentViewsTamanho: a memória total usada para a visualização do conteúdo. A visualização do conteúdo é uma série de índices de informações no armazenamento de conteúdo.
-
totalFrameRate: o número agregado de quadros por segundo em todos os fluxos ativos.
-
totalTransferRate: o total de bits por segundo (bps) enviados em todos os fluxos.
O objeto PStreamMetrics
preenchido por getKinesisVideoStreamMetrics
contém as seguintes informações:
-
currentViewDuration: a diferença em unidades de 100 ns entre a cabeça da visualização do conteúdo (quando os quadros são codificados) e a posição atual (quando os dados do quadro são enviados para o Kinesis Video Streams).
-
overallViewDuration: a diferença em unidades de 100 ns entre a parte superior da visualização do conteúdo (quando os quadros são codificados) e a parte final (quando os quadros são apagados da memória, seja porque o espaço total alocado para a visualização do conteúdo foi excedido ou porque uma
PersistedAck
mensagem é recebida do Kinesis Video Streams e os quadros conhecidos por persistirem são liberados). -
currentViewSize: o tamanho em bytes da visualização do conteúdo do cabeçalho (quando os quadros são codificados) até a posição atual (quando os quadros são enviados para o Kinesis Video Streams).
-
overallViewSize: o tamanho total em bytes da visualização do conteúdo.
-
currentFrameRate: a última taxa medida do stream, em quadros por segundo.
-
currentTransferRate: a última taxa medida do fluxo, em bytes por segundo.
Desgaste
Se quiser enviar os bytes restantes em um buffer e aguardar o ACK
, você poderá usar o stopSync
:
kinesis_video_stream->stopSync();
Ou você pode chamar stop
para encerrar o streaming:
kinesis_video_stream->stop();
Depois de interromper a transmissão, você pode liberá-la invocando o seguinte: API
kinesis_video_producer_->freeStream(kinesis_video_stream);