Appearance
작업 흐름
Transcoder 작업은 원본 S3 객체와 출력 S3 위치를 기준으로 비동기 실행돼요.
작업 생성 응답의 Id로 상태를 조회하고, 완료 후에는 생성 요청에 사용한 Output.Prefix의 master.m3u8를 사용해요.
1. 작업 생성
CreateVideoEncodingJob Lambda가 시작점이에요.
Lambda는 TV prefix를 가진 작업 ID를 만들고, DynamoDB에 PENDING 작업을 저장한 뒤 Step Functions execution을 시작해요.
2. Probe
Probe 단계는 원본 S3 객체를 presigned URL로 읽고 ffprobe로 메타데이터와 keyframe 목록을 분석해요.
모바일 영상처럼 rotation metadata가 있는 경우 표시 방향 기준으로 해상도를 보정하고, 입력 제한을 검증해요.
검증이 끝나면 생성할 variant와 preset별 청크 계획을 만들고 작업 상태를 PROCESSING으로 바꿔요.
3. Transcode Chunk
Transcode 단계는 PRESET과 CHUNK_INDEX에 해당하는 청크 하나를 변환해요.
청크는 keyframe 위치에서 seek한 뒤 필요한 구간만 trim하고, preset 해상도와 FPS, CRF를 적용해 MP4로 저장돼요.
중간 산출물은 내부 S3 bucket에 {jobId}/transcode/{preset}/chunk_000.mp4 형식으로 업로드돼요.
4. Finalize
Finalize 단계는 모든 청크를 preset별 MP4로 합치고 HLS playlist와 .ts segment로 패키징해요.
업로드 직전에 작업 상태는 UPLOADING으로 바뀌고, 최종 결과물은 요청의 Output.Bucket과 Output.Prefix로 업로드돼요.
업로드가 끝나면 작업을 SUCCESS로 마킹하고 SQS로 완료 메시지를 보내요.
상태
| 상태 | 설명 |
|---|---|
PENDING | 작업이 대기 중이에요. |
PROCESSING | Probe 이후 청크 변환과 Finalize가 진행 중이에요. |
UPLOADING | 최종 HLS 결과물을 출력 S3 위치에 업로드 중이에요. |
SUCCESS | 인코딩이 완료됐어요. |
FAILED | 인코딩이 실패했어요. |
CANCELLED | 작업이 취소됐어요. |
진행률
작업 조회의 Progress는 완료된 transcode chunk 수를 전체 planned chunk 수로 나눈 값이에요.
Probe가 끝나기 전에는 실행 계획이 없어서 Progress가 null이에요.
취소
취소 Lambda는 PENDING 또는 PROCESSING 상태의 작업만 취소해요.
UPLOADING, SUCCESS, FAILED, CANCELLED 상태는 취소할 수 없고 현재 상태를 그대로 반환해요.
각 단계는 시작 시점이나 중요한 상태 변경 전에 CanceledAt을 확인하고, 취소된 작업이면 후속 처리를 건너뛰어요.