최신 업데이트:2022-04-14 16:08:55
라이브 스트리밍 산업의 발전에 따라 라이브 스트리밍을 통한 콘텐츠가 널리 채용되고 이에 따라 더 많아지고 있는 경쟁자와 사회 문제를 생겼습니다. 이러한 변화와 수요에 대응하기 위해 CDNetworks는 실시간 캡처 기능을 출시합니다.
기본 실시간 캡처
정부는 포르노, 테러리즘 또는 기타 불법 콘텐츠를 금지했습니다. 인터랙티브 스트리밍 업무에서 라이브 콘텐츠가 앵커가 직접 전송하기 때문에 전통적인 인공 식별 방법으로 콘텐츠 불법 여부를 통제하기 어렵습니다.
이런 상황에서 CDNetworks는 고객이 영상 형식의 라이브 스트리밍 미디어 콘텐츠를 얻을 수 있도록 실시간 캡처 서비스를 제공하여 이미지를 통한 영상 모니터링을 실현합니다. 이미지로 포르노를 식별하는 일부 앱과 연동하여 자동 식별을 실현하고 인건비가 크게 절감되며, 고객사 네트워크가 수백 개의 비디오 스트림을 동시에 모니터링할 수 없는 문제를 해결합니다.
이와 동시에 라이브 스트리밍 방식도 점점 다양해지고 있어 라이브 스트리밍 플랫폼은 라이브 캡처 이미지를 스트리밍룸 커버로 만들거나 더 많은 서비스 혁신을 도입해야 합니다. 기본 실시간 캡처는 이러한 요구에는 적용됩니다.
CDNetworks는 수시로 접근할 수 있게 실시간 캡처 이미지를 CDNetworks 클라우드 스토리지(약칭 WCS)에 저장할 수 있도록 지원합니다.
선택 실시간 캡처
CDNetworks 캡처 기능은 선택할 수 있는 실시간 캡처 기능을 제공합니다. 고객이 업무 수요에 따라 특정 스트림에 대한 캡처를 선택할 수 있습니다. 일반적인 라이브 스트리밍 플랫폼은 “키” 앵커의 실시간 캡처만 하여 룸 커버로 사용할 수 있지만 플랫폼 운영 중인 모든 앵커 스트리밍을 진행할 수 없습니다.
두 가지 기능 비교는 다음과 같습니다:
기능 | 모드 | 설명 | API |
---|---|---|---|
기본 실시간 캡처 | 모드 1 | 고객이 API를 호출하여 라이브 스트림의 단일 캡처 화면을 가져옵니다. | 예 |
모드 2 | CDNetworks는 캡처 규칙을 고객과 협의한 후 고객을 위한 캡처 기능을 활성화합니다. 캡처 화면은 캡처하는 도메인/애플리케이션 이름/스트림 이름에 따라 자동으로 생성됩니다. | 아니오 | |
선택 실시간 화면 캡 | 모드 1 | 고객이 API를 호출하여 라이브 스트리밍의 캡처를 시작하거나 중지합니다. | 예 |
모드 2 | 고객이 API를 호출하여 아직 시작되지 않은 라이브 스트리밍에 대한 캡처를 활성화하거나 비활성화합니다. | 예 |
미디어 가속 라이브 방송
현재, CDNetworks 기본 실시간 캡처는 두 가지 모드를 지원합니다.
CDNetworks는 실시간 캡처 기능을 제공합니다. 고객이 이미지 요청을 발송하면 요청 URL은 캡처 기능을 트리거하고 CDNetworks는 라이브 스트리밍의 캡처 이미지로 고객에게 응답합니다. 즉 CDNetworks는 고객 요청에 의해 캡처를 제공하지만 캡처 이미지는 저장하지 않습니다.
고객 요청 형식: “http://www.test.com/live/livestream.jpg”
형식 예시:
“www.test.com” is the domain of the new image;
“livestream.jpg” is the live streaming name.
Recommended request frequency: once per 30 seconds.
포르노 식별의 인건비 절감하고 식별의 효율성을 향상시키며, 포르노 식별 앱을 더 잘 지원하기 위해 CDNetworks는 라이브 스트리밍의 타임 캡처 기능을 제공합니다. 앵커가 라이브 스트림 푸시를 실행하면 CDNetworks WCS 플랫폼은 고객과 협의한 빈도에 따라 스트림의 캡처를 하고 이미지를 WCS 플랫폼에 저장합니다. 고객에게 캡처 이미지를 알리기 위해 API가 호출됩니다.
모드 2는 현재 라이브 스트리밍 플랫폼에서 일반적으로 사용되는 모드입니다.
모드 2의 콜백 설명
콜백
액티브 실시간 캡처는 고객 API를 콜백하여 캡처 이미지 정보를 고객에게 알려줍니다. 빈번한 알림으로 인한 자원 소모를 방지하기 위해 여러 콜백 알림을 통합할 수 있습니다.
콜백 빈도는 너무 잦으면 안 되고 권장 콜백 주파수는 60S 또는 100개 이미지마다 한번입니다.
캡처 콜백 시작 및 중지
캡처 알림 시작 중:
알림 주소 예시: http://abc.com?message_type=ws_record¬_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=ws_record_finish
참고: 주소가 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"
]
},
{
"persistentId": "< persistentId >",
"streamname": "<streamname>",
"ops": "<ops>",
"bucket": "<bucket>",
"code": "<code>",
"desc": "<desc>",
"error": "<error>",
"keys": [
"key1",
"key2",
"key3"
],
"urls": [
"url1",
"url2"
]
}
],
"batch_notify_id": "<batchnotifyid>"
}
필드 이름 | 필수 필드 | 설명 |
---|---|---|
persistentId | 예 | 캡처 작업의 유일한 식별자입니다 |
streamname | 예 | 라이브 스트림 이름이고 형식은 “애플리케이션 이름”-”스트림 이름”입니다. |
ops | 예 | 캡처 매개 변수이고 수출 형식 및 주파수 등 정보를 포함합니다. |
bucket | 예 | 캡처 저장 공간의 이름입니다. |
code | 예 | 캡처 작업의 상태 코드입니다. 값 1, 2, 3은 처리 중, 처리 실패 및 처리 성공을 표시합니다. |
desc | 예 | 작업 상태 코드에 대한 설명입니다. 값은 fileOperateActive, fileOperateFail 및 fileOperateSucceed로 처리 중, 처리 실패 및 처리 성공을 표시합니다. |
error | 아니오 | 오류 설명입니다 |
keys | 아니오 | 수출 파일 이름 목록입니다. 캡처가 실패하면 이 필드는 null이 됩니다. |
urls | 아니오 | 수출 파일의 접근 주소 목록입니다. 로그가 실패하면 이 필드는 null이 됩니다. |
batch_notify_id | 아니오 | 병합을 알리는 관련 ID입니다. 여러 캡처 작업에 대한 결과 알림을 병합이 구성된 경우 이 필드는 null입니다. |
모드 #2 지원 설정:
모드 # 1
고객이 이 기능을 사용하려면 다음 정보를 제공해야 합니다:
모드 # 2
고객이 이 기능을 사용하려면 다음 정보를 제공해야 합니다:
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.actiontype=frame&domain=ws.test.com&appname=test&streamnames=push_test1,push_test2&n=xxx&r=xxx&k=xxx
매개 변수 설명
필드 이름 | 필드 유형 | 필드 의미 | 필수 필드 | 기본값 | 예시 |
---|---|---|---|---|---|
_method | 문자열 | 작업 종류 | 아니오 | No default value | Please refer to the call stopping example, and its request method is POST. |
type | 문자열 | 제어 유형 | 예 | type=frame, which means screenshot. | |
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, // Operation status
"trace_id": "0e06b1cb-5bfc-47e4-872f-6dac38dd0f54", //Transaction record
"call_time": "2017-08-02 11:43:34", // Request time
"list": [ // Task details
{
"task": "jpg", // File format
"id": "test", // Stream name
"http_code": 200, // Processing succeeded
"msg": null, // Prompt
"persistentId": "21_111222233344567885555544" // File ID
}]
}
인증 매개 변수 누락: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": "jpg",
"id": "id",
"http_code": 200,
"msg": null,
"persistentId": "21_111222233344567885555544"
},
{
"task": "jpg",
"id": "id",
"http_code": 1007, // Prompt of unsuccessful operation
"msg": "call wcs failure", // Prompt of operation failure
"persistentId": null
}]
}
캡처 중지
POST 방법:
URL:http://livect.ossin.cdnetworks.com/v2/api/stream_listen_call.action?type=frame&domain=ws.test.com&appname=test&streamnames=push_test1,push_test2&n=xxx&r=xxx&k=xxx&_method=DELETE
DELETE 방법:
URL:http://livect.ossin.cdnetworks.com/v2/api/stream_listen_call.action?type=frame&domain=ws.test.com&appname=test&streamnames=push_test1,push_test2&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=frame&domain=ws.test.com&appname=test&streamnames=push_test1,push_test2&n=xx&r=xx&k=xxx
매개 변수 설명
필드 이름 | 필드 유형 | 필드 의미 | 필수 필드 | 기본값 | 예시 |
---|---|---|---|---|---|
_method | 문자열 | 작업 종류 | 아니오 | No default value | Please refer to the call stopping example, and its request method is POST. |
type | 문자열 | 제어 유형 | 예 | type=frame, which means screenshot. | |
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=frame&domain=ws.test.com&appname=test&streamnames=push_test1,push_test2&n=xx&r=xx&k=xxx&_method=DELETE
DELETE 방법:
URL:http://livect.ossin.cdnetworks.com/v2/api/stream_listen_setting.action?type=frame&domain=ws.test.com&appname=test&streamnames=push_test1,push_test2&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=frame&domain=ws.test.com&appname=test&streamnames=push_test1,push_test2&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가 없거나 비어 있습니다 | 매개 변수는 비워 둘 수 없습니다 | |
랜덤은 반복입니다. | 난수가 중복됩니다 | |
랜덤.길이 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 | 스트림 레코드 추가가 실패합니다 | 스트림 기록 설정이 오류입니다 |