

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Verwenden Sie die C\$1\$1-Producer-Bibliothek
<a name="producer-sdk-cpp"></a>

Sie können die von Amazon Kinesis Video Streams bereitgestellte C\$1\$1-Producer-Bibliothek verwenden, um Anwendungscode zu schreiben, um Mediendaten von einem Gerät an einen Kinesis-Videostream zu senden. 

## Objektmodell
<a name="producer-sdk-cpp-objectmodel"></a>

Die C\$1\$1-Bibliothek stellt die folgenden Objekte zur Verfügung, um das Senden von Daten an einen Kinesis-Videostream zu verwalten:
+ **KinesisVideoProducer:** Enthält Informationen zu Ihrer Medienquelle und Ihren AWS Anmeldeinformationen und verwaltet Rückrufe, um über Kinesis Video Streams Streams-Ereignisse zu berichten.
+ **KinesisVideoStream:** Stellt den Kinesis-Videostream dar. Enthält Informationen zu den Parametern des Videostreams, wie Name, Datenaufbewahrungsdauer und Medieninhaltstyp.

## Fügen Sie Medien in den Stream ein
<a name="producer-sdk-cpp-putframe"></a>

Sie können die in der C\$1\$1-Bibliothek bereitgestellten Methoden verwenden (z. B.`PutFrame`), um Daten in das `KinesisVideoStream` Objekt einzufügen. Die Bibliothek verwaltet dann den internen Status der Daten. Das umfasst beispielsweise folgende Aufgaben: 
+ Durchführen der Authentifizierung.
+ Überwachen auf Netzwerklatenz. Wenn die Latenz zu hoch ist, verwirft die Bibliothek gegebenenfalls Frames.
+ Überwachen des Status des laufenden Streamings.

## Callback-Schnittstellen
<a name="producer-sdk-cpp-callbacks"></a>

Ein Layer stellt eine Reihe von Callback-Schnittstellen für die Kommunikation mit dem Anwendungslayer bereit. Verfügbare Callback-Schnittstellen:


+ **Schnittstelle für Service-Callbacks (`CallbackProvider`):** Die Bibliothek ruft Ereignisse auf, die über diese Schnittstelle abgerufen wurden, wenn sie einen Stream erstellt, eine Stream-Beschreibung abruft und einen Stream löscht.
+ Schnittstelle für **Ereignisse im Client-Bereitschaftsstatus oder bei niedrigem Speicherbedarf (`ClientCallbackProvider`):** Die Bibliothek ruft Ereignisse auf dieser Schnittstelle auf, wenn der Client bereit ist oder wenn er feststellt, dass ihm möglicherweise nicht mehr genügend Speicherplatz oder Arbeitsspeicher zur Verfügung steht.
+ **Callback-Schnittstelle für Stream-Ereignisse (`StreamCallbackProvider`):** Die Bibliothek ruft Ereignisse auf dieser Schnittstelle auf, wenn Stream-Ereignisse auftreten, z. B. wenn der Stream in den Bereitschaftszustand wechselt, Frames gelöscht wurden oder Streamfehler auftreten.

Kinesis Video Streams bietet Standardimplementierungen für diese Schnittstellen. Sie können auch Ihre eigene benutzerdefinierte Implementierung bereitstellen, z. B. wenn Sie eine benutzerdefinierte Netzwerklogik benötigen oder wenn Sie der Benutzeroberfläche einen niedrigen Speicherzustand anzeigen möchten.

Weitere Informationen zu Callbacks in den Producer-Bibliotheken finden Sie unter. [SDK-Rückrufe von Produzenten](producer-reference-callbacks.md)

## Verfahren: Verwenden Sie das C\$1\$1-Producer-SDK
<a name="producer-sdk-cpp-using"></a>

Dieses Verfahren zeigt, wie Sie den Kinesis Video Streams Streams-Client und Medienquellen in einer C\$1\$1-Anwendung verwenden, um Daten an Ihren Kinesis-Videostream zu senden.

