Fase 2: Scrittura e analisi del codice - Amazon Kinesis Video Streams

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Fase 2: Scrittura e analisi del codice

In questa sezione della procedura per C++ Producer Library, potrai esaminare il codice nel test harness C++ (tst/ProducerTestFixture.h e altri file). Hai scaricato questo codice nella sezione precedente.

L'esempio di C++ indipendente dalla piattaforma mostra i seguenti modelli di codifica:

  • Creare un'istanza diKinesisVideoProducerper accedere a Kinesis Video Streams.

  • Creare un'istanza di KinesisVideoStream. Se non esiste già un flusso con lo stesso nome, nel tuo account AWS viene creato un flusso video Kinesis.

  • Chiama putFrame in KinesisVideoStream per ogni fotogramma di dati, non appena diventa disponibile, per inviarlo al flusso.

Nelle seguenti sezioni sono fornite maggiori informazioni:

Creazione di un'istanza diKinesisVideoProducer

Per creare l'oggetto KinesisVideoProducer, richiama il metodo KinesisVideoProducer::createSync. L'esempio seguente crea KinesisVideoProducer nel file ProducerTestFixture.h:

kinesis_video_producer_ = KinesisVideoProducer::createSync(move(device_provider_), move(client_callback_provider_), move(stream_callback_provider_), move(credential_provider_), defaultRegion_);

Il metodo createSync accetta i parametri seguenti:

  • Un oggetto DeviceInfoProvider, che restituisce un oggetto DeviceInfo contenente informazioni sul dispositivo o sulla configurazione dello storage.

    Nota

    Puoi configurare la dimensione dello store dei contenuti utilizzando il parametro deviceInfo.storageInfo.storageSize. I flussi di contenuti condividono lo store dei contenuti. Per determinare i requisiti delle dimensioni di storage, moltiplica la dimensione media dei fotogrammi per il numero di fotogrammi archiviati per la durata massima di tutti i flussi. Quindi moltiplica per 1,2 per prendere in considerazione la deframmentazione. Supponi, ad esempio, che la tua applicazione abbia la seguente configurazione:

    • Tre flussi

    • 3 minuti di durata massima

    • Ogni flusso è di 30 fotogrammi al secondo (FPS)

    • Ogni fotogramma ha una dimensione di 10.000 KB

    I requisiti di storage dei contenuti per questa applicazione sono 3 (flussi) * 3 (minuti) * 60 (secondi in un minuto) * 10.000 (KB) * 1,2 (quota di deframmentazione) = 194,4 Mb ~ 200 MB.

  • Un oggetto ClientCallbackProvider, che restituisce puntatori delle funzioni che segnalano eventi specifici del client.

  • Un oggetto StreamCallbackProvider, che restituisce puntatori delle funzioni richiamati quando si verificano eventi specifici del flusso.

  • Un oggetto CredentialProvider, che fornisce l'accesso alle variabili di ambiente delle credenziali AWS.

  • La regione AWS ("us-west-2"). L'endpoint del servizio è determinato dalla regione.

Creazione di un'istanza diKinesisVideoFlusso

Per creare l'oggetto KinesisVideoStream, richiama il metodo KinesisVideoProducer::CreateStream con un parametro StreamDefinition. L'esempio crea KinesisVideoStream nel file ProducerTestFixture.h con il tipo di traccia video e con id traccia pari a 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));

L'oggetto StreamDefinition dispone dei campi seguenti:

  • Nome del flusso.

  • Periodo di retention dei dati.

  • Tag per il flusso. Questi tag possono essere utilizzati dalle applicazioni dei consumatori per trovare il flusso corretto o per avere maggiori informazioni sul flusso. I tag possono anche essere visualizzati in AWS Management Console.

  • Chiave di crittografia AWS KMS per il flusso. Per ulteriori informazioni, consultaUtilizzo della crittografia lato server con Kinesis Video Streams.

  • Tipo di streaming. Attualmente, l'unico valore valido è STREAMING_TYPE_REALTIME.

  • Tipo di contenuti multimediali.

  • Latenza file multimediali. Attualmente questo valore non viene utilizzato e deve essere impostato su 0.

  • Durata della riproduzione di ogni frammento.

  • Scala del timecode dei file multimediali.

  • Se i file multimediali usano la frammentazione del fotogramma chiave.

  • Se i file multimediali utilizzano i timecode.

  • Se i file multimediali usano i tempi assoluti del frammento.

Aggiungere una traccia audio a Kinesis Video Stream

È possibile aggiungere dettagli della traccia audio a una definizione del flusso della traccia video utilizzando il metodo addTrack delStreamDefinition:

stream_definition->addTrack(DEFAULT_AUDIO_TRACKID, DEFAULT_AUDIO_TRACK_NAME, DEFAULT_AUDIO_CODEC_ID, MKV_TRACK_INFO_TYPE_AUDIO);

