[Kinesis Video Streams] (新機能)GetClip APIを使用するとストリームから一発でmp4が取得できるので超捗る

2020.04.30

1 はじめに

CX事業本部の平内(SIN)です。

昨日、Amazon Kinesis Video Streams(以下、Kinesis Video Streams)で、新しいAPI(GetClip API)が利用可能になったとアナウンスがありました。
Amazon Kinesis Video Streams adds API support to easily retrieve media clips

これまで、Kinesis Video Streamsに保存されたデータを取得するためには、GetStreamsのようなAPIを利用して、フラグメント単位のデータを取得する方法しかありませんでした。また、取得したデータは、Matroska (MKV) 仕様となっており、一般に利用されるmp4などへは、改めて変換が必要でした。

GetClip APIを使用すると、いきなり、mp4が取得できるようになったとのことです。

2 AWS コンソールから利用する

GetClip APIがサポートされた事で、Kinesis Video Streamsのコンソール上で、Media playbackDownload Clipというボタンが追加されました。

ボタンをクリックすると、次のようなダイアログが表示され、そのままDownloadをクリックするだけで、先頭から最大3分のmp4がダウンロードできます。

上記のダイアログで、Time rangeStart and End timeに変更すると、取得する時間帯を指定できます。

時間指定(タイムスタンプ)は、Producer timestamp(データ送信側で記録した時間)と、Server timestamp(データ受信側で記録した時間)の2種類が選択できます。

注意書きにある通り、指定できる時間は、分単位であり、100MByte未満、200フラグメントに制限されています。

3 SDKから利用する

AWS SDK(AWS.KinesisVideoArchivedMedia)では、GetClipが追加されています。
Developer Guide - GetClip
Class: AWS.KinesisVideoArchivedMedia

下記は、データ取得してみたコードになります。 GetClipの前に、GET_CLIPを指定して、エンドポイントを取得する要領は、他のAPIと同じです。

const fs = require('fs');

const AWS = require("aws-sdk");
AWS.config.credentials = new AWS.SharedIniFileCredentials({ profile: 'developer' });
AWS.config.update({ region: 'ap-northeast-1' });


async function main(){
    // 取得するストリーム    
    const streamName = 'testStream';

    const kinesisvideo = new AWS.KinesisVideo();
    // EndPointで初期化して、KinesisVideoArchivedMediaを生成する
    const params = {
        APIName: "GET_CLIP",
        StreamName: streamName
    };
    const e = await kinesisvideo.getDataEndpoint(params).promise();
    const kinesisvideoarchivedmedia = new AWS.KinesisVideoArchivedMedia({endpoint: e.DataEndpoint});

    // 2020/4/30 9:21:00 - 9:30:00の間のデータを取得する
    startTime = new Date(2020, 4 - 1, 30, 9, 21, 0);
    endTime = new Date(2020, 4 - 1, 30, 9, 30, 0);

    const params = {
        ClipFragmentSelector: { 
          FragmentSelectorType: "PRODUCER_TIMESTAMP",
          TimestampRange: {
            EndTimestamp: endTime,
            StartTimestamp: startTime 
          }
        },
        StreamName: streamName // StreamName若しくは、StreamARNの指定が必須 
    };
    const data = await kinesisvideoarchivedmedia.getClip(params).promise();

    const filePath = "./test.mp4"
    fs.writeFileSync(filePath, data.Payload);
}


main()

4 最後に

今回、Kinesis Video Streamsに新しく追加された、GetClipについて確認してみました。

これまでのように、フラグメントを意識(理解)する必要がなくなったので、データ取得のハードルは一気に下がったように感じます。 また、コンソールから、軽易にmp4で取得出来るのは、色々と捗るのではないでしょうか。