Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Écrivez et examinez le code
Dans cette section duUtiliser la bibliothèque C++ Producer, vous examinerez le code du harnais de test C++ (tst/ProducerTestFixture.het d'autres fichiers). Vous avez téléchargé ce code dans la section précédente.
L'exemple de Plateforme indépendante C++ suivant illustre le modèle de codage suivant :
-
Créez une instance de
KinesisVideoProducerpour accéder à Kinesis Video Streams. -
Créez une instance de
KinesisVideoStream. Cela crée un flux vidéo Kinesis dans votre Compte AWS fichier si aucun flux du même nom n'existe déjà. -
Appelez
putFramesur leKinesisVideoStreampour chaque image de données à mesure de sa disponibilité, pour l'envoyer au flux.
Les sections suivantes fournissent plus d'informations sur ce modèle de codage.
Créez une instance de KinesisVideoProducer
Vous créez l'objet KinesisVideoProducer en appelant la méthode KinesisVideoProducer::createSync. L'exemple suivant crée l'KinesisVideoProducer dans le fichier ProducerTestFixture.h :
kinesis_video_producer_ = KinesisVideoProducer::createSync(move(device_provider_), move(client_callback_provider_), move(stream_callback_provider_), move(credential_provider_), defaultRegion_);
La méthode createSync prend les paramètres suivants :
-
Un objet
DeviceInfoProviderqui renvoie un objetDeviceInfocontenant des informations relatives à la configuration de l'appareil ou du stockage.Note
Vous configurez la taille de votre magasin de contenu à l'aide du paramètre
deviceInfo.storageInfo.storageSize. Vos flux de contenu partagent le magasin de contenu. Pour déterminer les exigences en termes de taille de stockage, multipliez la taille d'image moyenne par le nombre d'images stockées pendant la durée maximale pour tous les flux. Ensuite, multipliez le résultat par 1,2 pour prendre en compte la défragmentation. Par exemple, supposez que votre application a la configuration suivante :-
Trois flux
-
3 minutes de durée maximale
-
Chaque flux comprend 30 images par seconde (FPS)
-
Chaque image a une taille de 10 000 Ko
Le stockage de contenu requis pour cette application est de 3 (flux) * 3 (minutes) * 60 (secondes par minute) * 10000 (ko) * 1,2 (allocation de défragmentation) = 194,4 Mo ~ 200 Mo.
-
-
Un objet
ClientCallbackProviderobjet qui renvoie les pointeurs de fonction rapportant les événements spécifiques au client. -
Un objet
StreamCallbackProviderqui renvoie les pointeurs de fonction qui sont appelés lors d'événements spécifiques au flux. -
Un
CredentialProviderobjet qui permet d'accéder aux variables d'environnement AWS des informations d'identification. -
Le Région AWS (« us-ouest-2 »). Le point de terminaison de service est déterminé selon la région.
Créez une instance de KinesisVideoStream
Vous créez l'objet KinesisVideoStream en appelant la méthode KinesisVideoProducer::CreateStream avec un paramètre StreamDefinition. L'exemple crée le flux KinesisVideoStream dans le fichier ProducerTestFixture.h avec le type de piste vidéo et l'ID de piste 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'objet StreamDefinition comporte les champs suivants :
-
Nom du flux.
-
Durée de conservation.
-
Balises pour le flux. Ces balises peuvent être utilisées par des applications de consommateurs pour trouver le bon flux ou pour obtenir plus d'informations sur le flux. Les balises peuvent également être affichés dans la Console de gestion AWS.
-
AWS KMS clé de chiffrement pour le flux. Pour de plus amples informations, veuillez consulter Protection des données dans Kinesis Video Streams.
-
Type de streaming. Actuellement, la seule valeur valide est
STREAMING_TYPE_REALTIME. -
Type de contenu média.
-
Latence de média. Cette valeur n'est pas utilisée actuellement et doit être définie sur 0.
-
Durée de lecture de chaque fragment.
-
Mise à l'échelle du timecode média.
-
Si le média utilise la fragmentation des images de la clé.
-
Si le média utilise des timecodes.
-
Si le média utilise des fragments absolus.
Ajouter une piste audio au flux vidéo Kinesis
Vous pouvez ajouter les détails d'une piste audio à la définition d'un flux de piste vidéo en utilisant la addTrack méthode suivante StreamDefinition :
stream_definition->addTrack(DEFAULT_AUDIO_TRACKID, DEFAULT_AUDIO_TRACK_NAME, DEFAULT_AUDIO_CODEC_ID, MKV_TRACK_INFO_TYPE_AUDIO);
La addTrack méthode nécessite les paramètres suivants :
-
Identifiant de la piste (comme pour l'audio). Il doit s'agir d'une valeur unique différente de zéro.
-
User-defined nom de la piste (par exemple, « audio » pour la piste audio).
-
ID de codec pour cette piste (par exemple, pour la piste audio « A_AAC »).
-
Type de piste (par exemple, utilisez la valeur d'énumération de MKV_TRACK_INFO_TYPE_AUDIO pour l'audio).
Si vous avez des données privées codec pour la piste audio, vous pouvez les transmettre lors de l'appel de la fonction addTrack. Vous pouvez également envoyer les données privées du codec après avoir créé l' KinesisVideoStream objet tout en appelant la méthode start dans KinesisVideoStream.
Insérer une image dans le flux vidéo Kinesis
Vous insérez du contenu multimédia dans le flux vidéo Kinesis KinesisVideoStream::putFrame en transmettant un Frame objet contenant l'en-tête et les données multimédia. L'exemple appelle putFrame dans le fichier 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));
Note
L'exemple de producteur C++ précédent envoie un tampon de données de test. Dans une application réelle, vous devez obtenir le tampon et la taille de l'image depuis les données de l'image à partir d'une source média (par exemple, une caméra).
L'objet Frame comporte les champs suivants :
-
Index d'image. Ce doit être une valeur croissante de manière monotone.
-
Indicateurs associés à l'image. Par exemple, si l'encodeur a été configuré pour produire un image de clé, cette image sera attribuée à l'indicateur
FRAME_FLAG_KEY_FRAME. -
Horodatage du décodage.
-
Horodatage de la présentation.
-
Durée de l'image (jusqu'à 100 unités ns).
-
Taille de l'image, en octets.
-
Données de l'image.
Pour plus d'informations sur le format du cadre, consultez Modèle de données Kinesis Video Streams.
Insérez un KinesisVideoFrame dans une piste spécifique de KinesisVideoStream
Vous pouvez utiliser la PutFrameHelper classe pour placer des données de trame dans une piste spécifique. Tout d'abord, appelez le getFrameDataBuffer pour obtenir un pointeur vers l'un des buffers pré-alloués pour remplir les KinesisVideoFrame données. Ensuite, vous pouvez appeler le putFrameMultiTrack pour envoyer le KinesisVideoFrame avec la valeur booléenne pour indiquer le type de données de trame. Utilisez la valeur true s'il s'agit de données vidéo ou false si la trame contient des données audio. La putFrameMultiTrack méthode utilise un mécanisme de mise en file d'attente pour garantir que les fragments MKV conservent un horodatage des images qui augmente de façon monotone et que deux fragments ne se chevauchent pas. Par exemple, l'horodatage MKV de la première image d'un fragment doit toujours être supérieur à l'horodatage MKV de la dernière image du fragment précédent.
Le PutFrameHelper contient les champs suivants :
-
Nombre maximum d'images audio dans la file d'attente.
-
Nombre maximum d'images vidéo dans la file d'attente.
-
Taille à allouer pour une seule trame audio.
-
Taille à allouer pour une seule image vidéo.
Métriques d'accès et journalisation des métriques
Le SDK C++ Producer inclut des fonctionnalités pour les métriques et la journalisation des métriques.
Vous pouvez utiliser les opérations de l'getKinesisVideoStreamMetricsAPI getKinesisVideoMetrics et pour récupérer des informations sur Kinesis Video Streams et vos flux actifs.
Le code suivant provient du fichier 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'objet PClientMetrics rempli par getKinesisVideoMetrics contient les informations suivantes :
-
contenu StoreSize : taille globale en octets du magasin de contenu (la mémoire utilisée pour stocker les données de streaming).
-
content StoreAvailableSize : mémoire disponible dans le magasin de contenu, en octets.
-
content StoreAllocatedSize : mémoire allouée dans le magasin de contenu.
-
total ContentViewsSize : mémoire totale utilisée pour l'affichage du contenu. La vue du contenu est une série d'indices d'informations dans le magasin de contenu.
-
total FrameRate : nombre total d'images par seconde pour tous les flux actifs.
-
total TransferRate : nombre total de bits par seconde (bits/s) envoyés dans tous les flux.
L'objet PStreamMetrics rempli par getKinesisVideoStreamMetrics contient les informations suivantes :
-
current ViewDuration : différence en unités de 100 ns entre la tête de la vue de contenu (lorsque les images sont codées) et la position actuelle (lorsque les données des images sont envoyées à Kinesis Video Streams).
-
global ViewDuration : différence en unités de 100 ns entre la tête de la vue de contenu (lorsque les images sont codées) et la queue (lorsque les images sont vidées de la mémoire, soit parce que l'espace total alloué à la vue de contenu est dépassé, soit parce qu'un
PersistedAckmessage est reçu de Kinesis Video Streams et que les images dont la persistance est connue sont vidées). -
current ViewSize : taille en octets du contenu affiché depuis l'en-tête (lorsque les images sont codées) jusqu'à la position actuelle (lorsque les images sont envoyées à Kinesis Video Streams).
-
global ViewSize : taille totale en octets de la vue de contenu.
-
current FrameRate : Le dernier débit mesuré du flux, en images par seconde.
-
current TransferRate : le dernier débit mesuré du flux, en octets par seconde.
Démontage
Si vous souhaitez envoyer les octets restants dans un tampon et attendre le ACK, vous pouvez utiliser stopSync :
kinesis_video_stream->stopSync();
Vous pouvez également appeler stop pour mettre fin au streaming :
kinesis_video_stream->stop();
Après avoir arrêté le flux, vous pouvez le libérer en appelant l'API suivante :
kinesis_video_producer_->freeStream(kinesis_video_stream);