Il metodo addTrack richiede i parametri seguenti:

  • Id traccia (1 per audio). Questo deve essere unico e un valore diverso da zero.

  • Nome traccia definito dall'utente (ad es., "audio" per la traccia audio).

  • Id codec per questa traccia (ad es., per la traccia audio "A_AAC").

  • Tipo di traccia (ad es., utilizzare il valore enum di MKV_TRACK_INFO_TYPE_AUDIO per l'audio).

Se si dispone di dati provati codec per la traccia audio, è possibile passarli quando si chiama la funzione addTrack. È inoltre possibile inviare i dati privati del codec dopo aver creato ilKinesisVideoEffettua lo streaming dell'oggetto durante la chiamata al metodo startKinesisVideoFlussi.

Inserimento di un fotogramma nel flusso di video Kinesis

È possibile inserire contenuti multimediali nel flusso video Kinesis usandoKinesisVideoStream::putFrame, passando in unFrameoggetto contenente l'intestazione e i dati dei file multimediali. L'esempio richiama putFrame nel file 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

L'esempio di producer C++ precedente invia un buffer di dati di prova. In un'applicazione reale, è consigliabile ottenere il buffer e la dimensione del fotogramma dai dati del fotogramma da un'origine multimediale (ad esempio una fotocamera).

L'oggetto Frame dispone dei campi seguenti:

  • Indice dei fotogrammi. Deve essere un valore a incremento monotono.

  • Flag associati al fotogramma. Ad esempio, se il codificatore è stato configurato per ottenere un fotogramma chiave, a questo fotogramma verrà assegnato il contrassegno FRAME_FLAG_KEY_FRAME.

  • Timestamp decodifica.

  • Timestamp presentazione.

  • Durata del fotogramma (in unità di 100 ns).

  • Dimensione del fotogramma in byte.

  • Dati del fotogramma.

Per ulteriori informazioni sul formato del fotogramma, consultaModello di dati Kinesis Video Streams.

Inserire unKinesisVideoInquadra in una traccia specifica diKinesisVideoFlusso

Puoi utilizzare il pluginPutFrameClasse helper per inserire i dati dei frame in una traccia specifica. Innanzitutto, chiama ilgetFrameDataBuffer per ottenere un puntatore a uno dei buffer preallocati per compilare ilKinesisVideoDati del fotogramma. Quindi, puoi chiamare ilputFrameMultiTraccia per inviare ilKinesisVideoCornice insieme al valore booleano per indicare il tipo di dati del fotogramma. Utilizza "true" se si tratta di dati video o "false" se il frame contiene dati audio. LaputFrameMultiIl metodo della traccia utilizza un meccanismo di accodamento per assicurarsi che i frammenti MKV aumentino aumentare in maniera monotona i timestamp dei frame senza che due frammenti si sovrappongano. Ad esempio, il timestamp MKV del primo frame di un frammento deve essere sempre maggiore del timestamp MKV dell'ultimo frame del frammento precedente.

LaPutFrameL'helper dispone dei campi seguenti:

  • Numero massimo di frame audio in coda

  • Numero massimo di frame video in coda

  • Dimensioni per allocare un singolo frame audio

  • Dimensioni per allocare un singolo frame video

Parametri e registrazione dei parametri

L'SDK del producer C++ include funzionalità per i parametri e la registrazione dei parametri.

Puoi utilizzare il plugingetKinesisVideoMetricsegetKinesisVideoStreamMetricsOperazioni API per recuperare informazioni su Kinesis Video Streams e sui flussi attivi.

Il seguente codice è tratto dal file 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);

L'oggetto PClientMetrics compilato da getKinesisVideoMetrics contiene le seguenti informazioni:

  • contentStoreSize: Le dimensioni generali in byte dello store dei contenuti (la memoria utilizzata per archiviare i dati del flusso).

  • contentStoreAvailableSize: La memoria libera nello store dei contenuti, in byte.

  • contentStoreAllocatedSize: La memoria allocata nello store dei contenuti.

  • totalContentViewsSize: La memoria totale utilizzata per la visualizzazione dei contenuti. La vista dei contenuti è una serie di indici di informazioni nello store dei contenuti.

  • totalFrameRate: Il numero totale di fotogrammi al secondo in tutti i flussi attivi.

  • totalTransferRate: Il totale di bit al secondo (bps) inviati in tutti i flussi.

L'oggetto PStreamMetrics compilato da getKinesisVideoStreamMetrics contiene le seguenti informazioni:

  • currentViewDuration: la differenza in unità di 100 ns tra l'ultimo della vista dei contenuti (quando i fotogrammi vengono codificati) e la posizione corrente (quando i dati dei fotogrammi vengono inviati a Kinesis Video Streams).

  • overallViewDuration: la differenza in unità di 100 ns tra l'ultimo della vista dei contenuti (quando i fotogrammi vengono codificati) e la fine (quando i fotogrammi vengono utilizzati dalla memoria, perché lo spazio totale allocato per la vista dei contenuti è stato superato oppure perché è stato superato daPersistedAckil messaggio viene ricevuto da Kinesis Video Streams e i frame noti per essere persistenti vengono svuotati).

  • currentViewSize: Le dimensioni in byte della vista dei contenuti dall'inizio (quando i fotogrammi vengono codificati) alla posizione corrente (quando i fotogrammi vengono inviati a Kinesis Video Streams).

  • overallViewSize: Le dimensioni totali in byte della vista dei contenuti.

  • currentFrameRate: L'ultima velocità del flusso misurata, in fotogrammi al secondo.

  • currentTransferRate: L'ultima velocità del flusso misurata, in byte al secondo.

Teardown:

Se desideri inviare i byte rimanenti in un buffer e attendere il ACK, puoi utilizzare stopSync:

kinesis_video_stream->stopSync();

In alternativa, puoi chiamare stop per terminare lo streaming:

kinesis_video_stream->stop();

Dopo aver arrestato il flusso, puoi liberarlo richiamando la seguente API:

kinesis_video_producer_->freeStream(kinesis_video_stream);

Fase successiva

Fase 3: Esecuzione e verifica del codice