Amazon Kinesis Video Streams Producer SDK (C++) による開発
Amazon Kinesis Video Streams CPP Producer, GStreamer Plugin and JNI
参考
処理の流れ (基本)
- KinesisVideoProducer インスタンスを生成
- ストリームを生成
- ストリームを開始
- ストリームにフレームデータを送信
1. KinesisVideoProducer インスタンスを生成
class MyDeviceInfoProvider : public DefaultDeviceInfoProvider {
};
class MyClientCallbackProvider : public ClientCallbackProvider {
UINT64 getCallbackCustomData() override {
return reinterpret_cast<UINT64> (this);
}
};
class MyStreamCallbackProvider : public StreamCallbackProvider {
UINT64 getCallbackCustomData() override {
return reinterpret_cast<UINT64> (this);
}
};
std::unique_ptr<KinesisVideoProducer> createProducer(const std::string &accessKeyId, const std::string &secretAccessKey, const std::string ®ion) {
// AWS 認証情報
auto credentials = new Credentials(
accessKeyId,
secretAccessKey,
"",
std::chrono::seconds(3600)
);
// KinesisVideoProducer インスタンスを生成
auto kinesisVideoProducer = KinesisVideoProducer::createSync(
std::make_unique<MyDeviceInfoProvider>(),
std::make_unique<MyClientCallbackProvider>(),
std::make_unique<MyStreamCallbackProvider>(),
std::make_unique<StaticCredentialProvider>(*credentials),
region
);
return kinesisVideoProducer;
}
2. ストリームを生成
std::shared_ptr<KinesisVideoStream> createStream(std::unique_ptr<KinesisVideoProducer> &kinesisVideoProducer) {
// ストリームの生成
auto streamDefinition = std::make_unique<StreamDefinition>(
"stream-test",
std::chrono::hours(1)
);
auto stream = kinesisVideoProducer->createStreamSync(move(streamDefinition));
return stream;
}
3. ストリームを開始
stream->start();
4. ストリームにフレームデータを送信
Frame frame;
frame.duration = // duration
frame.trackId = DEFAULT_TRACK_ID;
frame.frameData = // フレームデータのポインタ
frame.size = // フレームデータのサイズ
frame.index = // フレームインデックス
frame.decodingTs = // DTS (100ns 単位)
frame.presentationTs = // PTS (100ns 単位)
frame.flags = // キーフレームなら FRAME_FLAG_KEY_FRAME、そうでなければ FRAME_FLAG_NONE
stream->putFrame(frame);
詳細
KinesisVideoProducer インスタンスを生成
- 非同期
- KinesisVideoProducer::create(device_info_provider, client_callback_provider, stream_callback_provider, ...)
- Device/Client/Stream の各コールバックプロバイダーを指定し、DefaultCallbackProvider を使う
- is_caching_endpoint, caching_update_period の指定は不可
- こちらの場合、指定した DeviceInfoProvider の getCertPath() は使われないようなので注意!
- KinesisVideoProducer::create(device_info_provider, callback_provider)
- CallbackProvider を直接指定する
- KinesisVideoProducer::create(device_info_provider, client_callback_provider, stream_callback_provider, ...)
- 同期
- KinesisVideoProducer::createSync(device_info_provider, client_callback_provider, stream_callback_provider, ...)
- Device/Client/Stream の各コールバックプロバイダーを指定し、DefaultCallbackProvider を使う
- is_caching_endpoint, caching_update_period の指定も可
- KinesisVideoProducer::createSync(device_info_provider, callback_provider)
- CallbackProvider を直接指定する
- KinesisVideoProducer::createSync(device_info_provider, client_callback_provider, stream_callback_provider, ...)
引数
Argument | Type | Default | Description |
---|---|---|---|
device_info_provider | DeviceInfoProvider | (必須) | ストリームの作成、ストリームの説明の取得、ストリームの削除に対するコールバックインターフェイス |
client_callback_provider | ClientCallbackProvider | (必須) | クライアントの準備完了、使用可能なストレージまたはメモリ不足に対するコールバックインターフェイス |
stream_callback_provider | StreamCallbackProvider | (必須) | ストリームの準備完了、フレーム停止、ストリームエラー等のイベントに対するコールバックインターフェイス |
credential_provider | CredentialProvider | (必須) | AWS 認証情報 |
region | basic_string | "us-west-2" | リージョン名 |
control_plane_uri | basic_string | "" | |
user_agent_name | basic_string | "AWS-SDK-KVS" | Producer の User-Agent 名 |
is_caching_endpoint | bool | false | |
caching_update_period | uint64_t | 40 * 10LL * 1000LL * 1000LL * 60LL |
ストリームを生成
- 非同期
- 同期
StreamDefinition
Argument | Type | Default | Description |
---|---|---|---|
stream_name | string | (必須) | ストリーム名 |
retention_period | duration | (必須) | |
tags | map | nullptr | |
kms_key_id | string | "" | |
streaming_type | enum | STREAMING_TYPE_REALTIME | リアルタイム/ニアリアルタイム/オフライン |
content_type | string | "video/h264" | |
max_latency | duration | 0 | 最大レイテンシー |
fragment_duration | duration | 2s | フラグメント間隔 (1~10s) |
timecode_scale | duration | 1ms | タイムコードの単位 |
key_frame_fragmentation | bool | true | |
frame_timecodes | bool | true | |
absolute_fragment_times | bool | true | |
fragment_acks | bool | true | |
restart_on_error | bool | true | |
recalculate_metrics | bool | true | |
nal_adaptation_flags | uint32_t | NAL_ADAPTATION_ANNEXB_NALS | NAL_ADAPTATION_ANNEXB_CPD_NALS | |
frame_rate | uint32_t | 25 | フレームレート |
avg_bandwidth_bps | uint32_t | 4 * 1024 * 1024 | 平均帯域幅 |
buffer_duration | duration | 120s | バッファー間隔 |
replay_duration | duration | 40s | |
connection_staleness | duration | 30s | |
codec_id | string | "V_MPEG4/ISO/AVC" | |
track_name | string | "kinesis_video" | |
codecPrivateData | uint8_t* | nullptr | |
codecPrivateDataSize | uint32_t | 0 | |
track_type | enum | MKV_TRACK_INFO_TYPE_VIDEO | VIDEO/AUDIO/UNKOWN |
segment_uuid | vector<uint8_t> | vector<uint8_t>() | |
default_track_id | uint64_t | DEFAULT_TRACK_ID | |
contentStorePressurePolicy | enum | CONTENT_STORE_PRESSURE_POLICY_DROP_TAIL_ITEM | ストレージ不足時の振る舞い (エラー/フレーム破棄) |
contentViewOverflowPolicy | enum | CONTENT_VIEW_OVERFLOW_POLICY_DROP_UNTIL_FRAGMENT_START | オーバーフロー時の振る舞い |
DeviceInfoProvider
- DeviceInfoProvider interface
- getDeviceInfo() 必須
- getCustomUserAgent()
- getCertPath()
- DefaultDeviceInfoProvider
ClientCallbackProvider
- ClientCallbackProvider interface
- getCallbackCustomData() 必須
- getClientReadyCallback()
- getStorageOverflowPressureCallback()
StreamCallbackProvider
- StreamCallbackProvider interface
- getCallbackCustomData() 必須
- getStreamUnderflowReportCallback()
- getStreamLatencyPressureCallback()
- getDroppedFrameReportCallback()
- getStreamConnectionStaleCallback()
- getDroppedFragmentReportCallback()
- getStreamErrorReportCallback()
- getStreamReadyCallback()
- getStreamClosedCallback()
- getStreamDataAvailableCallback()
- getFragmentAckReceivedCallback()
- getBufferDurationOverflowPressureCallback()