와우자 스트리밍 엔진 트랜스코더의 숨겨진 옵션
와우자 스트리밍 엔진 트랜스코더 UI에서는 수정할 수 있는 옵션들이 많지 않다. 하지만 xml 파일을 직접 수정해 주면, 추가적인 옵션을 사용할 수 있다. 숨겨져 있는 옵션들의 목록과, 이를 mainconcept SDK와 비교해 본다.
와우자 트랜스코더는 VBR로 동작한다.
와우자 스트리밍 엔진(Wowza Streaming Engine, 이하 와우자)의 트랜스코더는 기본적으로 VBR(Variable Bit Rate : 가변 전송률)모드로 동작한다. 하지만 트랜스코더 설정 화면에는 Codec, Profile, Key Frame Interval, Bitrate 정도의 옵션만 존재할 뿐, VBR 인코딩과 관련된 세부 옵션들이 존재하지 않으며, 심지어 CBR-VBR 설정도 표시되지 않는다.
하지만, 와우자에서 공식 문서화해서 배포하지 않았을 뿐, 변경할 수 있는 옵션들이 존재한다. 본 필자가 와우자 트랜스코더의 버그를 발견하는 과정중 알게 된, 와우자에서 밝힌 세부 옵션 목록과 설정 방법을 공유한다.
숨겨진 옵션을 적용하는 방법
와우자 트랜스코더의 설정은 잘 알려진대로 [install-dir]/transcoder/templates/
에 위치한 템플릿 파일들을 통해 관리된다. 이 템플릿 파일을 열고, 적용하고자 하는 트랜스코드 프리셋의 비디오 파라미터 섹션으로 이동한다. 그리고 아래의 예시와 같이 파라미터 블록을 추가해 주면 된다.
...(전략)...
<Encode>
<Name>프로파일 이름</Name>
<Enable>true</Enable>
<Description>프로파일 설명</Description>
<StreamName>mp4:${SourceStreamName}_360pvbr</StreamName>
<Video>
<Parameters>
<Parameter>
<Name>mainconcept.bit_rate_mode</Name>
<Value>2</Value>
<Type>Long</Type>
</Parameter>
</Parameters>
... (이하 생략) ...
각각의 파라미터들은 Name
, Value
, Type
으로 구성되어 있다.
와우자 트랜스코더의 숨겨진 옵션
동작모드 : CBR, CQT, VBR
- Name
- mainconcept.bit_rate_mode
- Value
- 0 : CBR 모드
- 1 : CQT 모드
- 2 : VBR 모드
- Type
- Long
평균 / 목표 비트레이트
- Name
- mainconcept.bit_rate
- Value
- bps 단위로 입력 (예, 4000000 = 4Mbps)
- Type
- Long
최대 비트레이트
- Name
- mainconcept.max_bit_rate
- Value
- bps 단위로 입력 (예, 8000000 = 8Mbps)
- Type
- Long
VBV(Video Buffering Verifier) 크기
- Name
- mainconcept.bit_rate_buffer_size
- Value
- byte 단위로 입력 (예, 1000000 = 1MByte)
- Type
- Long
I-Frame Quantization Level
- Name
- mainconcept.quant_pI
- Value
- 0 ~ 51 사이의 정수 (값이 높아질 수록 품질이 낮아진다.)
- Type
- Long
B-Frame Quantization Level
- Name
- mainconcept.quant_pB
- Value
- 0 ~ 51 사이의 정수 (값이 높아질 수록 품질이 낮아진다.)
- Type
- Long
P-Frame Quantization Level
- Name
- mainconcept.quant_pP
- Value
- 0 ~ 51 사이의 정수 (값이 높아질 수록 품질이 낮아진다.)
- Type
- Long
이 외에 가능성이 있는 것들
눈치가 빠르신 몇몇 독자 제위께서는 mainconcept
이라는 단어가 계속 등장하고 있는게 눈에 거슬리실 것이다. 맞다. 와우자 트랜스코더는 MainConcept의 SDK를 기반으로 동작한다. 위에 언급된 옵션들에 대응하는 파라미터들은 메인컨셉 SDK의 AVCEncoderParams
구조체에서 확인할 수 있다.
typedef struct AVCEncoderParams
{
int32_t struct_size; // 구조체 크기
int32_t width; // 프레임 가로 해상도
int32_t height; // 프레임 세로 해상도
int32_t framerate_num; // 프레임레이트 분자
int32_t framerate_den; // 프레임레이트 분모
int32_t rc_mode; // Rate control 모드
int32_t bitrate; // 목표 비트레이트
int32_t max_bitrate; // 최대 비트레이트
int32_t vbv_buffer_size; // VBV 버퍼 크기
int32_t qp; // 전체 프레임에 공통 적용될 QP
int32_t i_qp; // I-프레임 QP
int32_t p_qp; // P-프레임 QP
int32_t b_qp; // B-프레임 QP
int32_t gop_size; // GOP 크기
int32_t idr_interval; // IDR 간격
int32_t b_frames; // B-프레임 수
int32_t b_pyramid; // B 피라미드 사용 여부 (0 = 꺼짐)
int32_t profile_idc; // AVC Profile
int32_t level_idc; // AVC Level
int32_t entropy_mode; // 0 = CAVLC, 1 = CABAC
int32_t scene_change_detection; // 장면 전환시 I-프레임 자동 삽입
int32_t color_format; // 예: NV12, YUV420
int32_t interlace_mode; // 프로그레시브/인터레이스 설정
void* user_data; // 사용자 데이터 포인터
uint32_t reserved[16]; // 향후 확장용
} AVCEncoderParams;
와우자 내부적으로 메인컨셉 SDK와 연결된 파라미터를 조정하는 방법이 있을 것으로 예상되지만, 우선 와우자에서 밝힌 항목들은 위의 7가지가 전부이다.
마무리
사실 본 글의 내용은 일반적인 운영자들에게는 필요 없는 (그리고 없어야 하는) 내용이다. 본 필자는 다른 글들을 통해 인코딩/트랜스코딩 작업은 와우자 외부에서 처리할 것을 권장한다고 이미 수차례 밝힌 바 있다.
본 글의 내용은 와우자가 제공한 정보이고, 본 필자 역시 실제로 시스템에 옵션을 적용하여 동작 여부를 확인한 내용이다. 하지만 와우자에서 정식으로 문서화해 공개한 정보는 아니다. (와우자 내부에도 문서화 한게 없다고 했으니..) 하지만 어디엔가 와우자 트랜스코더를 끝까지 쥐어 짜내가며 사용해야 하는 상황에 처하신 분들께 작게나마 도움이 되고자 이 내용을 공유한다. 부디 서비스 구축에 본 글이 필요한 독자제위가 없으시기를 바란다.