우리라이프

[개발-RTP] RTP 분석_H.264 본문

IT/프로토콜

[개발-RTP] RTP 분석_H.264

적당히벌고아주잘살자 2018. 2. 26. 00:55
반응형

H.264

H.264 코덱은 비디오 블록 단위 움직임 보상 기반의 영상 압축 표준으로 동영상 논화, 압축, 배포를 위한 방식등 중 현재 가장 보편적으로 사용되고 있는 포맷이다.

Codec Specification = VCL(Video Coding Layer) + NAL(Network Abstract Layer)

VCL은 실제 H.264 압축된 데이터를 나타내며, VCL 데이터는 NAL Unit을 통해 외부와 인터페이스가 이루어지게 된다.


Network Abstraction Layer Unit Types

F    : 1bit (forbidden_zero_bit)

     1이면 위반

NRI  : 2bits (nal_ref_idc) 

00은 NAL 유닛의 reference picture를 재구성 하는데 사용되지 않음을 나타냄

Type : 5bits (nal_unit_type)

NAL unit payload type. 3바이트 또는 4바이트 Start Code 0x000001, 0x00000001이 앞단에 붙어 NAL Type을 표시한다.

전체 NAL unit payload type은 ITU-T Recommendation H.264, "Advanced video coding for generic audiovisual services", March 2010 문서의 [7-1] 표에 있으며, PDF 전체 문서로는 84페이지, 목차를 제외한 본문 내용으로 보면 64 페이지에 나와있다.

아래는 NAL unit type codes, syntax element categories, and NAL unit type classes 표의 내용을 캡쳐한것이다.

H.264 스트림 데이터에서 가장 많이 사용되는 Nal Unit은 SPS(Sequence Parameter Set), PPS(Picture Parameter Set), IDR picture가 있다.

SPS : 00 00 00 01 67

PPS : 00 00 00 01 68

IDR : 00 00 00 01 65

H.264 데이터 스트림은 보통 SPS와 PPS로 시작하며 그 후 IDR과 NON-IDR 유닛들이 반복되며 온다.


SPS NAL Unit Header 예시

SPS = NAL start prefix + NAL unit + payload

Hex 0x67 = Binary 0110 0111이고 이것은 다음과 같이 표현할 수 있다.

forbidden_zero_bit = 0

nal_ref_idc = 3

nal_unit_type = 7


RTPPacket으로 전송

RTPPacket = RTPHeader(12byte) + H.264 Data (1400byte)

H.264 데이터는 영상데이터이기 때문에 RTP 패킷하나로 전송되어지기에는 너무 큰 데이터라 보통은 여러 패킷으로 쪼개져서 전송되어 진다.

다음은 Packet Type을 표로 나타낸 것이다.

보통 우리가 말하는 NAL Unit은 1-23이고, Single Packet이 있으므로 이를 주의해서 다뤄야합니다. RTSP로 전송되어지는 데이터를 RTP 패킷단위로 쪼개서 전송한 개발 경험이 있는데, 이때 Single 패킷을 고려하지 않아 제대로 구현되지 않았던 경험이 있습니다. 영상스트리밍은 무조건 SPS가 오고 그 다음 PPS가 온 후 I프레임이 전송됩니다.

Section칸의 숫자들은 참조 사이트인 https://tools.ietf.org/html/rfc6184 의 Section을 의미합니다.

프레임의 시작과 종료는 FU Header의 Start bit와 End bit를 보고 알 수 있습니다.

RTP Payload Format for FU-A Packet

RTP Payload Format for FU-B Packet

FU-b Packet에는 DON(Decoding Order Number) 가 있습니다.

FUHeader는 Start 1bit + End 1bit + Forbidden 1bit + Nal_unit_type 5bit로 구성되어 있습니다.

한 프레임의 시작과 끝은 Start bit 1일 때 부터 End bit 1이 될때까지의 Packet Data 이다.

      • Start bit = FUHeader 의 첫번째 bit 1
      • End bit = FUHeader의 두번째 bit 1

더 자세한 내용은 RFC 6184의 문서내용을 참조하기 바랍니다.


출처

https://tools.ietf.org/html/rfc6184

반응형

'IT > 프로토콜' 카테고리의 다른 글

[개발-RTP] RTP 분석_Introduction  (0) 2018.02.07
Comments