최신 업데이트:2023-06-25 17:32:47
라이브 스트리밍 산업의 발전에 따라 라이브 스트리밍을 통한 콘텐츠가 널리 채용되고 이에 따라 더 많아지고 있는 경쟁자와 사회 문제를 생겼습니다. 이러한 변화와 수요에 대응하기 위해 CDNetworks는 라이브 녹음 기능을 출시합니다.
기본 라이브 기록
라이브 스트리밍의 VoD 리뷰는 라이브 스트리밍 플랫폼에 필수 기능이 되었습니다. 또한 전세계 라이브 스트리밍 산업의 급속 발전에 대응하기 위해 많은 국가에서 플랫폼 감독 규제를 발표하였습니다. 후속의 검사에 대비하도록 많은 국가에서 라이브 스트리밍 콘텐츠를 로컬 저장을 요구하고 있습니다.
자체 제작 소스 라이브에 비해 CDN 라이브는 비용 면에서 압도적인 우위를 가지고 있습니다. CDNetworks 라이브 녹음 제품은 CDNetworks 라이브 스트리밍과 CDNetworks 클라우드 스토리지(약칭: WCS)의 결합으로 녹화와 저장의 원스톱 솔루션입니다.
선택 라이브 기록
CDNetworks는 CDN 협조를 받아 라이브 도메인에 사전 설정된 기본 라이브 기록 기능 외에도 고객 업무 요구에 따라 스트림 일부를 선택 녹화할 수 있는”선택 라이브 기록” 기능을 개발하였습니다.
이 기능은 주로 다음과 같이 적용됩니다:
기능 | 모드 | 설명 | API |
---|---|---|---|
기본 라이브 기록 | CDNetworks가 기록 규칙에 대해 고객과 협의한 후 고객을 위한 구성을 설정할 것입니다. 구성된 도메인/애플리케이션 이름/스트림 이름에 대한 기록이 자동으로 수행됩니다. | 아니오 | |
선택 라이브 기록 | 모드 1 | 고객이 API를 호출하여 라이브 스트리밍 녹화를 시작하거나 중지합니다. | 예 |
모드 2 | 고객이 API를 호출하여 아직 시작되지 않은 라이브 스트리밍에 대한 라이브 녹화 설정을 활성화하거나 비활성화합니다. | 예 |
라이브 녹화 파일이 생성된 후는 WCS에 업로드하고 녹화+저장+트랜스코딩의 원스톱 서비스를 구현합니다. 라이브 스트리밍을 VoD로 전환하는 시간은 초를 단위의 입자도로 조절할 수 있습니다.
녹화 방안은 다음과 같습니다.
녹화 콜백의 시작 및 중지
녹화가 시작되고 끝날 때 CDNetworks는 클라이언트 인터페이스 콜백을 통해 고객에게 알립니다. 콜백은 시기적절하고 효율적이며 인도는 2급입니다. 또한 빈번한 알림으로 인한 자원 낭비를 방지하기 위해 빈도와 횟수에 따라 알림을 병합할 수 있습니다.
녹음 알림 시작 중:
알림 주소의 예시: 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 | 예 | 기록 작업의 유일한 식별자입니다 |
streamname | 예 | 라이브 스트림 이름이고 형식은 “애플리케이션 이름”-”스트림 이름”입니다. |
ops | 예 | 기록 매개 변수이고 수출 형식 및 비트레이트 등 정보를 포함합니다. |
bucket | 예 | 기록 저장 공간의 이름입니다. |
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 | 예 | 기록 작업의 유일한 식별자입니다 |
streamname | 예 | 라이브 스트림 이름이고 형식은 “애플리케이션 이름”-”스트림 이름”입니다. |
ops | 예 | 기록 매개 변수이고 수출 형식 및 비트레이트 등 정보를 포함합니다. |
bucket | 예 | 기록 저장 공간의 이름입니다. |
code | 예 | 기록 작업의 상태 코드입니다. 값 1, 2, 3은 처리 중, 처리 실패 및 처리 성공을 표시합니다. |
desc | 예 | 작업 상태 코드에 대한 설명입니다. 값은 fileOperateActive, fileOperateFail 및 fileOperateSucceed로 처리 중, 처리 실패 및 처리 성공을 표시합니다. |
error | 아니오 | 오류 설명입니다 |
keys | 아니오 | 수출 파일 이름 목록입니다. 로그가 실패하면 이 필드는 null이 됩니다. |
urls | 아니오 | 수출 파일의 접근 주소 목록입니다. 로그가 실패하면 이 필드는 null이 됩니다. |
details | 아니오 | 수출 파일의 세부 정보입니다. 로그가 실패하면 이 필드는 null이 됩니다. |
key | 아니오 | 수출 파일 이름입니다. 로그가 실패하면 이 필드는 null이 됩니다. |
url | 아니오 | 수출 파일의 접근 주소입니다. 로그가 실패하면 이 필드는 null이 됩니다. |
duration | 아니오 | 수출 비디오 파일의 기간입니다. 로그가 실패하면 이 필드는 null이 됩니다. |
hash | 아니오 | 수출 비디오 파일의 해시 값입니다. 로그가 실패하면 이 필드는 null이 됩니다. |
fsize | 아니오 | 수출 비디오 파일의 크기입니다. 단위는 B(바이트)입니다. 로그가 실패하면 이 필드는 null이 됩니다. |
startTime | 아니오 | 녹화 시작 시간입니다 |
endTime | 아니오 | 녹화 종료 시간입니다 |
bit_rate | 아니오 | 수출 파일의 비디오 비트레이트입니다 |
resolution | 아니오 | 수출 파일의 비디오 해상도입니다 |
batch_notify_id | 아니오 | 병합을 알리는 관련 ID입니다. 여러 기록 작업에 대한 결과 알림을 병합이 구성된 경우 이 필드는 null입니다. |
고객이 기본 라이브 녹화를 활성화하려면 CDNetworks에 다음 정보를 제공해야 합니다:
CDNetworks 선택 라이브 녹화는 API 호출을 통해 구현되고 다음과 같은 두 가지 모드가 있습니다.
모드 1: 하나 또는 이상의 스트림이 시작될 때 API를 호출하여 라이브 스트리밍을 기록합니다. API 호출 시 기록이 시작되고 호출이 끝나면 기록이 종료됩니다. 설정은 이번 라이브 스트리밍에만 적용됩니다.
모드 2: 도메인, 애플리케이션 및 스트림의 입도 호출을 지원합니다. 라이브 스트리밍이 시작되지 않은 경우 API를 호출하여 기본 기록을 활성화합니다. 이 기능을 사용하면 라이브 스트리밍이 시작될 때 녹화가 시작되고 끝날 때 녹화가 종료됩니다. 기본 설정이 활성화되면 모든 라이브 스트리밍이 기록됩니다.
API는 접근 권한 제어를 가지고 있고 계정이 CDNetworks 서비스를 활성화하고 특정 규칙으로 매개 변수를 입력할 때만 올바르게 호출됩니다. 접근 제어는 n, r, k 세 개의 매개 변수로 정의되며 상세한 설명은 다음과 같습니다:
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
실시간 녹화 시작: 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 | 문자열 | 작업 종류 | 아니오 | No default value | Please refer to calling example, request method 1: POST |
type | 문자열 | 제어 유형 | 예 | record | record= record |
domain | 문자열 | 도메인 이름 | 예 | ws.test.com | |
appname | 문자열 | 애플리케이션 이름 | 예 | test | |
stream names | 문자열 | 스트림 이름 | 예 | Support multiple streams, and the stream names are separated by “,”, for example: push_test1,push_test2 | |
n | 문자열 | 사용자 | 예 | ||
r | 문자열 | 난수 | 예 | Current timestamp | |
k | 문자열 | 검증값 | 예 | Md5(r+token) |
시작 작업의 반환 값
정답 :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
}]
}
인증 매개 변수 누락: 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": "stream record part of failure",
"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, // prompt for non-success
"msg": "call wcs failure", // prompt for 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
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.ossin.cdnetworks.com/v2/api/stream_listen_setting.action(아시아 지역 사용);
http://livect.osame.cdnetworks.com /v2/api/stream_listen_setting.action(유럽과 미국 지역 사용);
다음 예시와 같이 사용합니다. 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 | 문자열 | 작업 종류 | 아니오 | No default value | Please refer to the example of call stopping, request method 1: POST |
type | 문자열 | 제어 유형 | 예 | record | Type=record, indicates recording |
domain | 문자열 | 도메인 이름 | 예 | ws.test.com | |
appname | 문자열 | 애플리케이션 이름 | 아니오 | test | |
stream names | 문자열 | 스트림 이름 | 아니오 | Support multiple streams, and the stream names are separated by “,”, for example: push_test1,push_test2 | |
n | 문자열 | 사용자 | 예 | ||
r | 문자열 | 난수 | 예 | Current timestamp | |
k | 문자열 | 검증값 | 예 | Md5(r+token) |
기록 시작 반환 값
정답: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 방법:
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 | 인증이 실패합니다 | 인증이 실패하였습니다 |
부호가 맞지 않습니다 | 서명가 오류입니다 | |
api이름, n, r, k가 없거나 비어 있습니다 | 매개 변수는 비워 둘 수 없습니다 | |
랜덤은 반복입니다. | 난수가 중복됩니다 | |
랜덤.길이 25 또는 키.길이 ne 32 | 난수 길이가 오류입니다 | |
Md5는 오류입니다. | MD5 검증이 오류입니다 | |
이 api에 접근할 권한이 없습니다. | 토큰 값을 찾을 수 없고 인터페이스에 접근할 권한이 없다고 보고합니다. | |
주파수가 제한수보다 큽니다 | 인터페이스 호출 주파수가 제한 횟수보다 큽니다 | |
사용자와 호스트는 관계가 없습니다 | 사용명이 이 도메인에 바인딩되지 않았습니다 | |
1003 | redisrealTime 테이블에서 라이브 채널 상태 오류를 가져옵니다 | |
persistentId 업데이트 실패 | ||
1004 | live_channel_status기록이 없습니다 | 기록한 스트림이 실시간 스트림에 없습니다 |
1005 | record_parameter_confis 기록이 없습니다 | 기록 매개 변수 설정이 없습니다 |
1006 | record_single_stream_startwcs result persistentId가 비어 있습니다 | 기록 매개 변수 설정이 완료되지 않았습니다 |
persistentId가 null이거나 비어 있습니다 | ||
1007 | WCS 인터페이스 호출 실패 및 오류 정보는 WCS에서 제공합니다 | |
wsc 호출이 실패합니다 | WCS 호출 오류입니다. 예를 들어 WCS에 연결할 수 없거나 연결 시간 초과 또는 구성된 WCS 주소 오류입니다 | |
1008 | 스트림 레코드 추가가 실패합니다 | 스트림 기록 설정이 오류입니다 |