Amazon Kinesis Video Streams Producer SDK (C++) による配信

Amazon Kinesis Video Streams CPP Producer, GStreamer Plugin and JNI

参考

処理の流れ (基本)

  1. KinesisVideoProducer インスタンスを生成
  2. ストリームを生成
  3. ストリームを開始
  4. ストリームにフレームデータを送信

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 &region) {
    // 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 インスタンスを生成

引数

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 vector()
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

ClientCallbackProvider

StreamCallbackProvider

  • StreamCallbackProvider interface
  • getCallbackCustomData() 必須
  • getStreamUnderflowReportCallback()
  • getStreamLatencyPressureCallback()
  • getDroppedFrameReportCallback()
  • getStreamConnectionStaleCallback()
  • getDroppedFragmentReportCallback()
  • getStreamErrorReportCallback()
  • getStreamReadyCallback()
  • getStreamClosedCallback()
  • getStreamDataAvailableCallback()
  • getFragmentAckReceivedCallback()
  • getBufferDurationOverflowPressureCallback()

CallbackProvider

ストリームを解放

コールバック

com/amazonaws/kinesis/video/client/Include.h に定義されている。