最終更新日:2023-06-25 17:32:47
ライブストリーミング業界の発展は、インターネットにおけるライブストリーミングコンテンツの流行りをもたらしました。そして、多くの競合他社や社会問題が発生しました。このような変化やニーズに対応するため、CDNetworksはライブ録画機能をリリースしています。
Basic Live Recording
ライブストリーミングのVoDレビューは、ライブストリーミングプラットフォームにとって必要不可欠な機能となっています。また、世界的なライブストリーミング産業の急速な発展に伴い、多くの国ではプラットフォームを規制するルールが発表されており、ライブストリーミングコンテンツのローカルストレージは、検査のために将来多くの国で要求されることは予測されます。
CDNライブ録画は、自作によるライブ録画と比べたら、コスト面で圧倒的なアドバンテージを持っています。CDNetworksライブ録画は、CDNetworksライブストリーミングとCDNetworksクラウドストレージ(略してWCS)を組み合わせたプロダクトであり、録画プラスストレージのワンストップソリューションとして機能してくれます。
Selective Live Recording
CDNの協力によりライブドメインにあらかじめ設定され、Basic Live Recording機能に加えて、お客様のビジネスニーズに応じて、ストリームの一部を自在に録画できる機能となっています。
この機能は主に以下のようなシーンで活用されています。
特徴 | モード | 紹介 | API |
---|---|---|---|
Basic Live Recording | 録画ルールについて、お客様との話し合いが終わる次第、CDNetworksが設定を行います。そして、設定されたドメイン/アプリ名/ストリーム名に対して、自動的に録画が行われます。 | いいえ | |
Selective Live Recording | モード1 | お客様が呼び出したAPIを通じて、オンエアーのライブストリーミングの録画を開始または停止します。 | はい |
モード2 | お客様がAPIを呼び出し、開始されていないライブストリーミングのライブ録画設定を有効または無効にすることができます。 | はい |
ライブ録画ファイルが生成され、ライブストリーミングファイルをWCSにアップロードすると、録画+ストレージ+トランスコードのワンストップサービスが実行されます。ライブストリーミングをVoDに変換する際の時間対効果は、秒単位で管理することが可能です。
録画方法は以下の通りです。
録画開始と停止のコールバック
CDNetworksは、録画開始と終了時に、カスタマーインターフェースのコールバックからお客様に通知します。コールバックはセカンドレベルの粒度で、タイムリーかつ高効率も高いのです。また、通知の頻度や回数に応じて、通知を統合することで、頻繁な通知による資源の浪費を防ぐことができます。
録画開始のお知らせ:
通知アドレスの例:
http://abc.com?messagetype=wsrecord¬_start
注:アドレスが200を応答すると通知が成功することになります。
お知らせの内容:
通知アドレスには、URLセキュリティBase64でエンコードされたJson情報が届き、お客様はそれを解析することでコンテンツを取得します。解析後のコンテンツ形式は以下の通りです:
{
"persistentId": "<persistentId>",
"streamname": "<streamname>",
"ops": "<Record ops>",
"bucket": "<bucket>",
"batch_notify_id": "<batch_notify_id>"
}
フィールド名 | 必須項目 | 説明 |
---|---|---|
persistentId | はい | 録画タスクの一意識別子 |
ストリーム名 | はい | ライブストリーム名。形式は"アプリ名"-"ストリーム名"となります。 |
ops | はい | 出力形式やビットレートなどの情報を含む録画パラメータ。 |
バケット | はい | 録画用ストレージのスペース名 |
batch_notify_id | いいえ | 通知統合の関連ID。複数の録画タスクに対する結果通知統合が設定されている場合、このフィールドは NULLとなります。 |
録画停止通知:
通知アドレスの例:
http://abc.com?message_type=wsrecordfinish
注:アドレスが200を応答すると通知が成功することになります。
通知アドレスには、URLセキュリティBase64でエンコードされたJson情報が届き、お客様はそれを解析することでコンテンツを取得します。解析後のコンテンツ形式は以下の通りです:
{
"items": [
{
"persistentId": "< persistentId >",
"streamname": "<streamname>",
"ops": "<ops>",
"bucket": "<bucket>",
"code": "<code>",
"desc": "<desc>",
"error": "<error>",
"keys": [
"key1",
"key2",
"key3"
],
"urls": [
"url1",
"url2"
]
"detail": [
{
"key": "<key string>",
"url": "<url string>",
"duration": "<duration double>",
"hash": "<hash string>",
"fsize": "<fsize int>",
"startTime": "<startTime string>",
"endTime": "<endTime string>",
"bit_rate": "<bit_rate string>",
"resolution": "<resolution string>"
}
]
},
{
"persistentId": "<persistentId >",
"streamname": "<streamname>",
"ops": "<ops>",
"bucket": "<bucket>",
"code": "<code>",
"desc": "<desc>",
"error": "<error>",
"keys": [
"key1",
"key2",
"key3"
],
"urls": [
"url1",
"url2"
]
"detail": [
{
"key": "<key string>",
"url": "<url string>",
"duration": "<duration double>",
"hash": "<hash string>",
"fsize": "<fsize int>",
"startTime": "<startTime string>",
"endTime": "<endTime string>",
"bit_rate": "<bit_rate string>",
"resolution": "<resolution string>"
}
]
}
],
"batch_notify_id": "<batchnotifyid>"
}
フィールド名 | 必須 | 説明 |
---|---|---|
persistentId | はい | 録画タスクの一意識別子 |
ストリーム名 | はい | ライブストリーム名。形式は「アプリ名」-「ストリーム名」となります。 |
ops | はい | 出力形式やビットレートなどの情報を含む録画パラメータ。 |
バケット | はい | 録画用ストレージのスペース名 |
コード | はい | 録画タスクのステータスコード。値1、2、3はそれぞれ処理中、処理失敗、処理成功を意味します。 |
desc | はい | タスクステータスコードの説明。値は fileOperateActive、fileOperateFail、fileOperateSucceed であり、それぞれは処理中、処理失敗、処理成功を意味しています。 |
エラー | いいえ | エラーの説明 |
キー | いいえ | 出力ファイル名リスト。録画が失敗した場合、このフィールドはNULLとなります。 |
urls | いいえ | 出力ファイルのアドレスリスト。録画が失敗した場合、このフィールドはNULLとなります。 |
詳細 | いいえ | 出力ファイルの詳細情報。録画が失敗した場合、このフィールドはNULLとなります。 |
キー | いいえ | 出力ファイル名。録画が失敗した場合、このフィールドはNULLとなります。 |
url | いいえ | 出力ファイルのアドレス。録画が失敗した場合、このフィールドはNULLとなります。 |
再生時間 | いいえ | 出力映像ファイルの再生時間。録画が失敗した場合、このフィールドはNULLとなります。 |
ハッシュ | いいえ | 出力映像ファイルのハッシュ値。録画が失敗した場合、このフィールドはNULLとなります。 |
fsize | いいえ | 出力映像ファイルのサイズ、単位はB(バイト)です。録画が失敗した場合、このフィールドはNULLとなります。 |
開始時間 | いいえ | 録画の開始時刻 |
終了時刻 | いいえ | 録画終了時刻 |
ビットレート | いいえ | 出力ファイルの映像ビットレート |
解像度 | いいえ | 出力映像ファイルの解像度 |
batch_notify_id | いいえ | 通知統合の関連ID。複数の録画タスクに対する結果通知統合が設定されている場合、このフィールドは NULLとなります。 |
Basic Live Recordingを有効にする場合、お客様は以下の情報をCDNetworksに提出する必要があります。
CDNetworksのSelective Live Recordingは、API呼び出しで実装されます。2つのモードに分けることができます。
モード### 1: 1つ以上のストリームがスタートすると、APIを呼び出してライブストリーミングを録画します。APIが呼び出されると録画が開始し、呼び出しが終了すると録画も終了します。この設定は、このライブストリーミングにのみ有効です。
モード### 2: ドメイン名、アプリ名、ストリームの粒度での呼び出しに対応しています。ライブストリーミングが止めているとき、APIを呼び出して、デフォルトの録画を有効にします。この機能を使うと、ライブストリーミングが始まると録画も始まり、終わると録画も終了します。初期設定が有効になると、すべてのライブストリーミングが録画されます。
APIにはアクセス許可が必要です。アカウントがCDNetworksのサービスを有効にし、かつ一定のルールでパラメータを入力した場合にのみ、正しく呼び出されます。アクセス管理ポリシーは、n、r、kの3つのパラメータによって決められ、その詳細な説明は以下の通りです:
n: デフォルトでポータルプラットフォームのアカウント名に設定。
r: ユニークなランダム文字列。最大で10文字。タイムスタンプ推奨。
k: md5検証値。
MD5の計算方法:
k = md5(r+key)、つまり新しい文字列であり、rにkeyを加え、MD5でハッシュ化し、新しい値kに変換することです。
注:キーは、当社のカスタマーサービススタッフから取得できます。
例:
1.適用してキーを取得=012f37a3f2952
2.ランダムな文字列r=1409284800を生成
3.統合して新しい文字列を生成=1409284800012f37a3f2952
新しい文字列をMD5で計算し、k値を得る: b9fed80be752551834eec3e52fa94115
API アドレス: http://livect.ossin.cdnetworks.com/v2/api/stream_listen_call.action (アジア地域で使用)
http:// livect.osame.cdnetworks.com/v2/api/stream_listen_call.action (欧米地域で使用)
http://livect.ossin.cdnetworks.com/v2/api/stream_listen_call.action を例に挙げて説明します。
real-time recording開始:POST方法 URL:http://livect.ossin.cdnetworks.com/v2/api/stream_listen_call.action?type=record&domain=ws.test.cn&appname=test&streamnames=pushtest1, pushtest2&n=xxx&r=xxx&k=xxx
パラメータ仕様
フィールド名 | フィールドタイプ | フィールドの意味 | 必須項目 | デフォルト値 | 例 |
---|---|---|---|---|---|
_method | 文字列 | オペレーションタイプ | いいえ | デフォルト値なし | 呼び出し例、リクエスト方法1をご参照ください:ポスト |
タイプ | 文字列 | 管理方式 | はい | レコード | record= record |
ドメイン | 文字列 | ドメイン名 | はい | ws.test.com | |
アプリ名 | 文字列 | アプリ名 | はい | テスト | |
ストリーム名 | 文字列 | ストリーム名 | はい | 複数のストリームに対応しています。ストリーム名は「, 」で区切られます。例:push_test1,push_test2 | |
n | 文字列 | ユーザー | はい | ||
r | 文字列 | 乱数 | はい | 現在のタイムスタンプ | |
k | 文字列 | 検証値 | はい | Md5(r+トークン) |
起動タスクの戻り値
正 :HTTP-CODE 200
{
"msg": "success", // prompt
"http_code": 200, // business status
'trace_id': "0e06b1cb-5bfc-47e4-872f-6dac38dd0f54", // transaction record
"call_time": "2017-08-02 11:43:34", // request time
"list": [ // task details
{
"task": "flv", // file format
"id": "test", // stream name
"http_code": 200, // process succeed
"msg": null, // prompt
"persistentId": "21_111222233344567885555544" // file identifier
}]
}
Authentication parameter missing: HTTP-CODE 403
{
"msg": "apiName, n, r, k not exist or empty",
"http_code": 1002,
'trace_id': "74abec25-5662-4d6c-88a7-db15f7fd7e70",
"call_time": "2017-08-02 11:43:34"
}
無許なし:HTTP-CODE 403
一部失敗:HTTP-CODE 200,HTTP_BODY は次の通り:
{
"msg": 「ストリーム録画の一部が失敗しました",
"http_code": 1011,
'trace_id':cee8e3f7-e1ab-4d9c-ad98-2259045a6bac",
"call_time": "2017-08-02 11:43:34",
"list": [
{
"task": "flv",
"id": "id",
"http_code": 200,
"msg": null,
"persistentId": "21_111222233344567885555544"
},
{
"task": "jpg",
"id": "id",
"http_code": 1007, // 成功しなかった場合のプロンプト
"msg": "call wcs failure", // 失敗したときのプロンプト
"persistentId": null
}]
}
録画停止
POST方法:
URL:http://livect.ossin.cdnetworks.com/v2/api/stream_listen_call.action?type=record&domain=ws.test.com&appname=test&streamnames=pushtest1,pushtest2&n=xxx&r=xxx&k=xxx&_method=DELETE
削除方法:
URL:http://livect.ossin.cdnetworks.com/v2/api/stream_listen_call.action?type=record&domain=ws.test.com&appname=test&streamnames=pushtest1,pushtest2&n=xxx&r=xxx&k=xxx
停止タスクの戻り値
正しい:HTTP-CODE 200,HTTP-BODY は次の通り:
{
"msg": "success",
"http_code": 200,
'trace_id':"8fe8e186-8435-4f6b-b38e-d30854dfe467",
"call_time": "2017-08-02 11:43:34",
"list": [
{
"task": "jpg",
"http_code": 200,
"msg": "success",
"persistentId": "21_111222233344567885555544"
}]
}
リクエストパラメータエラー:HTTP-CODE 400
許可なし:HTTP-CODE 403
管理タスクが存在しません:HTTP-CODE 200,HTTP-BODY は次の通り:
{
"msg": "id:stop record param not exists;id2:stop record param not exists;",
"http_code": 1007,
'trace_id':3caed803-63d4-4e2a-8a8e-abc9160e2977",
"call_time": "2017-08-02 11:43:34",
"list": []
}
APIアドレス
http://livect.osame.cdnetworks.com /v2/api/stream_listen_setting.action(Used for Europe and America area);
We’ll use http://livect.ossin.cdnetworks.com/v2/api/ stream_listen_setting.action の例は次の通りです。
デフォルト録画開始
POST方法:
URL:http://livect.ossin.cdnetworks.com/v2/api/stream_listen_setting.action?type=record&domain=ws.test.com&appname=test&streamnames=pushtest1,pushtest2&n=xx&r=xx&k=xxx
パラメータの仕様
フィールド名 | フィールドタイプ | フィールドの意味 | 必須項目 | デフォルト値 | 例 |
---|---|---|---|---|---|
_method | 文字列 | オペレーションタイプ | いいえ | デフォルト値なし | 呼び出し停止、リクエスト方法1の例をご参照ください:ポスト |
タイプ | 文字列 | 管理方式 | はい | レコード | Type=record、録画を示します |
ドメイン | 文字列 | ドメイン名 | はい | ws.test.com | |
アプリ名 | 文字列 | アプリ名 | いいえ | テスト | |
ストリーム名 | 文字列 | ストリーム名 | いいえ | 複数のストリームに対応しています。ストリーム名は「, 」で区切られます。例:push_test1,push_test2 | |
n | 文字列 | ユーザー | はい | ||
r | 文字列 | 乱数 | はい | 現在のタイムスタンプ | |
k | 文字列 | 検証値 | はい | Md5(r+トークン) |
録画開始の戻り値
正しい:HTTP-CODE 200,HTTP-BODYは以下の通り:
{
"msg": "success",
"http_code": 200,
'trace_id':d891992f-ce3a-41d3-ac6e-37695e797aac",
"call_time": "2017-08-02 11:43:34"
}
認証パラメータがありません:HTTP-CODE 403
{
"msg": "apiName, n, r, k not exist or empty",
"http_code": 1002,
'trace_id':"74abec25-5662-4d6c-88a7-db15f7fd7e70",
"call_time": "2017-08-02 11:43:34"
}
許可なし:HTTP-CODE 403
録画停止
POST方法:
URL:http://livect.ossin.cdnetworks.com/v2/api/stream_listen_setting.action?type=record&domain=ws.test.com&appname=test&streamnames=pushtest1,pushtest2&n=xx&r=xx&k=xxx&_method=DELETE
DELETE method:
URL:http://livect.ossin.cdnetworks.com/v2/api/stream_listen_setting.action?type=record&domain=ws.test.com&appname=test&streamnames=pushtest1,pushtest2&n=xx&r=xx&k=xxx
録画停止時の戻り値
正しい場合:HTTP-CODE 200,HTTP-BODYは以下の通り:
{
"msg": "success",
"http_code": 200,
'trace_id':"8fe8e186-8435-4f6b-b38e-d30854dfe467",
"call_time": "2017-08-02 11:43:34",
"list": [
{
"task": "jpg",
"http_code": 200,
"msg": "success",
"persistentId": "21_111222233344567885555544"
}]
}
リクエストパラメータエラー:HTTP-CODE 400
許可なし:HTTP-CODE 403 Ø
管理タスクが存在しません:HTTP-CODE 200,HTTP-BODY は次の通り:
{
"msg": "id:stop record param not exists;id2:stop record param not exists;",
"http_code": 1007,
'trace_id':3caed803-63d4-4e2a-8a8e-abc9160e2977",
"call_time": "2017-08-02 11:43:34",
"list": []
}
録画のクエリタスク
GET方法:
URL:http://livect.ossin.cdnetworks.com/v2/api/stream_listen_setting.action?type=record&domain=ws.test.com&appname=test&streamnames=pushtest1,pushtest2&n=xx&r=xx&k=xxx
録画問合せタスクの戻り値
修正:HTTP-CODE 200,HTTP-BODYは以下の通り:
{
"msg": "success",
"http_code": 200,
'trace_id':"bed5431b-2569-488e-a71c-75ab76431a04",
"call_time": "2017-08-02 11:43:34",
"list": [
{
"function": "record",
"domain": "push.cloud-director.8686c.com",
"appName": "live",
"streamName": "1",
"isDeleted": 1,
"createTime": 1501582307
},
{
"function": "record",
"domain": "push.cloud-director.8686c.com",
"appName": "live",
"streamName": "2",
"isDeleted": 1,
"createTime": 1501582307
} ]
}
認証パラメータがありません:HTTP-CODE 403
{
"msg": "apiName, n, r, k not exist or empty",
"http_code": 1002,
'trace_id':"74abec25-5662-4d6c-88a7-db15f7fd7e70",
"call_time": "2017-08-02 11:43:34"
}
許可なし:HTTP-CODE 403
コード | プロンプト | 説明 |
---|---|---|
1001 | リクエストパラメータは不完全です | パラメータが欠けています |
リクエストパラメータチャンネルのエラー | ドメイン名エラー | |
1002 | 認証失敗 | 認証できませんでした |
サインは正しくありません | 署名エラー | |
apiName, n, r, k が存在しないか、または空です。 | パラメータが入力されていません | |
ランダムは繰り返し | 乱数の繰り返し | |
random.lengthgt 25 or key.length ne 32 | 乱数長さの誤差 | |
Md5がエラー | MD5検証エラー | |
このAPIにアクセスする権利がありません。 | トークン値が見つかりません。インターフェースへのアクセス権がないことを報告します | |
頻度がlimitCountより大きいです | インターフェイスの呼び出し回数が制限回数を上回っています | |
ユーザとホストは関係がありません | 使用名はこのドメインに登録されていません | |
1003 | redisrealTimeテーブルからliveChannelStatusを取得するにエラーが発生しました | |
PersistentId更新失敗 | ||
1004 | live_channel_status レコードが存在しません | リアルタイムストリームの中に、録画するストリームが存在しません |
1005 | レコードのパラメータが存在しません | 録画パラメータ構成が存在しません |
1006 | ecord_single_stream_startwcs’sbの結果のpersistentId が空です | 録画パラメータの設定が完了していません |
persistentIdがnullまたは空です | ||
1007 | WCSインターフェースの呼び出しが失敗し、エラー情報はWCSから提供されています | |
呼び出しWSC失敗 | WCSの呼び出しエラー。例:WCSに接続できません。接続タイムアウト、設定WCSアドレスのエラー | |
1008 | ストリームレコードの追加失敗 | ストリーム録画設定エラー |