https://www.codeproject.com/Tips/896030/The-Structure-of-HEVC-Video
HEVC(H.265)로 인코딩된 스트리밍 영상도 우리 회사 솔루션에서 지원해야 할 필요가 있어 SPS Parsing 작업을 하였다.
FFmpeg 디코딩의 옵션을 설정하기 위하여 인코딩된 영상의 해상도와 프레임 레이트가 필요하였고 SPS에서 해당 정보를 얻었다.
위 사이트를 통해 이 작업에 필요했던 SPS를 포함하여, HEVC(H.265)의 구조의 기본 개념을 알게 되었다.
1. Main HEVC Syntax Elements
HEVC 비트스트림은 위 그림과 같이 syntax element로 이루어져 있다.
각각의 syntax element는 NAL(Network abstraction layer) Unit에 위치해있다.
VPS | Video parameter set |
SPS | Sequence parameter set |
PPS | Picture parameter set |
Slice (different types) | |
AUD | Access unit delimiter |
EOS | End of sequence |
EOB | End of bitstream |
FD | Filler data |
SEI | Supplemental enhancement information |
Reserved and unspecified |
VPS, SPS, PPS에는 일반적인 비디오의 디코딩 과정에 필수적인 데이터들을 포함하고 있다.
이번 작업은 디코딩 옵션을 설정할 때 사용할 정보가 필요하여 해당 syntax element를 활용하였다.
Slice는 인코딩된 비디오 프레임 데이터를 포함한다.
각 Slice는 다른 Slice 정보를 사용하지 않고 독립적으로 디코딩 될 수 있어서 병렬 인코딩과 디코딩을 지원하는 도구로 사용할 수 있다.
- I-slice - slice with only intra prediction
- P-slice - slice with inter prediction from one I or P slices
- B-slice - slice with inter prediction from two I or P slices
- IDR-slice - There are no references from slices after IDR-slice to slices before it.
AUD는 비디오 프레임의 시작에 대한 시그널링에 사용한다.
FD는 비트 전송률 평활화에 사용한다.
SEI는 picture timing, color space information 다양한 유형의 메타데이터를 지원한다.
2. Frame per second value
SPS를 파싱할 때 sps:vui:num_units_in_tick, sps:vui:time_scale를 구할 수 있고 아래의 식으로 FPS를 계산할 수 있다.
FPS = sps:vui:time_scale / sps:vui:num_units_in_tick
※ 참고
SPS에 VUI정보가 없을 수도 있다.
이번 작업할 때 테스트용으로 사용한 H.265를 파싱할 때 ui_parameters_present_flag가 0이었고
이는 VUI 정보가 없다는 뜻으로 FPS를 계산할 수 없었다.
그래서 해당 정보는 SDP(Session Description Protocol)에서 얻었다.
3. Size of picture
SPS를 파싱할 때 sps:pic_width_in_luma_samples, sps:pic_height_in_luma_samples에 해당 정보가 저장된다.
해당 정보를 파싱하여 영상의 너비, 높이를 구할 수 있었다.
4. 작업에 참고한 코드
아래 C++과 Python으로 구현된 파싱함수를 참고하여 HEVC(H.265) SPS를 파싱하는 메서드를 C#으로 구현하는 작업을 진행하였다.
https://yqlab.me/archives/32.html
https://app.box.com/s/vr2s59olnzscpsmkb26g0t4h0pe00fyt
'일하면서 사용한 짧은 지식 > RTSP' 카테고리의 다른 글
HEVC(H.265) SPS Parsing 작업을 하면서 알게 된 Base64 (0) | 2022.05.17 |
---|---|
WireShark로 RTP over UDP 와 RTP over TCP로 설정했을 때, RTSP SETUP 메서드의 Transport 차이 확인 (0) | 2022.04.28 |