In dieser Vorgehensweise werden die folgenden Schritte beschrieben:

**Topics**

# Voraussetzungen
<a name="producer-sdk-cpp-prerequisites"></a>

Bevor Sie das C\$1\$1-Producer-SDK einrichten, stellen Sie sicher, dass Sie die folgenden Voraussetzungen erfüllen: 
+ **Anmeldeinformationen:** Im Beispielcode geben Sie Anmeldeinformationen an, indem Sie ein Profil angeben, das Sie in Ihrer Profildatei mit den AWS Anmeldeinformationen einrichten. Falls das noch nicht geschehen ist, richten Sie zunächst das Anmeldeinformationsprofil ein. 

  Weitere Informationen finden Sie unter [AWS Anmeldeinformationen und Region für die Entwicklung einrichten](https://docs.aws.amazon.com//sdk-for-java/v1/developer-guide/setup-credentials.html).
+ **Integration des Zertifikatsspeichers:** Die Kinesis Video Streams Streams-Producer-Bibliothek muss eine Vertrauensstellung mit dem von ihr aufgerufenen Dienst aufbauen. Dies erfolgt durch die Validierung der Zertifizierungsstellen (CAs) im öffentlichen Zertifikatsspeicher. Bei Linux-basierten Modellen befindet sich dieser Speicher im Verzeichnis „`/etc/ssl`“. 

  Laden Sie das Zertifikat aus dem folgenden Speicherort in den Zertifikatspeicher:

  [https://www.amazontrust.com/repository/SFSRootCAG2.pem](https://www.amazontrust.com/repository/SFSRootCAG2.pem)
+ Installieren Sie die folgenden Build-Abhängigkeiten für macOS:
  + [Autoconf 2.69](http://www.gnu.org/software/autoconf/autoconf.html) (Lizenz GPLv3 \$1/Autoconf: GNU GPL Version 3 oder höher) 
  + [CMake 3.7 oder 3.8](https://cmake.org/)
  + [Pkg-Config](https://www.freedesktop.org/wiki/Software/pkg-config/)
  + xCode (macOS)/clang/gcc (xcode-select Version 2347)
  + Java Development Kit (JDK) (für Java-JNI-Kompilierung)
  + [Lib-Pkg](https://github.com/freebsd/pkg/tree/master/libpkg)
+ Installieren Sie die folgenden Build-Abhängigkeiten für Ubuntu:
  + Git: `sudo apt install git`
  + [CMake](http://kitware.com/cmake): `sudo apt install cmake`
  + G \$1\$1: `sudo apt install g++`
  + pkg-konfiguration: `sudo apt install pkg-config`
  + OpenJDK: `sudo apt install openjdk-8-jdk`
**Anmerkung**  
Dies ist nur erforderlich, wenn Sie Java Native Interface (JNI) erstellen.
  + Legen Sie die `JAVA_HOME`-Umgebungsvariable fest: `export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/`

# Laden Sie den Code der C\$1\$1-Producer-Bibliothek herunter und konfigurieren Sie ihn
<a name="producersdk-cpp-download"></a>

Informationen zum Herunterladen und Konfigurieren der C\$1\$1-Producer-Bibliothek finden Sie unter [Amazon Kinesis Video Streams CPP Producer, GStreamer Plugin und](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp) JNI.

Voraussetzungen und weitere Informationen zu diesem Beispiel finden Sie unter. [Verwenden Sie die C\$1\$1-Producer-Bibliothek](producer-sdk-cpp.md)

## CMake Argumente
<a name="cmake-arguments"></a>

Im Folgenden finden Sie eine Referenztabelle für die SDK-spezifischen CMake Argumente von C\$1\$1 Producer. Sie können die [ CMake Standardoptionen](https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.html) auch an CMake übergeben.

**Wichtig**  
Diese sind alle optional.

**Flaggen zum Ein- oder Ausschließen bestimmter Funktionen**


| CMake Argument | Typ | Standard | Erklärung | 
| --- | --- | --- | --- | 
| `BUILD_DEPENDENCIES` |  Boolesch  |  ON  | Erstellen Sie Abhängigkeiten aus der Quelle. Verwenden Sie andernfalls die Abhängigkeiten, die bereits auf dem System installiert sind. Wenn eine der erforderlichen Abhängigkeiten nicht gefunden werden konnte, wird ein Fehler zurückgegeben. | 
| `BUILD_GSTREAMER_PLUGIN` | Boolesch |  OFF  | Baut das kvssink GStreamer Plugin auf. | 
|  `BUILD_JNI`  | Boolesch |  OFF  | Erstellt das Java Native Interface (JNI), um diesen Code aus einer Java-Laufzeitumgebung aufrufen zu können. | 
|  `ALIGNED_MEMORY_MODEL`  | Boolesch |  OFF  | Wenn die Speicherzuweisungen an 8-Byte-Grenzen ausgerichtet werden sollen. Einige Architekturen erlauben keinen unausgerichteten Speicherzugriff. | 
| `CONSTRAINED_DEVICE` | Boolesch |  OFF  | Nur Nicht-Windows. Wenn ON, wird die Thread-Stack-Größe auf 0.5 MiB gesetzt. Wird für [Alpine Linux-Builds](https://wiki.alpinelinux.org/wiki/Main_Page) benötigt. Andernfalls wird die Standardeinstellung des Betriebssystems verwendet. | 
|  `BUILD_STATIC`  | Boolesch |  OFF  | Erstellen Sie Bibliotheken und ausführbare Dateien als [gemeinsam genutzte](https://en.wikipedia.org/wiki/Shared_library) (OFF) oder [statische](https://en.wikipedia.org/wiki/Static_library) Dateien (ON). | 
|  `ADD_MUCLIBC`  | Boolesch |  OFF  | Verlinken Sie auf [uClibc](https://en.wikipedia.org/wiki/UClibc) statt auf die Standard-C-Bibliothek, bei der es sich um eine kleinere C-Standardbibliothek handelt, die für eingebettete Systeme konzipiert ist. | 
|  `OPEN_SRC_INSTALL_PREFIX`  |  Zeichenfolge  | .. /open-source/lokal | Speicherort für die Installation der Open-Source-Abhängigkeiten, falls sie aus dem Quellcode erstellt werden. | 

**Flaggen für die Cross-Compilierung**

**Wichtig**  
Legen Sie diese fest, wenn sich die CPU-Architekturen Ihres Ziel- und Hostcomputers unterscheiden.


| CMake Argument | Typ | Standard | Erklärung | 
| --- | --- | --- | --- | 
| `BUILD_LOG4CPLUS_HOST` |  Zeichenfolge  |  ""  | Erstellen Sie die log4cplus Abhängigkeit für die angegebene CPU-Architektur. Wenn nicht gesetzt, log4cplus wird die CPU-Architektur des Host-Computers automatisch erkannt und verwendet. | 
| `BUILD_OPENSSL_PLATFORM`  |  Zeichenfolge  |  ""  | Erstellen Sie die OpenSSL Abhängigkeit für die angegebene CPU-Architektur. Wenn nicht gesetzt, OpenSSL wird die CPU-Architektur des Host-Computers automatisch erkannt und verwendet. | 

**Flaggen im Zusammenhang mit Tests**


| CMake Argument | Typ | Standard | Erklärung | 
| --- | --- | --- | --- | 
| `BUILD_TEST` |  Boolesch  |  OFF  | Erstellen Sie die Einheiten- und Integrationstests. Um alle Tests auszuführen, führen Sie die Ausführung ./tst/producerTest vom Build-Verzeichnis aus. AWS Für die Durchführung der Tests sind Anmeldeinformationen erforderlich. | 
| `CODE_COVERAGE` | Boolesch | OFF | Nur für GNU/Clang Compiler verfügbar. Ermöglichen Sie die Erfassung von Codeabdeckung mit [gcov](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html) und die Generierung von Berichten. | 
| `COMPILER_WARNINGS` | Boolesch | OFF | Nur für GNU/Clang Compiler verfügbar. Aktiviert alle Compiler-Warnungen. | 
| `ADDRESS_SANITIZER` | Boolesch | OFF | Nur für GNU/Clang Compiler verfügbar. Baue mit [AddressSanitizer](https://compiler-rt.llvm.org/). | 
| `MEMORY_SANITIZER` | Boolesch | OFF | Nur für GNU/Clang Compiler verfügbar. Baue mit [MemorySanitizer](https://compiler-rt.llvm.org/). | 
| `THREAD_SANITIZER` | Boolesch | OFF | Nur für GNU/Clang Compiler verfügbar. Baue mit [ThreadSanitizer](https://compiler-rt.llvm.org/). | 
| `UNDEFINED_BEHAVIOR_SANITIZER` | Boolesch | OFF | Nur für GNU/Clang Compiler verfügbar. Baue mit [UndefinedBehaviorSanitizer](https://compiler-rt.llvm.org/). | 

Um diese CMake Argumente zu verwenden, übergeben Sie sie nach dem `cmake ..` Befehl als durch Leerzeichen getrennte Liste von `-Dkey=value` Paaren. Beispiel:

```
cmake .. -DBUILD_GSTREAMER_PLUGIN=ON -DBUILD_DEPENDENCIES=OFF -DALIGNED_MEMORY_MODEL=ON 
```

CMake sucht nach der Compiler-Toolchain, indem er der Variablen folgt. `$PATH` Stellen Sie vor der Ausführung die `CXX` Umgebungsvariablen `CC` und so ein CMake, dass explizit festgelegt wird, welche Toolchain für Cross-Compilierung verwendet werden soll.

# Schreiben und untersuchen Sie den Code
<a name="producersdk-cpp-write"></a>

In diesem Abschnitt von untersuchen Sie den Code im C\$1\$1-Testcode (`tst/ProducerTestFixture.h`und anderen Dateien). [Verwenden Sie die C\$1\$1-Producer-Bibliothek](producer-sdk-cpp.md) Sie haben diesen Code im vorherigen Abschnitt heruntergeladen.

Das **plattformunabhängige** C\$1\$1-Beispiel zeigt das folgende Codierungsmuster:
+ Erstellen Sie eine Instanz von`KinesisVideoProducer`, um auf Kinesis Video Streams zuzugreifen.
+ Erstellen Sie eine Instance von `KinesisVideoStream`. Dadurch wird ein Kinesis-Videostream in Ihrem erstellt, AWS-Konto falls noch kein Stream mit demselben Namen vorhanden ist.
+ Rufen Sie `putFrame` im `KinesisVideoStream` für jeden Daten-Frame auf, sobald er verfügbar wird, um den Frame an den Stream zu senden.

In den folgenden Abschnitten finden Sie weitere Informationen zu diesem Codierungsmuster.



## Erstellen Sie eine Instanz von KinesisVideoProducer
<a name="producersdk-cpp-write-create-producer"></a>

Das `KinesisVideoProducer`-Objekt wird durch einen Aufruf der Methode `KinesisVideoProducer::createSync` erstellt. Im folgenden Beispiel wird `KinesisVideoProducer` in der Datei `ProducerTestFixture.h` erstellt:

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

Die Methode `createSync` verwendet die folgenden Parameter:
+ Ein `DeviceInfoProvider`-Objekt, das ein `DeviceInfo`-Objekt mit den Daten zu einem Gerät oder einer Speicherkonfiguration zurückgibt.
**Anmerkung**  
Sie konfigurieren die Größe Ihres Inhaltsspeichers unter Verwendung des Parameters `deviceInfo.storageInfo.storageSize`. Ihre Inhalts-Streams verwenden denselben Inhaltsspeicher. Um Ihren Speicherbedarf zu ermitteln, multiplizieren Sie die durchschnittliche Frame-Größe mit der Anzahl der für die maximale Dauer aller Streams gespeicherten Frames. Multiplizieren Sie das Ergebnis dann mit 1,2, um die Defragmentierung zu berücksichtigen. Angenommen, Ihre Anwendung verwendet die folgende Konfiguration:  
Drei Streams
3 Minuten maximale Dauer
Jeder Stream ist 30 Frames pro Sekunde (FPS)
Jeder Frame ist 10.000 KB groß
Die Inhaltsspeicheranforderung für diese Anwendung ist **3 (Streams) \$1 3 (Minuten) \$1 60 (Sekunden in einer Minute) \$1 10000 (KB) \$1 1,2 (Defragmentierungszuschuss) = 194,4 MB \$1 200 MB**.
+ Ein `ClientCallbackProvider`-Objekt, das Funktionszeiger zurückgibt, die Client-spezifische Ereignisse melden.
+ Ein `StreamCallbackProvider`-Objekt, das Funktionszeiger zurückgibt, die per Callback aufgerufen werden, wenn Stream-spezifische Ereignisse auftreten.
+ Ein `CredentialProvider` Objekt, das Zugriff auf Umgebungsvariablen mit AWS Anmeldeinformationen ermöglicht.
+ Die AWS-Region („us-west-2"). Der Service-Endpunkt wird anhand der Region bestimmt.

## Erstellen Sie eine Instanz von KinesisVideoStream
<a name="producersdk-cpp-write-create-stream"></a>

Sie erstellen das `KinesisVideoStream`-Objekt, indem Sie die Methode `KinesisVideoProducer::CreateStream` mit einem `StreamDefinition`-Parameter aufrufen. Das Beispiel erstellt den `KinesisVideoStream` in der Datei `ProducerTestFixture.h` mit dem Track-Typ als Video und der ID 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));
```

Das `StreamDefinition`-Objekt enthält folgende Felder:
+ Stream-Name.
+ Aufbewahrungszeitraum.
+ Tags für den Stream. Diese Tags können von Konsumentenanwendungen verwendet werden, um den richtigen Stream zu finden oder weitere Informationen über den Stream abzurufen. Die Tags können auch in der AWS-Managementkonsole angezeigt werden.
+ AWS KMS Verschlüsselungsschlüssel für den Stream. Weitere Informationen finden Sie unter [Datenschutz in Kinesis Video Streams](how-kms.md).
+ Streaming-Typ. Der einzige gültige Wert ist derzeit `STREAMING_TYPE_REALTIME`.
+ Medieninhaltstyp.
+ Medienlatenz. Dieser Wert wird derzeit nicht verwendet und sollte auf 0 gesetzt werden.
+ Wiedergabedauer jedes Fragments.
+ Medienzeitcode-Skala.
+ Gibt an, ob die Medien Keyframe-Fragmentierung verwenden.
+ Gibt an, ob die Medien Zeitcodes verwenden.
+ Gibt an, ob die Medien absolute Fragmentzeiten verwenden.

## Fügen Sie dem Kinesis-Videostream eine Audiospur hinzu
<a name="producersdk-cpp-write-add-audiotrack-to-stream"></a>

Sie können einer Videotrack-Stream-Definition Details zur Audiospur hinzufügen, indem Sie die `addTrack` folgende Methode verwenden`StreamDefinition`:

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

Die `addTrack` Methode erfordert die folgenden Parameter:
+ Track-ID (wie eine für Audio). Dies sollte ein eindeutiger Wert ungleich Null sein.
+ Benutzerdefinierter Titelname (z. B. „Audio“ für den Audiotrack). 
+ Codec-ID für diesen Titel (z. B. für den Audiotrack „A\$1AAC“).
+ Spurtyp (verwenden Sie beispielsweise den Enum-Wert von MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO für Audio). 

Wenn Sie private Codec-Daten für die Audiospur haben, können Sie sie beim Aufrufen der addTrack-Funktion übergeben. Sie können dem Codec auch private Daten senden, nachdem Sie das Objekt erstellt haben, während Sie die Startmethode in aufrufen. KinesisVideoStream KinesisVideoStream

## Fügen Sie einen Frame in den Kinesis-Videostream ein
<a name="producersdk-cpp-write-putframe"></a>

Sie fügen Medien in den Kinesis-Videostream ein`KinesisVideoStream::putFrame`, indem Sie ein `Frame` Objekt übergeben, das den Header und die Mediendaten enthält. Das Beispiel ruft `putFrame` in der Datei `ProducerApiTest.cpp` auf:

```
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));
```

**Anmerkung**  
Das vorangegangene C\$1\$1-Producer-Beispiel sendet einen Puffer mit Testdaten. In einer echten Anwendung sollten Sie Frame-Puffer und -Größe aus den Frame-Daten von einer Medienquelle (z. B. einer Kamera) abrufen.

Das `Frame`-Objekt enthält folgende Felder:
+ Frame-Index. Dies sollte ein Wert sein, der gleichmäßig erhöht wird.
+ Dem Frame zugeordnete Flags. Wenn der Encoder beispielsweise zum Generieren eines Keyframes konfiguriert wurde, würde diesem Frame das Flag `FRAME_FLAG_KEY_FRAME` zugewiesen.
+ Zeitstempel dekodieren.
+ Zeitstempel der Präsentation.
+ Dauer des Frames (in 100-ns-Einheiten).
+ Größe des Frames in Byte.
+ Framedaten.

Weitere Informationen zum Format des Frames erhalten Sie unter [Kinesis Video Streams Streams-Datenmodell](how-data.md).

## Fügen Sie einen KinesisVideoFrame in einen bestimmten Titel ein von KinesisVideoStream
<a name="producersdk-cpp-write-putframeintospecifictrack"></a>

Sie können die `PutFrameHelper` Klasse verwenden, um Frame-Daten in eine bestimmte Spur einzufügen. Rufen Sie zunächst den `getFrameDataBuffer` auf, um einen Zeiger auf einen der vorab zugewiesenen Puffer zum Ausfüllen der `KinesisVideoFrame` Daten zu erhalten. Dann können Sie den aufrufen, `putFrameMultiTrack` um den `KinesisVideoFrame` zusammen mit dem booleschen Wert zu senden, der den Typ der Frame-Daten angibt. Verwenden Sie "true", wenn es sich um Videodaten handelt, oder "false", wenn der Frame Audiodaten enthält. Die `putFrameMultiTrack` Methode verwendet einen Warteschlangenmechanismus, um sicherzustellen, dass die MKV-Fragmente monoton ansteigende Frame-Zeitstempel beibehalten und sich zwei beliebige Fragmente nicht überlappen. Beispielsweise sollte der MKV-Zeitstempel des ersten Frames eines Fragments immer größer sein als der MKV-Zeitstempel des letzten Frames des vorherigen Fragments. 

Der `PutFrameHelper` hat die folgenden Felder:
+ Maximale Anzahl von Audio-Frames in der Warteschlange. 
+ Maximale Anzahl von Videoframes in der Warteschlange.
+ Größe, die einem einzelnen Audioframe zugewiesen werden soll.
+ Größe, die einem einzelnen Videoframe zugewiesen werden soll.

## Zugriff auf Metriken und Metrikprotokollierung
<a name="producersdk-cpp-write-metrics"></a>

Das C\$1\$1 Producer SDK umfasst Funktionen für Metriken und die Protokollierung von Metriken. 

Sie können die `getKinesisVideoStreamMetrics` API-Operationen `getKinesisVideoMetrics` und verwenden, um Informationen über Kinesis Video Streams und Ihre aktiven Streams abzurufen.

Der folgende Code stammt aus der Datei `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);
```

Das von `getKinesisVideoMetrics` gefüllte `PClientMetrics`-Objekt folgende Informationen enthalten:
+ **contentStoreSize:** Die Gesamtgröße des Inhaltsspeichers (der Speicher, der zum Speichern von Streaming-Daten verwendet wird) in Byte.
+ **contentStoreAvailableGröße:** Der verfügbare Speicher im Inhaltsspeicher in Byte.
+ **contentStoreAllocatedGröße:** Der zugewiesene Speicher im Inhaltsspeicher.
+ **totalContentViewsGröße:** Der gesamte Speicher, der für die Inhaltsansicht verwendet wird. Die Inhaltsansicht besteht aus einer Reihe von Informationsindizes im Inhaltsspeicher.
+ **totalFrameRate:** Die Gesamtzahl der Frames pro Sekunde in allen aktiven Streams.
+ **totalTransferRate:** Die Gesamtzahl der Bits pro Sekunde (bps), die in allen Streams gesendet werden.

Das von `getKinesisVideoStreamMetrics` gefüllte `PStreamMetrics`-Objekt folgende Informationen enthalten:
+ **currentViewDuration:** Der Unterschied in 100 ns-Einheiten zwischen dem Kopf der Inhaltsansicht (wenn Frames codiert sind) und der aktuellen Position (wenn Frame-Daten an Kinesis Video Streams gesendet werden).
+ **overallViewDuration:** Der Unterschied in 100 ns-Einheiten zwischen dem Kopf der Inhaltsansicht (wenn Frames codiert sind) und dem Ende (wenn Frames aus dem Speicher gelöscht werden, entweder weil der gesamte zugewiesene Speicherplatz für die Inhaltsansicht überschritten wurde oder weil eine `PersistedAck` Nachricht von Kinesis Video Streams empfangen wird und Frames, von denen bekannt ist, dass sie persistent sind, gelöscht werden).
+ **currentViewSize:** Die Größe der Inhaltsansicht in Byte vom Kopf (wenn Frames codiert sind) bis zur aktuellen Position (wenn Frames an Kinesis Video Streams gesendet werden).
+ **overallViewSize:** Die Gesamtgröße der Inhaltsansicht in Byte.
+ **currentFrameRate:** Die zuletzt gemessene Rate des Streams in Bildern pro Sekunde.
+ **currentTransferRate:** Die zuletzt gemessene Rate des Streams in Byte pro Sekunde.

## Abbruch
<a name="producersdk-cpp-write-teardown"></a>

Wenn Sie die verbleibenden Bytes in einem Puffer senden und auf das `ACK` warten möchten, können Sie `stopSync` verwenden:

```
kinesis_video_stream->stopSync();            
```

Oder Sie können `stop` aufrufen, um das Streamen zu beenden: 

```
kinesis_video_stream->stop();            
```

Nachdem Sie den Stream gestoppt haben, können Sie den Stream durch Aufrufen der folgenden API freigeben:

```
kinesis_video_producer_->freeStream(kinesis_video_stream);            
```

# Führen Sie den Code aus und überprüfen Sie ihn
<a name="producersdk-cpp-test"></a>

Informationen zum Ausführen und Überprüfen des Codes für finden Sie in den folgenden betriebssystemspezifischen Anweisungen: [Verwenden Sie die C\$1\$1-Producer-Bibliothek](producer-sdk-cpp.md)
+ [Linux](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/linux.md)
+ [macOS](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/macos.md)
+ [Windows](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/windows.md)
+ [Raspberry Pi OS](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/raspberry-pi.md)

Sie können den Traffic in Ihrem Stream überwachen, indem Sie sich die mit Ihrem Stream verknüpften Metriken in der CloudWatch Amazon-Konsole ansehen, z. `PutMedia.IncomingBytes` B.

# Verwenden Sie das C\$1\$1 Producer SDK als GStreamer Plugin
<a name="producer-sdk-cpp-gstreamer"></a>

[GStreamer](https://gstreamer.freedesktop.org/)ist ein beliebtes Medien-Framework, das von mehreren Kameras und Videoquellen verwendet wird, um benutzerdefinierte Medien-Pipelines durch die Kombination modularer Plugins zu erstellen. Das Kinesis Video GStreamer Streams-Plugin optimiert die Integration Ihrer bestehenden GStreamer Medienpipeline mit Kinesis Video Streams. 

Informationen zur Verwendung des C\$1\$1-Producer-SDK als GStreamer Plugin finden Sie unter. [Beispiel: GStreamer SDK-Plug-In für Kinesis Video Streams Producer — kvssink](examples-gstreamer-plugin.md)

# Verwenden Sie das C\$1\$1-Producer-SDK als GStreamer Plugin in einem Docker-Container
<a name="producer-sdk-cpp-gstreamer-docker"></a>

[GStreamer](https://gstreamer.freedesktop.org/)ist ein beliebtes Medien-Framework, das von mehreren Kameras und Videoquellen verwendet wird, um benutzerdefinierte Medien-Pipelines durch die Kombination modularer Plugins zu erstellen. Das Kinesis Video GStreamer Streams-Plugin optimiert die Integration Ihrer bestehenden GStreamer Medienpipeline mit Kinesis Video Streams. 

Darüber hinaus standardisiert die Verwendung von [Docker]() zur Erstellung der GStreamer Pipeline die Betriebsumgebung für Kinesis Video Streams, was die Erstellung und Ausführung der Anwendung optimiert.

Informationen zur Verwendung des C\$1\$1-Producer-SDK als GStreamer Plugin in einem Docker-Container finden Sie unter. [Führen Sie das GStreamer Element in einem Docker-Container aus](examples-gstreamer-plugin.md#examples-gstreamer-plugin-docker)

# Verwenden Sie die Protokollierung mit dem C\$1\$1-Producer-SDK
<a name="producer-sdk-cpp-logging"></a>

Sie konfigurieren die Protokollierung für C\$1\$1-Producer-SDK-Anwendungen in der `kvs_log_configuration` Datei im `kinesis-video-native-build` Ordner.

Das folgende Beispiel zeigt die erste Zeile der Standard-Konfigurationsdatei, mit der die Anwendung zum Schreiben von `DEBUG`-Level-Protokolleinträgen an die AWS-Managementkonsole konfiguriert wird:

```
log4cplus.rootLogger=DEBUG, KvsConsoleAppender
```

Für eine weniger ausführliche Protokollierung können Sie als Protokollierungsebene `INFO` festlegen.

Um die Anwendung so zu konfigurieren, dass sie Protokolleinträge in eine Protokolldatei schreibt, aktualisieren Sie die erste Zeile der Datei wie folgt:

```
log4cplus.rootLogger=DEBUG, KvsConsoleAppender, KvsFileAppender
```

Damit wird die Anwendung zum Schreiben von Protokolleinträgen in `kvs.log` im Ordner `kinesis-video-native-build/log` konfiguriert.

Um den Speicherort der Protokolldatei zu ändern, aktualisieren Sie die folgende Zeile mit dem neuen Pfad:

```
log4cplus.appender.KvsFileAppender.File=./log/kvs.log
```

**Anmerkung**  
Wenn `DEBUG`-Level-Protokollierung in eine Datei geschrieben wird, kann die Protokolldatei den auf dem Gerät verfügbaren Speicherplatz schnell aufbrauchen.