WebRTC의 AV 1 RTP를 웹 파일로 그룹화하는 방법

11371 단어 WebRTCWebMav1rtptech
AV 1 디코더를 사용하는 RTP 패키지는 웹 파일에서 녹화에 필요한 지식과 방법을 정리합니다.(브라우저에서 Media Recorder를 사용하는 것이 아니라...)
WebRTC를 통해 AV 1의 RTP를 그룹화하여 웹 파일에 녹화하는 프로그램 TypeScript+Node입니다.js에서 실제로 실시했습니다.
https://github.com/shinyoshiaki/werift-webrtc/blob/v0.13.5/packages/rtp/src/codec/av1.ts
비디오를 확인하는 웹 파일은 크롬과 VLC를 통해 재생할 수 있습니다.

참고 자료

  • AOM AV1 codec mapping in Matroska/WebM
  • https://github.com/ietf-wg-cellar/matroska-specification/blob/master/codec/av1.md
  • AV 1의 바이너리 파일을 웹 파일로 설정하는 방법이 적힌 규격서
  • RTP Payload Format For AV1 (v1.0)
  • https://aomediacodec.github.io/av1-rtp-spec/
  • AV 1 디코더용 RTP Paylad의 사양에 대한 규격서
  • OBU syntax
  • https://aomedia.org/av1/specification/syntax/#obu-syntax
  • AV 1의 OBU 세척 방법에 관한 규격서
  • 나는 각종 자료를 보러 간다.

    AOM AV1 codec mapping in Matroska/WebM


    에서는 Chrome과 VLC로 웹 파일을 재생하는 데 필요한 EBML의 Element을 나열합니다.
  • Header
  • Segment
  • Info
  • Tracks
  • Track
  • TrackNumber
  • TrackUID
  • CodecName
  • AV1
  • TrackType
  • 1
  • VideoTrack
  • Cluster
  • BlockData(SimpleBlock)
  • CodecName은 AV1입니다.
    주의가 필요합니다.
    BlockData(Simple Block)에 저장된 OBU가 요구하는 필드와 RTP Paylad에 저장된 OBU의 필드 상태는 각자의 규격에 차이가 있다.
    이것에 대해 뒷부분에서 설명하다.

    Block Data


    AOM AV 1 codec mapping in Matroska/WebM의 규격서이 영역에는 블록 데이터가 요구하는 OBU의 필드 사양이 기재되어 있습니다.
    RTP Paylad의 OBU 필드와 BlockData가 요구하는 OBU 필드 중 일치하지 않는 부분이 obu입니다.has_size_field와 덧붙인 obu사이즈입니다.
    RTP Payload의 OBU는 Obu입니다.has_size_field는 0이고 BlockData의 OBU는 1이어야 합니다.그다음에 오부.has_size_필드가 1이에요.사이즈에도 가격이 필요해요.
    따라서 RTP Payload에서 꺼낸 OBU를 BlockData에 저장하기 위해 obuhas_size_필드를 편집하는 기초 위에서사이즈 추가가 필요합니다.
    다른 필드에 관해서는 RTP Payload의 OBU를 편집하지 않으면 크롬 & VLC에서 재생할 수 있는 웹 파일을 만들 수 있습니다.

    RTP Payload Format For AV1


    RTP Paylad를 웹 페이지 파일에 저장하려면 RTP Paylad에서 다음과 같이 체크 아웃해야 합니다.
  • 키프레임 플래그
  • OBU
  • 최종적으로 RTP Payload에서 OBU의 집합을 꺼내고 그 중의 OBU의 집합에 관건적인 프레임이 있는지 정보를 꺼내면 웹 페이지의 BlockData에 저장하여 녹화할 수 있다.

    AV 1 RTP Paylad 구성


    AV 1의 RTP Payload는 다음 두 부분으로 나뉘어 있습니다.
    AV1 Aggregation Header
     0 1 2 3 4 5 6 7
    +-+-+-+-+-+-+-+-+
    |Z|Y| W |N|-|-|-|
    +-+-+-+-+-+-+-+-+
    
    Payload
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |Z|Y|0 0|N|-|-|-|  OBU element 1 size (leb128)  |               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
    :                                                               :
    :                      OBU element 1 data                       :
    :                                                               :
    |                                                               |
    |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                               |  OBU element 2 size (leb128)  |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    :                                                               :
    :                       OBU element 2 data                      :
    :                                                               :
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    :                                                               :
    :                              ...                              :
    :                                                               :
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |OBU e... N size|                                               |
    +-+-+-+-+-+-+-+-+       OBU element N data      +-+-+-+-+-+-+-+-+
    |                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
    RTP Payload의 시작AV1 Aggregation Header이 있고, 그 다음은 OBU 요소의 length 필드+OBU 요소의 집합Payload이다.length 필드 + OBU 요소를 여러 그룹으로 구성할 수 있습니다.

    AV1 Aggregation Header


    각 필드


    Z
    RTP Paylad의 시작을 나타내는 OBU 요소가 세그먼트로 표시되는지 여부를 나타냅니다.
    시작 요소
    즉, 첫 번째 OBU 요소는 이전 RTP Paylad 세션의 마지막 OBU 요소의 후속입니다.
    Y
    RTP Paylad의 마지막 OBU 요소가 세그먼트로 표시됨을 나타냅니다.
    다음 RTP Paylad의 시작 부분인 OBU 요소 세션은 Aggregation Header의 Z 플래그가 1입니다.
    W
    RTP Paylad에 포함된 OBU의 수를 나타냅니다.
    만약 W의 값이 0이라면 RTP Paylload에 포함된 각 OBU는 이에 대응하는length 필드를 가지고 있다(W는 0이지만 실제로 OBU의 수량은 0이 중요하지 않아 번거롭다).
    단,length 필드를 생략할 수 있는 경우,length 필드를 생략합니다.
    N
    OBU elements에 키프레임이 있으면 1입니다.

    Payload


    Payload에는 OBU 및 OBU의 length 필드가 포함됩니다.length 필드는 Leb128 인코딩 형식으로 인코딩됩니다.
    OBU와 length 팜의 조합에는 여러 개의 Payload가 포함될 수 있습니다.
    크롬의 경우 RTP Payload 크기가 약 1200byte를 넘으면 마지막 OBU가 에피소드가 된다.이 임계값은 MTU에서 파생될 수 있습니다.
    OBU가 세그먼트화될 때 해당 OBU가 속한 RTP Payload의 Aggregation Header의 Y 플래그는 1이고 다음 RTP Paylad의 Z 플래그는 1이다.
    AV1의 RTP Paylowad는 원칙적으로 각 OBU에 대응하는length 필드를 가지지만, AV1의 OBU Header에 대해서도 같은 용도를 가진obuhas_size_field 및 obu크기가 있습니다.RTP Paylad의 length 필드와 OBU Header의 obu크기의 목적이 중복되고 지루하기 때문에 RTP Payload의 OBU Header의 obuhas_size_항상 0,obu-field크기가 존재하지 않습니다.
    이 방법은 웹 페이지의 규격과 다르기 때문에 적합하지 않다.아까 Block Data 부분에서 말했듯이 Block Data의 OBU Header는 obu입니다.has_size_field 및 obu사이즈는 필수이기 때문에 RTP Paylload의 OBU를 웹의 Block Data에 저장하기 위해 OBU 필드를 고쳐야 합니다.

    OBU syntax


    RTP Payload에 포함된 OBU의 필드와 웹의 BlockData가 요구하는 OBU의 필드 규격이 다르기 때문에 RTP Payload의 OBU를 웹의 BlockData에 저장하기 위해서는 RTP Payload의 OBU의 필드를 고쳐야 한다.이를 위해서는 OBU의 문법에 따라 OBU를 분류화/엄숙화해야 한다.
    OBU는 문법 규정이 길기 때문에 본 기사에서 사용하는 부분만 본다.
    function open_bitstream_unit(sz) {
      obu_forbidden_bit; // 1bit
      obu_type; // 4bit
      obu_extension_flag; // 1bit
      obu_has_size_field; // 1bit
      obu_reserved_1bit; // 1bit
      if (obu_extension_flag == 1) {
        obu_extension_header();
      }
      if (obu_has_size_field) {
        obu_size; // leb128
      }
    }
    

    각 필드


    obu_forbidden_bit
    사용하지 않습니다.
    obu_type
    다음과 같은 Type이 있습니다.크롬 RTP에서 기본적으로 나오는 건 1번 OBU입니다.SEQUENCE_HEADER와 6번 OBU.FRAME입니다.다른 건 못 봤어요.
    OBU_SEQUENCE_HEADER는 키프레임이 재생될 때 온 것 같습니다.
    interface OBU_TYPES {
      0: "Reserved";
      1: "OBU_SEQUENCE_HEADER";
      2: "OBU_TEMPORAL_DELIMITER";
      3: "OBU_FRAME_HEADER";
      4: "OBU_TILE_GROUP";
      5: "OBU_METADATA";
      6: "OBU_FRAME";
      7: "OBU_REDUNDANT_FRAME_HEADER";
      8: "OBU_TILE_LIST";
      15: "OBU_PADDING";
    }
    
    obu_extension_flag
    나는 지금 크롬이 이 로고를 사용하는 것을 본 적이 없다.머지않아 사용될 것이다.
    obu_has_size_field
    플래그가 1이면 OBU는 obu크기 필드가 있습니다.
    obu_reserved_1bit
    사용하지 않습니다.
    obu_size
    OBU의 페이로드(OBU의 OBU Header 및 obu size 이외의 영역) 크기는 Leb128로 인코딩된 값입니다.

    OBU 필드 편집


    RTP Paylad의 OBU를 웹으로 변환하는 단계를 요약해 보겠습니다.
  • OBU의 바이너리 분해
  • obu_has_size_필드를 1로 설정
  • obu_사이즈에 OBU를 넣는 유효 하중 사이즈
  • OBU를 바이너리로 직렬화
  • 여기까지의 총결산


    마지막으로 RTP Paylowad를 웹 페이지 파일에 기록하는 단계를 요약했습니다.
  • 웹을 조립하는 EBML의 시작 부분
  • Header
  • Segment
  • Cluster
  • RTP 수신
  • RTP Payload를 버퍼에 저장합니다.
  • RTP 헤더의 태그가 서 있으면
  • 버퍼의 RTP Payload AV 1 Aggregation Header 분류
  • N 플래그에 키프레임이 포함되어 있는지 확인
  • Z 또는 Y 플래그가 세로로 세워진 경우 세그먼트에 대한 OBU 조합
  • OBU를 분류
  • 버퍼 지우기
  • OBU들의 obuhas_size_필드를 1로 만들겠습니다.사이즈에 OBU를 넣는 유효 하중 사이즈
  • OBU 정숙화
  • 웹의 Block Data
  • 에 OBU와 키프레임 정보를 넣습니다.

    최후


    직접 제목인 Google에서 'AV 1RTP 웹m 비디오' 를 검색했지만, 그 실제 기사를 찾지 못했기 때문에 이번에 이 기사를 써 보았습니다.
    스타일북을 읽는 연습이 될 수 있어서 정말 다행입니다.

    좋은 웹페이지 즐겨찾기