tencent cloud

피드백

TRTC 클라우드 녹화 설명

마지막 업데이트 시간:2023-04-25 15:08:59
    온라인 교육, 라이브 쇼, 화상 회의, 온라인 의료, 원격 은행 등의 응용 시나리오에서 콘텐츠 심사, 비디오 보관 및 비디오 재생 등의 필요성 때문에 전체 영상 통화 또는 인터랙션 라이브 방송 프로세스를 녹화하고 저장해야 하는 경우가 많습니다. 이는 클라우드 녹화 기능을 통해 구현할 수 있습니다.

    기능 개요

    TRTC의 클라우드 녹화 기능을 통해 REST API 인터페이스를 호출하여 녹화할 멀티미디어 스트림을 구독하는 클라우드 녹화 작업을 실행하고 실시간으로 효율적인 제어를 진행할 수 있습니다. 또한 개발자가 직접 서버 및 녹화 관련 모듈을 배치할 필요가 없으므로 보다 편리합니다.
    녹화 모드: 단일 스트림 녹화는 방에 있는 각 사용자의 멀티미디어 스트림을 독립된 파일로 녹화할 수 있습니다. 혼합 스트림 녹화는 같은 방의 멀티미디어 스트림을 하나의 파일로 믹싱하여 녹화합니다.
    구독 스트림: 구독 사용자의 블록리스트/얼로우리스트 방식으로 구독할 사용자 미디어 스트림 지정 지원
    트랜스 코딩 매개변수: 혼합 스트림 시나리오에서 코덱 매개변수를 설정하여 비디오 녹화 파일의 품질 지정 지원
    혼합 스트림 매개변수: 혼합 스트림 시나리오에서 다양한 유연하고 가변적인 자동 다중 화면 레이아웃 템플릿 및 사용자 정의 레이아웃 템플릿 지원
    CFS: 지정된 녹화 파일을 클라우드 스토리지/VOD로 저장 지원, 현재 클라우드 스토리지 벤더는 Tencent Cloud의 COS 스토리지 지원, VOD 벤더는 Tencent Cloud VOD 지원 (향후 다른 클라우드 벤더의 스토리지 및 VOD 서비스를 지원할 예정이며, 이 때 클라우드 서비스 계정이 필요하고, 클라우드 스토리지 서비스는 스토리지 매개변수를 제공해야 함)
    콜백 공지: 콜백 공지 능력 지원, 콜백 도메인을 설정하여 클라우드 녹화의 이벤트 상태를 귀하의 콜백 서버로 공지

    단일 스트림 녹화

    单流录制
    
    이미지는 단일 스트림 녹화 시나리오를 보여줍니다. 방 1234에서 호스트 1과 호스트 2 모두 멀티미디어를 업스트림 했습니다. 호스트 1과 호스트 2의 멀티미디어 스트림을 구독하고 녹화 모드를 단일 스트림 녹화로 설정한다고 가정합니다. 녹화 백그라운드는 각각 호스트 1 및 호스트 2의 멀티미디어 스트림을 풀링해 다음을 포함한 독립 미디어 파일에 녹화합니다.
    1. 호스트 1의 비디오 M3U8 인덱스 파일;
    2. 호스트 1의 여러 비디오 TS 슬라이스 파일;
    3. 호스트 1의 오디오 M3U8 인덱스 파일;
    4. 호스트 1의 여러 오디오 TS 슬라이스 파일;
    5. 호스트 2의 비디오 M3U8 인덱스 파일;
    6. 호스트 2의 여러 비디오 TS 슬라이스 파일;
    7. 호스트 2의 오디오 M3U8 인덱스 파일;
    8. 호스트 2의 여러 오디오 TS 슬라이스 파일;
    녹화 백그라운드는 이 파일을 지정한 클라우드 스토리지 서버에 업로드합니다. 귀하의 업무 백그라운드는 이러한 녹화 파일을 풀링하고 업무 요구에 따라 이러한 파일을 병합 트랜스 코딩해야 합니다. 멀티미디어 병합 트랜스 코딩 스크립트를 제공합니다.

    혼합 스트림 녹화

    混流录制
    
    이미지는 혼합 스트림 녹화 시나리오를 보여줍니다. 방 1234에서 호스트 1과 호스트 2 모두 멀티미디어를 업스트림 했습니다. 호스트 1과 호스트 2의 멀티미디어 스트림을 구독하고 설정한다고 가정합니다. 녹화 모드를 혼합 스트림 녹화로 설정하면 녹화 백그라운드는 각각 호스트 1 및 호스트 2의 멀티미디어 스트림을 풀링하고 설정한 다중 화면 템플릿에 따라 비디오 스트림을 혼합하고 오디오 스트림을 혼합합니다. 마지막으로 미디어 스트림은 다음을 포함하여 하나의 미디어 파일로 혼합됩니다.
    1. 혼합 스트림 후 비디오 M3U8 인덱스 파일;
    2. 혼합 스트림 후 여러 비디오 TS 슬라이스 파일;
    녹화 백그라운드는 이 파일을 지정한 클라우드 스토리지 서버에 업로드합니다. 귀하의 업무 백그라운드는 이러한 녹화 파일을 풀링하고 업무 요구에 따라 이러한 파일을 병합 트랜스 코딩해야 합니다. 멀티미디어 병합 트랜스 코딩 스크립트를 제공합니다.
    주의사항:
    녹화 인터페이스 호출 빈도는 20qps로 제한됩니다.
    단일 인터페이스 타임 아웃 시간은 6초입니다.
    기본 동시 녹화는 100개 채널을 지원합니다. 더 많은 채널이 필요한 경우 티켓 제출을 통해 문의해주십시오.
    단일 녹화 작업은 동시에 구독할 수 있는 단일 방에서 최대 25개의 멀티미디어 스트림을 지원합니다.

    호출 프로세스

    1. 녹화 실행

    백그라운드 서비스를 통해 REST API(CreateCloudRecording)를 호출하여 클라우드 녹화를 실행하며 주의해야 할 매개변수는 다음과 같습니다.

    작업 ID(TaskId)

    이 매개변수는 녹화 작업의 고유 식별자입니다. 녹화 작업 인터페이스에서 후속 작업을 위해 작업 ID를 입력 매개변수로 저장해야 합니다.

    녹화 모드(RecordMode)

    단일 스트림 녹화, 구독한 호스트의 오디오 및 비디오 파일을 방에 별도로 녹화하고 녹화된 파일(M3U8/TS)을 클라우드 스토리지에 업로드합니다.
    혼합 스트림 녹화, 방에서 구독하는 모든 호스트의 멀티미디어 스트림을 하나의 멀티미디어 파일로 혼합하고 녹화 파일 [M3U8/TS]를 클라우드 스토리지에 업로드합니다.

    사용자 블록리스트/얼로우리스트 녹화(SubscribeStreamUserIds)

    기본적으로 클라우드 녹화는 방의 모든 미디어 스트림(최대 25개 채널)을 구독합니다. 이 매개변수를 통해 호스트 사용자의 블록리스트/얼로우리스트 구독을 지정할 수도 있으며, 물론 녹화 중 업데이트 작업도 지원합니다.

    클라우드 스토리지 매개변수(StorageParams)

    클라우드 스토리지 매개변수를 지정하여 귀하가 활성화한 지정된 클라우드 스토리지/VOD 서비스에 녹화된 파일을 업로드합니다. 클라우드 스토리지/VOD 공간 매개변수의 유효성에 주의하고 연체되지 않도록 주의하십시오. 녹화 파일 이름은 고정 규칙이 있습니다.
    녹화 파일명 이름 생성 규칙
    단일 스트림 녹화 M3U8 파일 이름 규칙: <Prefix>/<TaskId>/<SdkAppId>_<RoomId>__UserId_s_<UserId>__UserId_e_<MediaId>_<Type>.m3u8
    단일 스트림 녹화 TS 파일 이름 규칙: <Prefix>/<TaskId>/<SdkAppId>_<RoomId>__UserId_s_<UserId>__UserId_e_<MediaId>_<Type>_<UTC>.ts
    단일 스트림 녹화 mp4 파일 이름 규칙: <Prefix>/<TaskId>/<SdkAppId>_<RoomId>__UserId_s_<UserId>__UserId_e_<MediaId>_<Index>.mp4
    혼합 스트림 녹화 M3U8 파일 이름 규칙: <Prefix>/<TaskId>/<SdkAppId>_<RoomId>.m3u8
    혼합 스트림 녹화 TS 파일 이름 규칙: <Prefix>/<TaskId>/<SdkAppId>_<RoomId>_<UTC>.ts
    혼합 스트림 녹화 mp4 파일 이름 규칙: <Prefix>/<TaskId>/<SdkAppId>_<RoomId>_<Index>.mp4
    고가용성 풀업 후 파일 이름 규칙 데이터 센터에서 클라우드 녹화 서비스 장애 시 고가용성 솔루션을 통해 녹화 작업을 복구합니다. 이 경우 원본 녹화 파일을 덮어쓰기하지 않기 위해 풀업 후 접두사 ha<1/2/3>를 추가하여 발생한 고가용성의 횟수를 나타냅니다. 녹화 작업에 허용되는 최대 풀업 횟수는 3회입니다.
    단일 스트림 녹화 M3U8 파일 이름 규칙: <Prefix>/<TaskId>/ha<1/2/3>_<SdkAppId>_<RoomId>__UserId_s_<UserId>__UserId_e_<MediaId>_<Type>.m3u8
    단일 스트림 녹화 TS 파일 이름 규칙: <Prefix>/<TaskId>/ha<1/2/3>_<SdkAppId>_<RoomId>__UserId_s_<UserId>__UserId_e_<MediaId>_<Type>_<UTC>.ts
    혼합 스트림 녹화 M3U8 파일 이름 규칙: <Prefix>/<TaskId>/ha<1/2/3>_<SdkAppId>_<RoomId>.m3u8
    혼합 스트림 녹화 TS 파일 이름 규칙: <Prefix>/<TaskId>/ha<1/2/3>_<SdkAppId>_<RoomId>_<UTC>.ts

    필드 설명:

    <Prefix>: 녹화 매개변수에 설정된 파일 이름 접두사는 설정되지 않은 경우 존재하지 않음; <TaskId>: 녹화된 작업 ID는 전역 고유하며 녹화 실행 후 반환된 매개변수에 있음; <SdkAppId>: 녹화 작업의 SdkAppId; <RoomId>: 녹화 방 번호; <UserId>: 특수 base64 처리 후 녹화 스트림의 사용자 ID, 아래 주의사항 참고; <MediaId>: 메인/서브스트림 식별, main 또는 aux; <Type>: 녹화 스트림 유형, audio 또는 video; <UTC>: 파일이 시작된 UTC 녹화 시간, 시간대 UTC+0, 년, 월, 일, 시, 분, 초 및 밀리초로 구성; <Index>: mp4 슬라이스 로직이 트리거되지 않으면(크기가 2GB를 초과하거나 지속 시간이 24시간을 초과하는 경우) 이 필드가 없음. 그렇지 않으면 슬라이스의 인덱스 번호가 1부터 증가; ha<1/2/3>: 고가용성 풀업 접두사, 예를 들어 첫 번째 풀업은 <Prefix>/<TaskId>/ha1_<SdkAppId>_<RoomId>.m3u8로 변환
    주의사항:
    <RoomId>가 문자열 방 ID인 경우 먼저 방 ID에 대해 base64 작업을 수행하고 base64 다음 문자열에서 '/' 기호를 '-'(하이픈)으로 변경하고, 기호 '='를 '.'로 변경; 녹화 스트림의 <UserId>는 먼저 base64 작업을 수행하고 base64 다음 문자열에서 '/' 기호를 '-'(하이픈)으로 변경하고 '=' 기호를 '.'로 변경.

    녹화 시작 시간 가져오기

    녹화가 시작되는 시간은 서버가 호스트로부터 처음으로 멀티미디어 데이터를 수신하고 첫 번째 파일 녹화를 시작하는 unix 시간으로 정의됩니다. 녹화 시작 타임스탬프를 가져오는 3가지 방법:
    녹화 파일 인터페이스(DescribeCloudRecording)에서 BeginTimeStamp 필드 쿼리
    예를 들어 다음 쿼리 인터페이스에서 반환된 정보는 BeginTimeStamp가 1622186279144ms임을 보여줍니다.
    {
    "Response":{
    "Status": "xx",
    "StorageFileList": [
    {
    "TrackType": "xx",
    "BeginTimeStamp": 1622186279144,
    "UserId": "xx",
    "FileName": "xx"
    }
    ],
    "RequestId": "xx",
    "TaskId": "xx"
    }
    }
    M3U8 파일에서 해당 태그 항목 읽기(\\#EXT-X-TRTC-START-REC-TIME)
    예를 들어 다음 M3U8 파일은 녹화 시작의 unix 타임스탬프가 1622425551884ms임을 표시합니다.
    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-ALLOW-CACHE:NO
    #EXT-X-MEDIA-SEQUENCE:0
    #EXT-X-TARGETDURATION:70
    #EXT-X-TRTC-START-REC-TIME:1622425551884
    #EXT-X-TRTC-VIDEO-METADATA:WIDTH:1920 HEIGHT:1080
    #EXTINF:12.074
    1400123456_12345__UserId_s_MTY4NjExOQ..__UserId_e_main_video_20330531094551825.ts
    #EXTINF:11.901
    1400123456_12345__UserId_s_MTY4NjExOQ..__UserId_e_main_video_20330531094603825.ts
    #EXTINF:12.076
    1400123456_12345__UserId_s_MTY4NjExOQ..__UserId_e_main_video_20330531094615764.ts
    #EXT-X-ENDLIST
    녹화 콜백 이벤트 수신
    콜백 구독을 통해 이벤트 유형 307의 BeginTimeStamp 필드에서 녹화 파일에 해당하는 녹화 시작 타임스탬프 가져오기 예를 들어 다음 콜백 이벤트에서 이 파일의 녹화 시작에 대한 unix 타임스탬프가 1622186279144ms임을 읽을 수 있습니다.
    {
    "EventGroupId": 3,
    "EventType": 307,
    "CallbackTs": 1622186289148,
    "EventInfo": {
    "RoomId": "xx",
    "EventTs": "1622186289",
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "FileName": "xx.m3u8",
    "UserId": "xx",
    "TrackType": "audio",
    "BeginTimeStamp": 1622186279144
    }
    }
    }

    혼합 스트림 녹화 워터마크 매개변수(MixWatermark)

    혼합 스트림 녹화에서 이미지 추가 워터마크를 지원하며 최대 개수는 25개이며 워터마크는 캔버스의 어느 곳에나 추가할 수 있습니다.
    필드 이름
    설명
    Top
    비디오의 왼쪽 상단 모서리에서 워터마크 수직 오프셋
    Left
    비디오 왼쪽 상단 모서리에서 워터마크 수평 오프셋
    Width
    워터마크 폭
    Height
    워터마크 높이
    url
    워터마크 파일의 URL

    혼합 스트림 녹화 레이아웃 모드 매개변수(MixLayoutMode)

    3x3 그리드 레이아웃(기본값), 플로팅 레이아웃, 화면 공유 레이아웃 및 사용자 정의 레이아웃 4가지 레이아웃을 지원합니다.
    3x3 그리드 레이아웃:
    호스트 수에 따라 각 화면의 크기가 자동으로 조절되며, 각 호스트의 화면 크기는 동일하며 최대 25개의 화면을 지원합니다.
    1개의 서브 화면이 있는 경우: 각 작은 화면의 너비와 높이는 각각 전체 캔버스 너비와 높이;
    2개의 서브 화면이 있는 경우: 각 작은 화면의 너비는 전체 캔버스 너비의 1/2; 각 작은 화면의 높이는 전체 캔버스 높이;
    4개 이하의 서브 화면이 있는 경우: 각 작은 화면의 너비와 높이는 각각 전체 캔버스 너비와 높이의 1/2;
    9개 이하의 서브 화면이 있는 경우: 각 작은 화면의 너비와 높이는 각각 전체 캔버스 너비와 높이의 1/3;
    16개 이하의 서브 화면이 있는 경우: 각 작은 화면의 너비와 높이는 각각 전체 캔버스 너비와 높이의 1/4;
    16개 이상의 서브 화면이 있는 경우: 각 작은 화면의 너비와 높이는 각각 전체 캔버스 너비와 높이의 1/5;
    다음 이미지와 같이 구독 서브 화면이 증가함에 따라 3x3 그리드의 레이아웃 변경:
    九宫格布局1
    
    플로팅 레이아웃:
    기본적으로 방에 입장하는 첫 번째 호스트(호스트를 지정 가능)의 영상 화면이 전체 화면을 채웁니다. 다른 호스트들의 영상 화면은 왼쪽 하단 모서리부터 방에 들어가는 순서대로 가로로 배열되어 작은 화면으로 표시되고 작은 화면은 큰 화면 위에 플로팅됩니다. 화면 수가 17개 이하일 경우 1줄에 4개(4 x 4 배열). 화면 개수가 17개 이상일 경우 작은 화면을 한 줄에 5개(5 x 5)로 다시 레이아웃합니다. 최대 25개의 화면을 지원하며 사용자가 오디오만 보내는 경우 여전히 사진 위치를 차지합니다.
    17개 이하의 서브 화면이 있는 경우: 각 작은 화면의 너비와 높이는 각각 전체 캔버스 너비와 높이의 0.235; 인접한 작은 화면의 왼쪽과 오른쪽, 위쪽과 아래쪽 거리는 각각 전체 캔버스 너비와 높이의 0.012; 캔버스에서 작은 화면의 가로 및 세로 여백도 전체 캔버스 너비와 높이의 0.012;
    17개 이상의 서브 화면이 있는 경우: 각 작은 화면의 너비와 높이는 각각 전체 캔버스 너비와 높이의 0.188; 인접한 작은 화면의 왼쪽과 오른쪽, 위쪽과 아래쪽 거리는 각각 전체 캔버스 너비와 높이의 0.01; 캔버스에서 작은 화면의 가로 및 세로 여백도 전체 캔버스 너비와 높이의 0.01; 플로팅 레이아웃은 다음 이미지와 같이 구독된 서브 화면이 증가함에 따라 변경:
    悬浮布局1
    
    悬浮布局2
    
    화면 공유 레이아웃:
    화면 왼쪽에 있는 호스트의 큰 화면 위치를 지정하고(지정하지 않으면 큰 화면 위치가 배경색이 됨) 다른 호스트는 오른쪽에서 위에서 아래로 세로로 정렬됩니다. 화면 수가 17개 미만인 경우 오른쪽의 각 컬럼은 최대 8명까지 가능하며, 최대 2개의 컬럼을 차지합니다. 화면 개수가 17개 이상일 경우, 17개 이상의 화면이 있는 호스트는 왼쪽 하단 모서리부터 수평으로 정렬됩니다. 최대 24개의 화면을 지원하며 호스트가 오디오만 보내는 경우에도 화면 위치를 차지합니다.
    5개 이하의 서브 화면이 있는 경우: 오른쪽 작은 화면의 너비는 전체 캔버스 너비의 1/5이고 오른쪽 작은 화면의 높이는 전체 캔버스 높이의 1/4; 왼쪽의 큰 화면의 너비는 전체 캔버스 너비의 4/5이고 왼쪽의 큰 화면의 높이는 전체 캔버스의 높이;
    5보다 크고 7보다 작은 서브 화면이 있는 경우: 오른쪽 작은 화면의 너비는 전체 캔버스 너비의 1/7이고 오른쪽 작은 화면의 높이는 전체 캔버스 높이의 1/6; 왼쪽의 큰 화면의 너비는 전체 캔버스 너비의 6/7이고 왼쪽의 큰 화면의 높이는 전체 캔버스의 높이;
    7보다 크고 9보다 작은 서브 화면이 있는 경우: 오른쪽 작은 화면의 너비는 전체 캔버스 너비의 1/9이고 오른쪽 작은 화면의 높이는 전체 캔버스 높이의 1/8; 왼쪽의 큰 화면의 너비는 전체 캔버스 너비의 8/9이고 왼쪽의 큰 화면의 높이는 전체 캔버스의 높이;
    9보다 크고 17보다 작은 서브 화면이 있는 경우: 오른쪽 작은 화면의 너비는 전체 캔버스 너비의 1/10이고 오른쪽 작은 화면의 높이는 전체 캔버스 높이의 1/8; 왼쪽의 큰 화면의 너비는 전체 캔버스 너비의 4/5이고 왼쪽의 큰 화면의 높이는 전체 캔버스의 높이;
    17개 이상의 서브 화면이 있는 경우: 오른쪽(아래) 쪽의 작은 화면의 너비는 전체 캔버스 너비의 1/10이고 오른쪽(아래) 쪽의 작은 화면의 높이는 전체 캔버스 높이의 1/8; 왼쪽의 큰 화면의 너비는 전체 캔버스 너비의 4/5이고 왼쪽의 큰 화면의 높이는 전체 캔버스의 높이의 7/8;
    아래와 같이 구독된 서브 화면이 증가함에 따라 화면 공유 레이아웃 변경:
    屏幕分享布局1
    
    屏幕分享布局3
    
    屏幕分享布局4
    
    屏幕分享布局4
    
    사용자 정의 레이아웃:
    업무 요구에 따라 MixLayoutList에서 각 호스트 화면의 레이아웃 정보를 사용자 정의합니다.

    2. 녹화 쿼리(DescribeCloudRecording)

    필요한 경우 이 인터페이스를 호출하여 녹화 서비스의 상태를 쿼리할 수 있습니다. 정보는 녹화 작업이 있는 경우에만 쿼리할 수 있으며, 녹화 작업이 종료되면 오류가 반환됩니다. 녹화된 파일 목록(StorageFile)에는 이번에 녹화된 모든 M3U8 인덱스 파일과 녹화의 시작 Unix 타임스탬프 정보가 포함됩니다. VOD 업로드 작업인 경우 이 인터페이스에서 반환된 StorageFile이 비어 있습니다.

    3. 녹화 업데이트(ModifyCloudRecording)

    필요한 경우 이 인터페이스를 호출하여 SubscribeStreamUserIds(단일 스트림 및 혼합 스트림 녹화에 유효) 및 녹화된 템플릿 매개변수 MixLayoutParams(혼합 스트림 녹화에 유효)와 같은 녹화 서비스의 매개변수를 수정할 수 있습니다. 업데이트 작업은 증분 업데이트 작업이 아닌 전체 적용 작업입니다. 템플릿 매개변수 MixLayoutParams 및 블록리스트/얼로우리스트인 SubscribeStreamUserIds를 포함하여 업데이트할 때마다 전체 정보를 전달해야 합니다. 따라서 녹화를 실행하거나 전체 녹화 관련 매개변수를 다시 계산하려면 이전 매개변수를 저장해야 합니다.

    4. 녹화 중지(DeleteCloudRecording)

    녹화 종료 후에는 녹화 중지(DeleteCloudRecording) 인터페이스를 호출하여 녹화 작업을 종료해야 하며, 그렇지 않으면 사전 설정된 시간 초과 MaxIdleTime에 도달하면 녹화 작업이 자동으로 종료됩니다. MaxIdleTime의 정의는 방에 호스트가 없는 상태가 MaxIdleTime의 지속시간을 초과하는 것으로, 여기서 방에 호스트가 있지만 호스트에 업스트림 데이터가 없으면 타임아웃 카운트다운 상태에 들어가지 않습니다. 녹화가 종료되면 서비스에서 이 인터페이스를 호출하여 녹화 작업을 종료하는 것이 좋습니다.

    고급 기능

    녹화 mp4 파일

    출력 파일 형식을 mp4 형식으로 녹화하려면 매개변수(OutputFormat)에 녹화 파일의 출력 형식을 hls+mp4로 지정하여 녹화를 실행할 수 있습니다. hls 파일은 기본적으로 계속 녹화됩니다. hls 녹화가 완료되면 mp4 변환 작업이 즉시 트리거되고 hls가 있는 cos에서 mp4 캡슐화 풀 스트림 후 클라이언트의 cos에 업로드합니다. 여기서 COS의 파일 풀다운 권한을 제공해야 합니다. 그렇지 않으면 hls 파일 풀다운이 실패하여 mp4 작업으로 전송이 종료됩니다. mp4 파일은 다음과 같은 경우 강제로 샤드됩니다.
    1. 녹화는 24시간 이상 지속됩니다.
    2. 단일 mp4 파일의 크기가 2GB에 도달 아래 이미지는 mp4 형식으로 녹화하는 워크플로를 보여줍니다.
    输出mp4
    

    녹화 VOD 업로드

    녹화된 출력 파일을 VOD 플랫폼에 업로드하려면 녹화를 실행하기 위한 스토리지 매개변수(StorageParams)에 CloudVod 참석자 매개변수를 지정할 수 있습니다. 녹화 백그라운드는 녹화가 끝난 후 지정한 방식으로 녹화된 mp4 파일을 VOD 플랫폼에 업로드 하고, 콜백 형태로 재생 주소를 보내드립니다. 녹화 모드가 단일 스트림 녹화 모드인 경우 구독된 각 호스트에는 해당 재생 주소가 있고 녹화 모드가 혼합 스트림 녹화 모드인 경우 혼합 스트림 미디어의 재생 주소는 하나만 있습니다. VOD 작업 업로드에는 다음과 같은 주의 사항이 있습니다.
    1. 스토리지 매개변수의 CloudVod 및 CloudStorage 중 하나만 동시에 지정할 수 있습니다. 그렇지 않으면 녹화 실패;
    2. VOD 작업을 업로드하는 과정에서 DescribeCloudRecording을 사용하여 쿼리한 작업 상태에는 녹화된 파일의 정보 불포함; 구체적인 과정은 이미지와 같습니다. 여기에서 클라우드 스토리지는 녹화를 위한 내부 클라우드 스토리지이며 클라이언트는 관련 매개변수를 입력할 필요가 없습니다.
    输出vod
    

    단일 스트림 파일 병합 스크립트

    단일 스트림 오디오 및 비디오 파일을 MP4 파일로 병합하기 위한 스크립트를 제공합니다.
    설명:
    두 슬라이스 사이의 시간 간격이 15초 이상이고 간격에 오디오/비디오 정보가 없는 경우(서브스트림이 비활성화된 경우 서브스트림 정보는 무시됨) 두 슬라이스를 두 개의 다른 세그먼트로 처리합니다. 녹화 시간이 더 빠른 슬라이스는 이전 세그먼트의 끝 슬라이스로 간주되고, 녹화 시간이 더 늦은 슬라이스는 다음 세그먼트의 시작 슬라이스로 간주됩니다.
    세그먼트 모드(-m 0) 이 모드에서 스크립트는 각 UserId 아래의 녹화 파일을 세그먼트별로 병합하고 UserId 아래의 세그먼트는 독립적으로 파일에 병합됩니다.
    병합 모드(-m 1) 동일한 UserId 아래의 모든 세그먼트를 하나의 멀티미디어 파일로 결합합니다. -s 옵션은 세그먼트 사이의 간격을 채울지 여부를 선택하는 데 사용할 수 있습니다.

    종속 환경

    Python3
    Centos: sudo yum install python3
    Ubuntu: sudo apt-get install python3
    Python3 종속 패키지
    sortedcontainers: pip3 install sortedcontainers

    사용 방법

    1. 병합 스크립트 실행: python3 TRTC_Merge.py [option] 2. 녹화 파일 디렉터리에 병합된 mp4 파일 생성 예시: python3 TRTC_Merge.py -f /xxx/file -m 0
    선택 가능한 매개변수와 해당 기능은 다음 표를 참고하십시오.
    매개변수
    기능
    -f
    병합할 파일의 저장 경로를 지정합니다. UserId 녹화 파일이 여러 개인 경우 스크립트는 파일을 별도로 병합합니다.
    -m
    0: 섹션 기반 병합(기본값). 이 모드에서는 각 사용자(UserId)의 녹화 파일이 섹션별로 병합됩니다. 각 UserId는 여러 MP4 파일을 생성할 수 있습니다.
    1: 사용자 기반 병합. 이 모드에서는 각 사용자(UserId)의 녹화 파일이 하나의 MP4 파일로 병합됩니다.
    -s
    저장 모드. 이 매개변수가 설정되면 병합 모드에서 세그먼트 사이의 공백이 삭제되고 파일의 실제 시간은 물리적 일반 시간보다 작습니다.
    -a
    0: 기본 스트림 병합(기본값). 사용자(UserId)의 오디오는 서브스트림이 아닌 사용자의 기본 스트림과 병합됩니다.
    1: 자동 병합. 사용자(UserId)에게 기본 스트림이 있는 경우 사용자의 오디오가 기본 스트림과 병합됩니다. 그렇지 않은 경우 서브스트림과 병합됩니다.
    2: 서브스트림 병합. 사용자(UserId)의 오디오는 기본 스트림이 아닌 사용자의 서브스트림과 병합됩니다.
    -p
    출력 비디오의 fps를 지정합니다. 기본값은 15 fps이고 유효한 범위는 5-120 fps이며 5 fps 미만은 5 fps로, 120 fps 이상은 120 fps로 계산합니다.
    -r
    출력 비디오의 해상도를 지정합니다. 예를 들어 -r 640 360은 출력 비디오의 너비가 640이고 높이가 360임을 의미합니다.
    파일 이름 규칙
    멀티미디어 파일 이름 규칙: UserId_timestamp_av.mp4
    퓨어 오디오 파일 이름 규칙: UserId_timestamp.m4a
    설명:
    여기서 UserId는 녹화 스트림의 사용자 ID의 특수한 base64 값입니다. 자세한 내용은 실행 녹화 파일 이름 명명 규칙에 대한 설명을 참고하십시오. timestamp는 각 세그먼트의 첫 번째 ts 슬라이스에 대해 녹화가 실행된 시간입니다.

    콜백 API

    콜백을 수신하는 Http/Https 서비스 게이트웨이를 제공하여 콜백 메시지를 구독할 수 있습니다. 관련 이벤트가 발생하면 클라우드 녹화 시스템이 이벤트 공지를 메시지 수신 서버로 다시 콜백합니다.

    이벤트 콜백 메시지 포맷

    이벤트 콜백 메시지는 HTTP/HTTPS POST 요청 형식으로 사용자의 서버에 전송됩니다. 문자 인코딩 포맷: UTF-8. 요청: body 포맷은 JSON. 응답: HTTP STATUS CODE = 200, 서버가 응답 패키지의 세부 콘텐츠를 무시합니다. 원활한 프로토콜 연결을 위해 클라이언트 응답 콘텐츠에 JSON: {"code":0} 추가를 권장합니다.

    매개변수 설명

    이벤트 콜백 메시지의 header는 다음과 같은 필드 포함:
    필드 이름
    Content-Type
    application/json
    Sign
    서명 값
    SdkAppId
    sdk application id
    이벤트 콜백 메시지의 body는 다음과 같은 필드 포함:
    필드 이름
    유형
    설명
    EventGroupId
    Number
    이벤트 그룹 ID, 클라우드 녹화의 경우 3으로 고정
    EventType
    Number
    이벤트 유형
    CallbackTs
    Number
    이벤트 콜백 서버가 사용자의 서버로 보낸 콜백 요청의 Unix 타임스탬프(ms)
    EventInfo
    JSON Object
    이벤트 정보
    이벤트 유형 설명
    필드 이름
    유형
    설명
    EVENT_TYPE_CLOUD_RECORDING_RECORDER_START
    301
    클라우드 녹화 - 녹화 모듈 실행
    EVENT_TYPE_CLOUD_RECORDING_RECORDER_STOP
    302
    클라우드 녹화 - 녹화 모듈 중지
    EVENT_TYPE_CLOUD_RECORDING_UPLOAD_START
    303
    클라우드 녹화 - 업로드 모듈 실행
    EVENT_TYPE_CLOUD_RECORDING_FILE_INFO
    304
    클라우드 녹화 - 첫 번째 m3u8 파일 생성 및 업로드 성공 콜백
    EVENT_TYPE_CLOUD_RECORDING_UPLOAD_STOP
    305
    클라우드 녹화 - 업로드 완료
    EVENT_TYPE_CLOUD_RECORDING_FAILOVER
    306
    클라우드 녹화 - 녹화 작업이 마이그레이션됨
    EVENT_TYPE_CLOUD_RECORDING_FILE_SLICE
    307
    클라우드 녹화 - 첫 번째 ts 세그먼트 사용, M3U8 파일 생성 콜백
    EVENT_TYPE_CLOUD_RECORDING_UPLOAD_ERROR
    308
    클라우드 녹화 - 업로드 모듈 오류 발생
    EVENT_TYPE_CLOUD_RECORDING_DOWNLOAD_IMAGE_ERROR
    309
    클라우드 녹화 - 이미지 디코딩 파일 다운로드 중 오류 발생
    EVENT_TYPE_CLOUD_RECORDING_MP4_STOP
    310
    클라우드 녹화 - mp4 녹화 작업 종료, 생성된 mp4 파일 이름 및 세부 정보 반환 완료
    EVENT_TYPE_CLOUD_RECORDING_VOD_COMMIT
    311
    클라우드 녹화 - vod 작업 녹화 업로드 완료
    EVENT_TYPE_CLOUD_RECORDING_VOD_STOP
    312
    클라우드 녹화 - vod 녹화 작업 종료
    이벤트 정보 설명
    필드 이름
    유형
    설명
    RoomId
    String/Number
    Room ID(클라이언트 Room ID와 동일한 유형)
    EventTs
    Number
    이벤트 발생 Unix 타임스탬프(초)
    UserId
    String
    녹화 로봇의 사용자 ID
    TaskId
    String
    녹화 ID, 녹화 작업을 고유하게 식별함
    Payload
    JsonObject
    이 필드의 내용은 이벤트 유형에 따라 다릅니다
    이벤트 유형이 301 EVENT_TYPE_CLOUD_RECORDING_RECORDER_START일 때 Payload 정의
    필드 이름
    유형
    설명
    Status
    Number
    0: 녹화 모듈 시작 성공, 1: 녹화 모듈 시작 실패.
    {
    "EventGroupId": 3,
    "EventType": 301,
    "CallbackTs": 1622186275913,
    "EventInfo": {
    "RoomId": "xx",
    "EventTs": "1622186275",
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "Status": 0
    }
    }
    }
    이벤트 유형이 302 EVENT_TYPE_CLOUD_RECORDING_RECORDER_STOP일 때 Payload 정의
    필드 이름
    유형
    설명
    LeaveCode
    Number
    0: 녹화 모듈 정상적으로 녹화 종료;
    1: 녹화 로봇이 방에서 제거됨;
    2: 방이 해산됨;
    3: 서버가 방에서 녹화 로봇을 제거;
    4: 서버가 방을 해산함;
    99: 녹화 로봇 외에는 방에 앵커가 없으며, 지정된 시간이 지나면 종료됨;
    100: 방 시간 초과 후 종료됨;
    101: 동일한 사용자의 반복 입장으로 인해 녹화 로봇이 제거됨;
    {
    "EventGroupId": 3,
    "EventType": 302,
    "CallbackTs": 1622186354806,
    "EventInfo": {
    "RoomId": "xx",
    "EventTs": "1622186354",
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "LeaveCode": 0
    }
    }
    }
    이벤트 유형이 303 EVENT_TYPE_CLOUD_RECORDING_UPLOAD_START일 때 Payload 정의
    필드 이름
    유형
    설명
    Status
    Number
    0: 업로드 모듈 시작 성공.
    1: 업로드 모듈 시작 실패.
    {
    "EventGroupId": 3,
    "EventType": 303,
    "CallbackTs": 1622191965320,
    "EventInfo": {
    "RoomId": "20015",
    "EventTs": 1622191965,
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "Status": 0
    }
    }
    }
    이벤트 유형이 304 EVENT_TYPE_CLOUD_RECORDING_FILE_INFO일 때 Payload 정의
    필드 이름
    유형
    설명
    FileList
    String
    생성된 M3U8 파일의 이름
    {
    "EventGroupId": 3,
    "EventType": 304,
    "CallbackTs": 1622191965350,
    "EventInfo": {
    "RoomId": "20015",
    "EventTs": 1622191965,
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "FileList": "xx.m3u8"
    }
    }
    }
    이벤트 유형이 305 EVENT_TYPE_CLOUD_RECORDING_UPLOAD_STOP일 때 Payload 정의
    필드 이름
    유형
    설명
    Status
    Number
    0: 녹화 작업이 완료되고 모든 파일이 지정된 타사 클라우드 스토리지 서비스에 업로드됨
    1: 녹화 작업이 완료되었지만 서버 또는 백업 스토리지에 있는 하나 이상의 파일 업로드에 실패함
    2: 이전에 업로드에 실패한 파일이 지정된 타사 클라우드 스토리지 서비스에 업로드됨
    {
    "EventGroupId": 3,
    "EventType": 305,
    "CallbackTs": 1622191989674,
    "EventInfo": {
    "RoomId": "20015",
    "EventTs": 1622191989,
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "Status": 0
    }
    }
    }
    이벤트 유형이 306 EVENT_TYPE_CLOUD_RECORDING_FAILOVER일 때 Payload 정의
    필드 이름
    유형
    설명
    Status
    Number
    0: 마이그레이션 완료
    {
    "EventGroupId": 3,
    "EventType": 306,
    "CallbackTs": 1622191989674,
    "EventInfo": {
    "RoomId": "20015",
    "EventTs": 1622191989,
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "Status": 0
    }
    }
    }
    이벤트 유형이 307 EVENT_TYPE_CLOUD_RECORDING_FILE_SLICE일 때 Payload 정의
    필드 이름
    유형
    설명
    FileName
    String
    m3u8 파일 이름
    UserId
    String
    녹화 파일에 해당하는 사용자 ID
    TrackType
    String
    audio/video/audio_video
    BeginTimeStamp
    Number
    녹화 시작 시 서버의 Unix 타임스탬프(밀리초)
    {
    "EventGroupId": 3,
    "EventType": 307,
    "CallbackTs": 1622186289148,
    "EventInfo": {
    "RoomId": "xx",
    "EventTs": "1622186289",
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "FileName": "xx.m3u8",
    "UserId": "xx",
    "TrackType": "audio",
    "BeginTimeStamp": 1622186279144
    }
    }
    }
    이벤트 유형이 308 EVENT_TYPE_CLOUD_RECORDING_UPLOAD_ERROR일 때 Payload 정의
    필드 이름
    유형
    설명
    Code
    String
    타사 클라우드 스토리지 서비스에서 반환된 오류 code
    Message
    String
    타사 클라우드 스토리지 서비스에서 반환된 오류 메시지
    {
    "Code": "InvalidParameter",
    "Message": "AccessKey invalid"
    }
    
    {
    "EventGroupId": 3,
    "EventType": 308,
    "CallbackTs": 1622191989674,
    "EventInfo": {
    "RoomId": "20015",
    "EventTs": 1622191989,
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "Code": "xx",
    "Message": "xx"
    }
    }
    }
    이벤트 유형은 309 EVENT_TYPE_CLOUD_RECORDING_DOWNLOAD_IMAGE_ERROR일 때 Payload 정의
    필드 이름
    유형
    설명
    Url
    String
    파일 다운로드 실패 url
    {
    "EventGroupId": 3,
    "EventType": 309,
    "CallbackTs": 1622191989674,
    "EventInfo": {
    "RoomId": "20015",
    "EventTs": 1622191989,
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "Url": "http://xx",
    }
    }
    }
    이벤트 유형이 310 EVENT_TYPE_CLOUD_RECORDING_MP4_STOP일 때 Payload 정의
    필드 이름
    유형
    설명
    Status
    Number
    0: mp4 녹화 작업 종료되고 모든 파일이 지정된 타사 클라우드 스토리지 서비스에 업로드됨
    1: 작업이 종료되었지만 서버 또는 백업 스토리지에 있는 하나 이상의 파일 업로드 실패
    2: 오류(예상 원인: cos에서 hls 파일 가져오기 실패)로 인해 작업이 중지됨
    FileList
    Array
    생성된 mp4 파일의 이름
    FileMessage
    Array
    생성된 모든 mp4 파일 정보
    FileName
    String
    mp4 파일 이름
    UserId
    String
    mp4 파일에 해당하는 사용자 ID(녹화 모드가 혼합 스트림 모드인 경우 이 필드는 비어 있음)
    TrackType
    String
    audio/video/audio_video
    MediaId
    String
    main/aux
    StartTimeStamp
    Number
    mp4 파일 시작 Unix 타임스탬프(밀리초)
    EndTimeStamp
    Number
    mp4 파일 종료 Unix 타임스탬프(밀리초)
    {
    "EventGroupId": 3,
    "EventType": 310,
    "CallbackTs": 1622191989674,
    "EventInfo": {
    "RoomId": "20015",
    "EventTs": 1622191989,
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "Status": 0,
    "FileList": ["xxxx1.mp4", "xxxx2.mp4"],
    "FileMessage": [
    {
    "FileName": "xxxx1.mp4",
    "UserId": "xxxx",
    "TrackType": "audio_video",
    "MediaId": "main",
    "StartTimeStamp": 1622186279145,
    "EndTimeStamp": 1622186282145
    },
    {
    "FileName": "xxxx2.mp4",
    "UserId": "xxxx",
    "TrackType": "audio_video",
    "MediaId": "main",
    "StartTimeStamp": 1622186279153,
    "EndTimeStamp": 1622186282153
    }
    ]
    }
    }
    }
    이벤트 유형이 311 EVENT_TYPE_CLOUD_RECORDING_VOD_COMMIT일 때 Payload 정의
    필드 이름
    유형
    설명
    Status
    Number
    0: 녹화 파일이 VOD 업로드 성공
    1: 녹화 파일이 서버 또는 백업 스토리지에 남아있음
    2: 녹화 파일 VOD 업로드 오류 발생
    UserId
    String
    이 녹화 파일에 해당하는 사용자 ID(녹화 모드가 혼합 스트림 모드인 경우 이 필드는 비어 있음)
    TrackType
    String
    audio/video/audio_video
    MediaId
    String
    main/aux
    FileId
    String
    VOD 녹화 파일의 고유 id
    VideoUrl
    String
    VOD 녹화 파일 재생 URL
    CacheFile
    String
    녹화 파일에서 변환된 mp4 파일 이름(VOD 업로드 전)
    Errmsg
    String
    statue가 0이 아닌 경우 오류 메시지
    업로드 성공 콜백:
    {
    "EventGroupId": 3,
    "EventType": 311,
    "CallbackTs": 1622191965320,
    "EventInfo": {
    "RoomId": "20015",
    "EventTs": 1622191965,
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "Status": 0,
    "TencentVod": {
    "UserId": "xx",
    "TrackType": "audio_video",
    "MediaId": "main",
    "FileId": "xxxx",
    "VideoUrl": "http://xxxx"
    }
    }
    }
    }
    업로드 실패 콜백:
    {
    "EventGroupId": 3,
    "EventType": 311,
    "CallbackTs": 1622191965320,
    "EventInfo": {
    "RoomId": "20015",
    "EventTs": 1622191965,
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "Status": 1,
    "Errmsg": "xxx",
    "TencentVod": {
    "UserId": "123",
    "TrackType": "audio_video",
    "CacheFile": "xxx.mp4"
    }
    }
    }
    }
    이벤트 유형이 312 EVENT_TYPE_CLOUD_RECORDING_VOD_STOP일 때 Payload 정의
    필드 이름
    유형
    설명
    Status
    Number
    0: vod 업로드 작업 완료 후 정상적으로 종료됨
    1: 오류로 인해 vod 작업이 종료됨
    {
    "EventGroupId": 3,
    "EventType": 312,
    "CallbackTs": 1622191965320,
    "EventInfo": {
    "RoomId": "20015",
    "EventTs": 1622191965,
    "UserId": "xx",
    "TaskId": "xx",
    "Payload": {
    "Status": 0
    }
    }
    }

    모범 사례

    녹화의 고가용성을 보장하기 위해 Restful API 통합 시 다음 사항을 주의하십시오.
    1. CreateCloudRecording 요청을 호출한 후 http response에 주의를 기울이고, 요청이 실패할 경우 특정 상태 코드에 따라 해당 재시도 정책을 채택해야 합니다.
    에러 코드는 ‘InvalidParameter.SdkAppId’와 같이 ‘1차 에러 코드’와 ‘2차 에러 코드’로 구성됩니다.
    반환된 Code가 InternalError.xxxxx이면 서버 측 오류가 발생했음을 의미합니다. 반환이 정상이고 taskid를 얻을 때까지 동일한 매개변수를 사용하여 여러 번 재시도할 수 있습니다. 첫 번째 3초 재시도, 두 번째 6초 재시도, 세 번째 12초 재시도 등과 같은 백오프 재시도 정책을 사용하는 것이 좋습니다.
    반환된 Code가 InvalidParameter.xxxxx이면 입력 매개변수가 잘못된 것이므로 프롬프트에 따라 매개변수를 확인하십시오.
    반환된 Code가 FailedOperation.RestrictedConcurrency인 경우 클라이언트의 동시 녹화 작업 수가 백그라운드에서 예약된 리소스(기본적으로 100개 채널)를 초과한다는 의미이므로 최대 동시 채널 제한을 조정하려면 Tencent Cloud 기술 지원에 문의하십시오.
    2. CreateCloudRecording 인터페이스 호출 시 지정된 UserId/UserSig는 별도의 로봇 사용자로 방에 참여하는 기록된 사용자의 ID이므로 TRTC 방의 다른 사용자와 중복하지 마십시오. 동시에, TRTC 클라이언트에 의해 추가된 방 유형은 녹화 인터페이스에서 지정한 방 유형과 동일해야 합니다. 예를 들어 SDK가 문자열 방 번호를 사용하여 방을 생성하는 경우 클라우드에 녹화된 방 유형은 또한 그에 따라 문자열 방 번호로 설정해야 합니다.
    3. 녹화 상태 쿼리를 위해 클라이언트는 다음과 같은 방법으로 녹화의 해당 파일 정보를 얻을 수 있습니다.
    CreateCloudRecording 작업이 성공적으로 전달된 후 약 15초 후에 DescribeCloudRecording 인터페이스를 호출하여 녹화 파일에 해당하는 정보를 쿼리합니다. 상태가 idle인 경우 멀티미디어 스트림이 업스트림에 업로드되고 있지 않음을 의미하므로 방에 업스트림 호스트가 있는지 확인하십시오.
    CreateCloudRecording을 성공적으로 전달된 후, 방에 업스트림 멀티미디어가 있는지 확인하면서 녹화 파일 이름 생성 규칙에 따라 녹화 파일 이름을 스티칭할 수 있습니다. 특정 파일 이름 규칙에 대해서는 위를 참고하십시오(여기에 파일 이름 규칙에 대한 링크가 있습니다).
    녹화 파일의 상태는 콜백을 통해 클라이언트의 서버로 전송되며, 해당 콜백을구독하면 녹화 파일의 상태 정보를 받아볼 수 있습니다(여기에 콜백 페이지 링크가 있습니다).
    Cos를 통해 녹화 파일 쿼리, 클라우드 녹화 전달 시 cos의 스토리지 디렉터리를 지정할 수 있으며, 녹화 작업 종료 후 해당 디렉터리를 찾아 녹화 파일을 찾을 수 있습니다.
    4. 녹화 사용자(userid)의 usersig 만료 시간은 녹화 라이프사이클보다 긴 시간으로 설정해야 합니다. 녹화 작업 기기 네트워크 연결 끊김을 방지하기 위해서 입니다. 내부 고가용성 적용 시 usersig 만료로 인해 녹화 복구에 실패할 수 있습니다.
    문의하기

    고객의 업무에 전용 서비스를 제공해드립니다.

    기술 지원

    더 많은 도움이 필요하시면, 티켓을 통해 연락 바랍니다. 티켓 서비스는 연중무휴 24시간 제공됩니다.

    연중무휴 24시간 전화 지원