Tungkol sa H.264 profile-level-id
About H 264 Profile Level Id
Sa aming pag-unlad sa WebRTC, kung gagamitin namin ang H.264 bilang uri ng pag-encode ng video stream, haharapin namin ang isang problema, iyon ay, ang encoder at ang decoder ay kailangang makipag-ayos sa kanilang sariling mga kakayahan sa pag-encode at pag-decode. Halimbawa, kung ang encoder ay gumagamit ng mga mataas na antas na profile at antas, o gumagamit ng mga tampok sa pag-encode na hindi sinusuportahan ng decoder, magiging isang sakuna para sa decoder.
Tulad ng alam mo, maraming uri ng mga profile at antas ng H.264, at hindi sinusuportahan ng bawat encoder o decoder ang bawat profile at antas. Sa mga praktikal na aplikasyon, madalas naming nakikita ang isang 3-byte na halaga (tulad ng 42801f) upang makilala ang profile at antas ng H.264. Ang artikulong ito ay para lamang maitala nang maikli at ipaliwanag ang antas ng profile ng H.264. Paano makita ang id.
Ano ang Profile at Antas ng H.264?
Hindi ko na ididetalye ang mga ito, mayroong isang detalyadong listahan sa sumusunod na 2 mga link:
https://en.wikipedia.org/wiki/Advanced_Video_Coding#Profiles
https://en.wikipedia.org/wiki/Advanced_Video_Coding#Levels
Bagaman maraming uri ng Mga Profile at Antas, mayroon lamang kaunting mga karaniwan sa pagpoproseso ng WebRTC o real-time na streaming media. Halimbawa, ang WebRTC ay gumagamit ng OpenH264 bilang default, at sinusuportahan lamang ng encoder nito ang Constrained Baseline + Level 5.2 (tingnan ang OpenH264 github Paglalarawan ng home page).
Mga dokumento ng sanggunian
- Mga dokumentong binuo ng ITU (International Telecommunication Union): H.264: Advanced na pag-coding ng video para sa mga generic na audiovisual na serbisyo . pinapayagan Dito I-download sa (Na-download ko ang bersyon ng Abril 2017)
- Wikipedia: Advanced na Pag-coding ng Video
- RFC6184: RTP Payload Format para sa H.264 Video
Karaniwang halimbawa ng antas ng profile-level-id
Ang antas ng profile-level-id ay karaniwan sa sdp. Halimbawa, sa chrome: // webrtc-internal, kung pipilitin namin ang isang H.264 na naka-encode ng video stream, maaari naming makita ang profile-level-id na ito sa lokal na sdp:
Ang profile-level-id na ito ay nasa aming sanggunian sa itaas RFC6184 Mayroong mas detalyadong paglalarawan sa seksyong 8.1 Pag-rehistro ng Uri ng Media.
Hayaan akong magbigay ng isang halimbawa upang ilarawan kung paano magmukhang. Kunin ang mga halagang ipinakita sa pigura sa itaas. Kasama ang sumusunod na apat:
42001f 42e01f 4d0032 640032
Ang 3 bytes na ito ay pawang ipinahayag sa hexadecimal. Ang unang byte ay kumakatawan sa profile_idc (0x42, 0x4d, 0x64), ang pangalawang byte ay kumakatawan sa profile-iop, at ang pangatlong byte ay kumakatawan sa antas. Ang unang byte at ang pangatlong byte ay mas madaling maunawaan, halimbawa:
- 42001f : Ang unang byte 0x42 = decimal 66, ayon sa sangguniang pahina ng Wikipedia, 66 ay tumutugma sa Baseline Profile (BP, 66). Ang pangatlong byte 0x1f = decimal 31, ang kaukulang Antas ay 3.1
- 42e01f : Ang unang byte at ang pangatlong byte ay kapareho ng nasa itaas, ang 0xe0 sa gitna, pag-uusapan natin ito mamaya
- 4d0032 : Ang unang byte 0x4d = decimal 77 = Pangunahing Profile (MP, 77). Ang pangatlong byte 0x32 = decimal 50, Antas ay 5.0
- 640032 : Ang unang byte 0x64 = decimal 100 = Mataas na Profile (HiP, 100). Ang pangatlong byte ay kapareho ng nasa itaas
Kaya, ang una at pangatlong byte ay napaka-simple, at maaari mong maunawaan ang mga ito sa isang sulyap.
Tingnan natin ang byte sa gitna.
Ipinakilala sa RFC6184, ang pangalawang byte ay profile-iop , Ang bawat piraso nito ay tumutugma sa: constraint_set {0,1,2,3,4,5} _flag, isang kabuuang 6 na piraso, ang huling 2 piraso ay nakareserba na mga piraso, na palaging 0.
Kaya tingnan natin ang isa sa itaas 42e01f . Una sa pamamagitan ng unang byte at pangatlong byte, alam namin na ito ay Baseline Profile + Antas 3.1, ngunit ano ang pagkakaiba sa pagitan ng 42001f at 42e01f? Depende ito sa pangalawang byte 0xe0, ang binary nito ay:
1 1 1 0 0 0 00
Maaari naming makita ang sumusunod na paglalarawan sa pamamagitan ng pagtatanong sa seksyon ng profile na A.2.1.1 Napilit na Baseline ng dokumento ng ITU sa mga sanggunian na materyales:
Ang mga decoder na umaayon sa profile ng Constrained Baseline sa isang tukoy na antas ay may kakayahang mag-decode ng lahat ng mga bitstream kung saan ang lahat ng mga sumusunod ay totoo:
- Ang profile_idc ay katumbas ng 66 o ang constraint_set0_flag ay katumbas ng 1,
- ang constraint_set1_flag ay katumbas ng 1,
- Ang level_idc at constraint_set3_flag ay kumakatawan sa isang antas na mas mababa sa o katumbas ng tinukoy na antas.
Nangangahulugan ito na ang decoder ay may kakayahang i-decode ang lahat ng mga bit stream kapag natutugunan ang sumusunod na 3 mga kondisyon:
- Ang profile_idc ay 66 o constraint_set0_flag = 1, OK, naitatag (ang profile_idc ay 0x42, na kung saan ay 66 sa decimal, ang constraint_set0_flag ay katumbas ng 1)
- constraint_set1_flag = 1, OK, naitatag (ang constraint_set1_flag ay katumbas ng 1)
- Hindi ko partikular na maintindihan ang isang ito. Ang Level_idc (3.1) at constraint_set3_flag (0) ay nangangahulugang isang antas na mas mababa sa o katumbas ng tinukoy na antas?
Kaya sa pamamagitan ng paghula, ang 42e01f ay dapat na Constrained Baseline Profilee, at ang 42001f ay BaselineProfile, dahil ang 42001f ay hindi nasiyahan ang hindi bababa sa mga nasa itaas na kundisyon 1 at 2.
Bilang karagdagan, ang dalawang uri ng mga kahulugan at antas ng kahulugan ay maaari ding matagpuan sa katutubong code ng SDK na mapagkukunan ng WebRTC mobile terminal. Ang mga source code ay matatagpuan sa:
sdk android api org webrtc VideoCodecInfo.java (Android Native SDK)
sdk objc sangkap video_codec RTCH264ProfileLevelId.mm (iOS Native SDK)
Tulad ng nakikita natin sa code, tumutukoy lamang ito sa 2 mga kumbinasyon ng profile at antas:
42e01f: Pinilit na Baseline Profile + Antas 3.1
640c1f: Pinipigilan ang Mataas na Profile + Antas 3.1
Sa pamamagitan ng paraan, tingnan natin ang 0x0c sa 640c1f, ang binary nito ay:
0 0 0 0 1 1 00
Suriin ang dokumento ng ITU (seksyon A.2.4.2 Pinilit na Mataas na profile), at tingnan ang isang paglalarawan:
Ang profile_idc ay katumbas ng 100, ang constraint_set4_flag ay katumbas ng 1, ang constraint_set5_flag ay katumbas ng 1, at ang level_idc ay kumakatawan sa isang antas na mas mababa sa o katumbas ng tinukoy na antas.
Ang profile_idc ay katumbas ng 100 (ibig sabihin, 0x64), ang constraint_set4_flag at constraint_set5_flag ay dapat na katumbas ng 1 (nasiyahan), kaya't ang 640c ay kumakatawan sa Constrained High Profile.
Bilang karagdagan, maaari mo ring husgahan ang profile mula sa pahina ng Wikipedia sa mga sanggunian sa itaas, tulad ng ipinakita sa ibaba:
limitasyon set x (x = 1,3,4, 4 & 5 ...) ay tumutugma sa pagpilit_set {0,1,2,3,4,5} _flag. Ang katumbas na halaga ng bit ay kailangang 1.
OK, sa puntong ito, makikita natin ang profile-level-id sa hinaharap, mabilis nating malaman kung ano ang kahulugan nito.
Narito ang ilan pa:
64001f (Mataas na Profile + Antas 3.1)
640016 (Mataas na Profile + Antas 2.2)
640c34 (Pinilit na Mataas na Profile + Antas 5.2)
42801e (Baseline Profile + Antas 3.0)
Sa wakas, ang isang tao sa github ay nagsulat ng isang tool sa pag-parse ng antas ng profile na may js, https://github.com/ibc/h264-profile-level-id , Makatutulong din sa amin na maunawaan ang profile-level-id.