Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Առաջին մասը ` Տեսանյութի և պատկերների հետ աշխատելու հիմունքներ

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Ինչ? Վիդեո կոդեկը ծրագրաշարի/ապարատային մի մասն է, որը սեղմում և/կամ ապասեղմում է թվային տեսանյութը:

Ինչի համար: Չնայած որոշակի սահմանափակումներին ինչպես թողունակության, այնպես էլ
իսկ տվյալների պահպանման տարածքի առումով շուկան պահանջում է գնալով ավելի բարձր որակի տեսանյութ: Հիշու՞մ եք, թե ինչպես վերջին գրառման մեջ մենք հաշվարկեցինք պահանջվող նվազագույնը 30 կադր վայրկյանում, 24 բիթ/պիքսելում, 480x240 լուծաչափով։ Մենք ստացել ենք 82,944 Մբիթ/վ առանց սեղմման: Սեղմումը ներկայումս միակ միջոցն է՝ ընդհանուր առմամբ HD/FullHD/4K հեռուստացույցի էկրաններին և ինտերնետին փոխանցելու համար: Ինչպե՞ս է դա ձեռք բերվում: Հիմա եկեք համառոտ նայենք հիմնական մեթոդներին:

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Թարգմանությունը կատարվել է EDISON Software-ի աջակցությամբ։

նշանված ենք տեսահսկման համակարգերի ինտեգրումԻսկ մենք մշակում ենք միկրոտոմոգրաֆ.

Կոդեկ ընդդեմ կոնտեյների

Նորեկների սովորական սխալը թվային վիդեո կոդեկի և թվային վիդեո կոնտեյների շփոթումն է: Կոնտեյները որոշակի ձևաչափ է: Վիդեո (և, հնարավոր է, աուդիո) մետատվյալներ պարունակող փաթաթան: Սեղմված տեսանյութը կարելի է դիտարկել որպես բեռնարկղային բեռ:

Սովորաբար, վիդեո ֆայլի ընդլայնումը ցույց է տալիս կոնտեյների տեսակը: Օրինակ, video.mp4 ֆայլը հավանաբար կոնտեյներ է MPEG-4 Մաս 14, իսկ video.mkv անունով ֆայլը ամենայն հավանականությամբ մատրյոշկա. Կոդեկի և կոնտեյների ձևաչափի վրա լիովին վստահ լինելու համար կարող եք օգտագործել FFmpeg կամ MediaInfo- ն.

Մի քիչ պատմություն

Մինչև հասնելը Ինչպես?, եկեք մի փոքր սուզվենք պատմության մեջ՝ որոշ ավելի հին կոդեկներ մի փոքր ավելի լավ հասկանալու համար:

Տեսանյութի կոդեկ H.261 հայտնվել է 1990 թվականին (տեխնիկապես՝ 1988 թվականին) և ստեղծվել է տվյալների փոխանցման 64 Կբիթ/վ արագությամբ աշխատելու համար։ Այն արդեն օգտագործում էր այնպիսի գաղափարներ, ինչպիսիք են գունային ենթամեկուսիչները, մակրոբլոկները և այլն: Տեսակոդեկի ստանդարտը հրապարակվել է 1995 թվականին H.263, որը զարգացել է մինչեւ 2001 թ.

Առաջին տարբերակը ավարտվել է 2003 թվականին H.264 / AVC. Նույն տարում TrueMotion-ը թողարկեց իր անվճար կորստի վիդեո կոդեկը, որը կոչվում էր VP3. Google-ը գնել է ընկերությունը 2008 թվականին՝ թողարկելով VP8 նույն թվականին։ 2012 թվականի դեկտեմբերին Google-ը թողարկեց VP9, և այն աջակցվում է բրաուզերի շուկայի մոտ ¾-ում (ներառյալ շարժական սարքերը):

AV1 նոր անվճար և բաց կոդով վիդեո կոդեկ է, որը մշակվել է Դաշինք բաց մեդիայի համար (AOMmedia), որը ներառում է ամենահայտնի ընկերությունները, ինչպիսիք են՝ Google, Mozilla, Microsoft, Amazon, Netflix, AMD, ARM, NVidia, Intel և Cisco: Կոդեկի առաջին տարբերակը՝ 0.1.0, հրապարակվել է 7 թվականի ապրիլի 2016-ին։

AV1-ի ծնունդը

2015 թվականի սկզբին Google-ն աշխատում էր դրա վրա VP10Xiph-ը (որը պատկանում է Mozilla-ին) աշխատում էր Դաալա, և Cisco-ն ստեղծել է իր սեփական անվճար վիդեո կոդեկը, որը կոչվում է Thor.

Ապա MPEG LA առաջին անգամ հայտարարված տարեկան սահմանաչափերը HEVC (H.265) և 8 անգամ ավելի բարձր վճար, քան H.264-ի համար, բայց նրանք շուտով նորից փոխեցին կանոնները.

տարեկան սահմանափակում չկա,
բովանդակության վճար (եկամտի 0,5%) և
միավորի վճարը մոտ 10 անգամ բարձր է H.264-ից:

Դաշինք բաց մեդիայի համար ստեղծվել է տարբեր ոլորտների ընկերությունների կողմից՝ սարքավորումներ արտադրողներ (Intel, AMD, ARM, Nvidia, Cisco), բովանդակության մատակարարներ (Google, Netflix, Amazon), բրաուզեր ստեղծողներ (Google, Mozilla) և այլն։

Ընկերությունները ընդհանուր նպատակ ունեին՝ առանց հոնորարների վիդեո կոդեկ։ Հետո հայտնվում է AV1 շատ ավելի պարզ արտոնագրով: Թիմոթի Բ. Թերիբերրին ներկայացրեց ցնցող շնորհանդես, որը դարձավ ներկայիս AV1 կոնցեպտի և դրա լիցենզավորման մոդելի սկզբնավորումը:

Դուք կզարմանաք, եթե իմանաք, որ կարող եք վերլուծել AV1 կոդեկը բրաուզերի միջոցով (հետաքրքրվողները կարող են գնալ aomanalyzer.org).

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Ունիվերսալ կոդեկ

Եկեք դիտարկենք ունիվերսալ վիդեո կոդեկի հիմքում ընկած հիմնական մեխանիզմները: Այս հասկացությունների մեծ մասը օգտակար է և օգտագործվում է ժամանակակից կոդեկներում, ինչպիսիք են VP9, AV1 и HEVC. Ես զգուշացնում եմ ձեզ, որ բացատրված բաներից շատերը կպարզեցվեն: Երբեմն իրական աշխարհի օրինակները (ինչպես H.264-ի դեպքում) կօգտագործվեն տեխնոլոգիաները ցուցադրելու համար:

1-ին քայլ - պատկերի բաժանում

Առաջին քայլը շրջանակը բաժանելն է մի քանի բաժինների, ենթաբաժինների և դրանից դուրս:

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Ինչի համար? Պատճառները շատ են։ Երբ մենք պատկերը բաժանում ենք, մենք կարող ենք ավելի ճշգրիտ կանխատեսել շարժման վեկտորը՝ օգտագործելով փոքր հատվածներ փոքր շարժվող մասերի համար: Մինչև ստատիկ ֆոնի համար դուք կարող եք սահմանափակվել ավելի մեծ հատվածներով:

Կոդեկները սովորաբար կազմակերպում են այս բաժինները բաժինների (կամ կտորների), մակրոբլոկների (կամ կոդավորման ծառերի բլոկների) և բազմաթիվ ենթաբաժինների: Այս բաժանմունքների առավելագույն չափերը տարբեր են, HEVC-ն այն սահմանում է 64x64, մինչդեռ AVC-ն օգտագործում է 16x16, իսկ ենթաբաժինները կարող են բաժանվել մինչև 4x4 չափերի:

Հիշու՞մ եք վերջին հոդվածի շրջանակների տեսակները։ Նույնը կարող է կիրառվել բլոկների նկատմամբ, ուստի մենք կարող ենք ունենալ I-fragment, B-block, P-macroblock և այլն:

Նրանց համար, ովքեր ցանկանում են զբաղվել, դիտեք, թե ինչպես է պատկերը բաժանվում բաժինների և ենթաբաժինների: Դա անելու համար կարող եք օգտագործել նախորդ հոդվածում արդեն նշվածը: Intel Video Pro անալիզատոր (այն, որը վճարովի է, բայց անվճար փորձնական տարբերակով, որը սահմանափակվում է առաջին 10 կադրերով): Այստեղ վերլուծված բաժինները VP9:

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

2-րդ քայլ՝ կանխատեսում

Երբ մենք ունենանք բաժիններ, մենք կարող ենք նրանց համար աստղագիտական ​​կանխատեսումներ անել: Համար INTER-ի կանխատեսումները պետք է փոխանցվի շարժման վեկտորներ իսկ մնացածը, իսկ INTRA կանխատեսման համար այն փոխանցվում է կանխատեսման ուղղություն իսկ մնացածը։

3-րդ քայլ՝ վերափոխում

Երբ մենք ունենանք մնացորդային բլոկ (կանխատեսված հատված → իրական հատված), հնարավոր է այն փոխակերպել այնպես, որ մենք իմանանք, թե որ պիքսելները կարելի է դեն նետել՝ պահպանելով ընդհանուր որակը: Կան որոշ փոխակերպումներ, որոնք ապահովում են ճշգրիտ վարքագիծը:

Չնայած կան այլ մեթոդներ, եկեք նայենք դրանց ավելի մանրամասն: դիսկրետ կոսինուսային փոխակերպում (DCT - ից դիսկրետ կոսինուսային փոխակերպում) DCT-ի հիմնական գործառույթները.

  • Փոխակերպում է պիքսելների բլոկները հաճախականության գործակիցների հավասար չափի բլոկների:
  • Խտացնում է հզորությունը՝ օգնելու վերացնել տարածական ավելորդությունը:
  • Ապահովում է շրջելիություն։

Փետրվարի 2, 2017 Sintra R.J. (Cintra, RJ) և Bayer F.M. (Bayer FM) հրապարակել է հոդված պատկերի սեղմման համար DCT-ի նման փոխակերպման մասին, որը պահանջում է ընդամենը 14 հավելում:

Մի անհանգստացեք, եթե չեք հասկանում յուրաքանչյուր կետի առավելությունները: Այժմ եկեք օգտագործենք կոնկրետ օրինակներ՝ տեսնելու դրանց իրական արժեքը:

Վերցնենք այս 8x8 պիքսելների բլոկը.

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Այս բլոկը ներկայացվում է հետևյալ 8-ից 8 պիքսել պատկերով.

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Կիրառեք DCT պիքսելների այս բլոկի վրա և ստացեք 8x8 գործակիցների բլոկ.

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Եվ եթե այս գործակիցների բլոկը ներկայացնենք, ապա կստանանք հետևյալ պատկերը.

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Ինչպես տեսնում եք, այն նման չէ բնօրինակ պատկերին: Դուք տեսնում եք, որ առաջին գործակիցը շատ է տարբերվում բոլոր մյուսներից։ Այս առաջին գործակիցը հայտնի է որպես DC գործակից, որը ներկայացնում է մուտքային զանգվածի բոլոր նմուշները, միջինի պես մի բան:

Գործակիցների այս բլոկը հետաքրքիր հատկություն ունի՝ այն առանձնացնում է բարձր հաճախականության բաղադրիչները ցածր հաճախականությունից։

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Պատկերում էներգիայի մեծ մասը կենտրոնացած է ավելի ցածր հաճախականությունների վրա, ուստի, եթե պատկերը փոխարկեք հաճախականության բաղադրիչներին և հրաժարվեք ավելի բարձր հաճախականության գործակիցներից, կարող եք նվազեցնել պատկերը նկարագրելու համար անհրաժեշտ տվյալների քանակը՝ առանց նկարի չափազանց բարձր որակի զոհաբերելու:

Հաճախականությունը վերաբերում է նրան, թե որքան արագ է փոխվում ազդանշանը:

Փորձենք կիրառել թեստային դեպքում ստացված գիտելիքները՝ սկզբնական պատկերը վերափոխելով իր հաճախականության (գործակիցների բլոկի)՝ օգտագործելով DCT-ն, այնուհետև հեռացնելով ամենաքիչ կարևոր գործակիցների մի մասը:

Նախ այն փոխակերպում ենք հաճախականության տիրույթի։

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Հաջորդը, մենք հրաժարվում ենք գործակիցների մի մասը (67%), հիմնականում ստորին աջ մասը:

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Ի վերջո, մենք վերակառուցում ենք պատկերը գործակիցների այս անտեսված բլոկի միջից (հիշեք, որ այն պետք է շրջելի լինի) և համեմատենք այն բնօրինակի հետ:

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Մենք տեսնում ենք, որ այն նման է բնօրինակ պատկերին, բայց բնօրինակից շատ տարբերություններ կան։ Մենք դուրս նետեցինք 67,1875% և դեռ ստացանք օրիգինալին նման բան: Կարելի էր ավելի մտածված վերացնել գործակիցները՝ ավելի լավ որակի պատկեր ստանալու համար, բայց դա հաջորդ թեման է։

Յուրաքանչյուր գործակից ստեղծվում է բոլոր պիքսելների միջոցով

Կարևոր է. յուրաքանչյուր գործակից ուղղակիորեն չի արտացոլվում մեկ պիքսելով, այլ բոլոր պիքսելների կշռված գումարն է: Այս զարմանալի գրաֆիկը ցույց է տալիս, թե ինչպես են հաշվարկվում առաջին և երկրորդ գործակիցները՝ օգտագործելով յուրաքանչյուր ինդեքսի համար եզակի կշիռները:

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Կարող եք նաև փորձել պատկերացնել DCT-ն՝ նայելով դրա հիման վրա պարզ պատկերի ձևավորմանը: Օրինակ, ահա A խորհրդանիշը, որը ստեղծվել է յուրաքանչյուր գործակից քաշի միջոցով.

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

4-րդ քայլ՝ քվանտացում

Նախորդ քայլում որոշ գործակիցներ դուրս նետելուց հետո, վերջին քայլում (փոխակերպում) մենք կատարում ենք քվանտացման հատուկ ձև: Այս փուլում ընդունելի է ինֆորմացիա կորցնելը։ Կամ, ավելի պարզ, մենք կքվանտացնենք գործակիցները սեղմման հասնելու համար:

Ինչպե՞ս կարող եք քանակականացնել գործակիցների բլոկը: Ամենապարզ մեթոդներից մեկը միատեսակ քվանտացումն է, երբ վերցնում ենք բլոկը, այն բաժանում ենք մեկ արժեքի (10-ի) և արդյունքը կլորացնում ենք։

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Կարո՞ղ ենք շրջել գործակիցների այս բլոկը: Այո, մենք կարող ենք՝ բազմապատկելով նույն արժեքով, որով բաժանել ենք։

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Այս մոտեցումը լավագույնը չէ, քանի որ հաշվի չի առնում յուրաքանչյուր գործակցի կարևորությունը։ Կարելի է օգտագործել քվանտիզատորների մատրիցա՝ մեկ արժեքի փոխարեն, և այս մատրիցը կարող է օգտագործել DCT հատկությունը՝ քվանտացնելով ստորին աջ մասի մեծամասնությունը և վերին ձախի փոքրամասնությունը:

Քայլ 5 - էնտրոպիայի կոդավորում

Երբ մենք քվանտացրինք տվյալները (պատկերի բլոկներ, բեկորներ, շրջանակներ), մենք դեռ կարող ենք դրանք անկորուստ սեղմել: Տվյալները սեղմելու ալգորիթմական բազմաթիվ եղանակներ կան: Մենք պատրաստվում ենք արագ նայել դրանցից մի քանիսին, ավելի խորը հասկանալու համար կարող եք կարդալ «Հասկանալով սեղմումը. տվյալների սեղմումը ժամանակակից մշակողների համար» գիրքը («Հասկանալով սեղմումը. տվյալների սեղմումը ժամանակակից մշակողների համար»).

Տեսանյութի կոդավորում՝ օգտագործելով VLC

Եկեք ասենք, որ մենք ունենք կերպարների հոսք. a, e, r и t. Հավանականությունը (0-ից 1-ի սահմաններում), թե որքան հաճախ է յուրաքանչյուր նիշ հայտնվում հոսքում, ներկայացված է այս աղյուսակում:

a e r t
Հավանականություն 0,3 0,3 0,2 0,2

Ամենահավանականներին կարող ենք նշանակել եզակի երկուական կոդեր (ցանկալի է՝ փոքր), իսկ ավելի քիչ հավանականներին՝ ավելի մեծ կոդեր:

a e r t
Հավանականություն 0,3 0,3 0,2 0,2
Երկուական կոդ 0 10 110 1110

Մենք սեղմում ենք հոսքը՝ ենթադրելով, որ մենք վերջում կծախսենք 8 բիթ յուրաքանչյուր կերպարի համար: Առանց սեղմման, յուրաքանչյուր նիշի համար անհրաժեշտ կլինի 24 բիթ: Եթե ​​դուք փոխարինեք յուրաքանչյուր նիշ իր կոդով, դուք խնայողություններ եք ստանում:

Առաջին քայլը նիշի կոդավորումն է e, որը հավասար է 10-ի, իսկ երկրորդ նիշը a, որը ավելացված է (ոչ մաթեմատիկական եղանակով)՝ [10][0] և վերջապես երրորդ նիշը t, ինչը կազմում է մեր վերջնական սեղմված բիթ հոսքը հավասար [10][0][1110] կամ 1001110, որը պահանջում է ընդամենը 7 բիթ (3,4 անգամ ավելի քիչ տարածք, քան բնօրինակը)։

Խնդրում ենք նկատի ունենալ, որ յուրաքանչյուր ծածկագիր պետք է լինի եզակի ծածկագիր՝ նախածանցով: Հաֆմանի ալգորիթմ կօգնի ձեզ գտնել այս թվերը: Չնայած այս մեթոդը զերծ չէ իր թերություններից, կան վիդեո կոդեկներ, որոնք դեռ առաջարկում են սեղմման այս ալգորիթմական մեթոդը:

Ե՛վ կոդավորիչը, և՛ ապակոդավորիչը պետք է մուտք ունենան խորհրդանիշների աղյուսակ՝ իրենց երկուական կոդերով: Ուստի անհրաժեշտ է նաև աղյուսակ ուղարկել որպես մուտքագրում։

Թվաբանական կոդավորում

Եկեք ասենք, որ մենք ունենք կերպարների հոսք. a, e, r, s и t, և դրանց հավանականությունը ներկայացված է այս աղյուսակում։

a e r s t
Հավանականություն 0,3 0,3 0,15 0,05 0,2

Օգտագործելով այս աղյուսակը, մենք կկառուցենք տիրույթներ, որոնք պարունակում են բոլոր հնարավոր նիշերը՝ դասավորված ըստ ամենամեծ թվի:

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Այժմ եկեք կոդավորենք երեք նիշից բաղկացած հոսք. ուտել.

Նախ ընտրեք առաջին նիշը e, որը գտնվում է 0,3-ից մինչև 0,6 ենթատիրույթում (ներառյալ չհաշված): Մենք վերցնում ենք այս ենթատիրույթը և նորից բաժանում այն ​​նույն համամասնությամբ, ինչ նախկինում, բայց այս նոր միջակայքի համար:

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Եկեք շարունակենք կոդավորել մեր հոսքը ուտել. Այժմ վերցրեք երկրորդ նիշը a, որը գտնվում է նոր ենթատիրույթում 0,3-ից մինչև 0,39, այնուհետև վերցրեք մեր վերջին նիշը t և նորից կրկնելով նույն գործընթացը, մենք ստանում ենք վերջնական ենթատիրույթ 0,354-ից մինչև 0,372:

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Մենք պարզապես պետք է ընտրենք թիվ վերջին ենթատիրույթում 0,354-ից մինչև 0,372: Եկեք ընտրենք 0,36 (բայց դուք կարող եք ընտրել ցանկացած այլ թիվ այս ենթատիրույթում): Միայն այս համարով մենք կկարողանանք վերականգնել մեր սկզբնական հոսքը։ Կարծես մենք գիծ գծեինք տիրույթներում՝ մեր հոսքը կոդավորելու համար:

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Հակադարձ գործողությունը (այսինքն. վերծանում) նույնքան պարզ է՝ մեր 0,36 թվով և մեր սկզբնական տիրույթով մենք կարող ենք գործարկել նույն գործընթացը: Բայց հիմա, օգտագործելով այս համարը, մենք նույնացնում ենք այս համարի միջոցով կոդավորված հոսքը:

Առաջին միջակայքով մենք նկատում ենք, որ մեր թիվը համապատասխանում է շերտին, հետևաբար սա մեր առաջին նիշն է: Այժմ մենք կրկին բաժանում ենք այս ենթատիրույթը՝ հետևելով նույն գործընթացին, ինչ նախկինում: Այստեղ դուք կարող եք տեսնել, որ 0,36-ը համապատասխանում է խորհրդանիշին a, և գործընթացը կրկնելուց հետո հասանք վերջին կերպարին t (ձևավորելով մեր սկզբնական կոդավորված հոսքը ուտել).

Ե՛վ կոդավորիչը, և՛ ապակոդավորիչը պետք է ունենան սիմվոլների հավանականությունների աղյուսակ, ուստի անհրաժեշտ է այն ուղարկել նաև մուտքային տվյալների մեջ։

Բավականին էլեգանտ, այնպես չէ՞: Ով այս լուծումը հնարեց, անիծյալ խելացի էր: Որոշ վիդեո կոդեկներ օգտագործում են այս տեխնիկան (կամ գոնե առաջարկում են այն որպես տարբերակ):

Գաղափարն է՝ անկորուստ սեղմել քվանտացված բիթային հոսքը: Իհարկե, այս հոդվածում բացակայում են տոննա մանրամասներ, պատճառներ, փոխզիջումներ և այլն: Բայց եթե դուք մշակող եք, պետք է ավելին իմանաք: Նոր կոդեկները փորձում են օգտագործել էնտրոպիայի կոդավորման տարբեր ալգորիթմներ, ինչպիսիք են ANS- ը.

Քայլ 6 - bitstream ձևաչափ

Այս ամենն անելուց հետո մնում է սեղմված շրջանակները հանել կատարված քայլերի համատեքստում։ Ապակոդավորիչը պետք է հստակ տեղեկացված լինի կոդավորողի կողմից ընդունված որոշումների մասին: Ապակոդավորողին պետք է տրամադրվի բոլոր անհրաժեշտ տեղեկությունները. բիթերի խորություն, գունային տարածություն, լուծում, կանխատեսման տեղեկատվություն (շարժման վեկտորներ, ուղղորդված INTER կանխատեսում), պրոֆիլ, մակարդակ, կադրի արագություն, շրջանակի տեսակ, շրջանակի համար և շատ ավելին:

Մենք արագ կանդրադառնանք բիթսթրիմին H.264. Մեր առաջին քայլը նվազագույն H.264 բիթ հոսքի ստեղծումն է (FFmpeg լռելյայն ավելացնում է կոդավորման բոլոր տարբերակները, ինչպիսիք են. ՍԵՅ ՆԱԼ — մենք կիմանանք, թե ինչ է դա մի փոքր ավելի հեռու): Մենք կարող ենք դա անել՝ օգտագործելով մեր սեփական պահեստը և FFmpeg-ը:

./s/ffmpeg -i /files/i/minimal.png -pix_fmt yuv420p /files/v/minimal_yuv420.h264

Այս հրամանը կստեղծի չմշակված բիթ հոսք H.264 մեկ կադրով, 64×64 լուծաչափով, գունային տարածությամբ YUV420. Այս դեպքում որպես շրջանակ օգտագործվում է հետևյալ պատկերը.

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

H.264 bitstream

Ստանդարտ ՀՎՀ (H.264) որոշում է, որ տեղեկատվությունը կուղարկվի մակրոշրջանակներով (ցանցային իմաստով), որը կոչվում է ՆԱԼ (սա ցանցի աբստրակցիայի մակարդակ է): NAL-ի հիմնական նպատակն է ապահովել «վեբ-բարեկամական» վիդեո ներկայացում: Այս ստանդարտը պետք է աշխատի հեռուստացույցների վրա (հոսքի վրա հիմնված), ինտերնետի վրա (փաթեթների վրա):

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Գոյություն ունի համաժամացման նշիչ՝ NAL տարրերի սահմանները սահմանելու համար: Յուրաքանչյուր համաժամացման նշան պարունակում է արժեք 0x00 0x00 0x01, բացառությամբ առաջինի, որը հավասար է 0x00 0x00 0x00 0x01. Եթե ​​գործարկենք hexdump գեներացված H.264 բիթ հոսքի համար մենք նույնացնում ենք առնվազն երեք NAL նախշեր ֆայլի սկզբում:

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Ինչպես նշվեց, ապակոդավորիչը պետք է իմանա ոչ միայն պատկերի տվյալները, այլև տեսանյութի մանրամասները, շրջանակը, գույները, օգտագործված պարամետրերը և շատ ավելին: Յուրաքանչյուր NAL-ի առաջին բայթը սահմանում է իր կատեգորիան և տեսակը:

NAL տեսակի նույնացուցիչ Նկարագրություն
0 Անհայտ տեսակ
1 Կոդավորված պատկերի հատված առանց IDR
2 Կոդավորված հատվածի տվյալների բաժինը A
3 Կոդավորված հատվածի տվյալների բաժինը B
4 Կոդավորված հատվածի տվյալների բաժինը C
5 IDR պատկերի կոդավորված IDR հատված
6 Լրացուցիչ տեղեկություններ SEI-ի ընդլայնման մասին
7 SPS հաջորդականության պարամետրերի հավաքածու
8 PPS պատկերի պարամետրերի հավաքածու
9 Մուտքի բաժանիչ
10 Հերթականության ավարտը
11 Թեմայի վերջը
... ...

Սովորաբար bitstream-ի առաջին NAL-ն է PLC. NAL-ի այս տեսակը պատասխանատու է ընդհանուր կոդավորման փոփոխականների մասին տեղեկացնելու համար, ինչպիսիք են պրոֆիլը, մակարդակը, լուծումը և այլն:

Եթե ​​մենք բաց թողնենք առաջին համաժամացման նշիչը, կարող ենք վերծանել առաջին բայթը՝ պարզելու, թե որ NAL տեսակն է առաջինը:

Օրինակ, համաժամացման նշանից հետո առաջին բայթն է 01100111, որտեղ առաջին բիթը (0) գտնվում է f դաշտումorbidden_zero_bit. Հաջորդ 2 բիթ (11) պատմում է մեզ դաշտը nal_ref_idc, որը ցույց է տալիս, արդյոք այս NAL-ը հղման դաշտ է, թե ոչ: Իսկ մնացած 5 բիթերը (00111) պատմում է մեզ դաշտը nal_unit_type, այս դեպքում դա SPS բլոկն է (7) ՆԱԼ.

Երկրորդ բայթ (Երկուական=01100100, hex=0x64, Dec=100) SPS NAL-ում դաշտն է profile_idc, որը ցույց է տալիս այն պրոֆիլը, որն օգտագործել է կոդավորիչը: Այս դեպքում օգտագործվել է սահմանափակ բարձր պրոֆիլ (այսինքն՝ բարձր պրոֆիլ՝ առանց երկկողմանի B հատվածի աջակցության):

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Եթե ​​նայեք bitstream-ի բնութագրին H.264 SPS NAL-ի համար մենք կգտնենք բազմաթիվ արժեքներ պարամետրի անվան, կատեգորիայի և նկարագրության համար: Օրինակ՝ նայենք դաշտերին pic_width_in_mbs_minus_1 и pic_height_in_map_units_minus_1.

Պարամետրի անվանումը Աստիճան Նկարագրություն
pic_width_in_mbs_minus_1 0 ue(v)
pic_height_in_map_units_minus_1 0 ue(v)

Եթե ​​այս դաշտերի արժեքներով որոշ մաթեմատիկական գործողություններ կատարենք, ապա լուծում կստանանք։ Օգտագործելով 1920 x 1080, կարելի է ներկայացնել pic_width_in_mbs_minus_1 119 արժեքով ((119 + 1) * macroblock_size = 120 * 16 = 1920): Կրկին, տարածք խնայելու համար, 1920-ը կոդավորելու փոխարեն, մենք դա արեցինք 119-ով:

Եթե ​​մենք շարունակենք ստուգել մեր ստեղծված տեսանյութը երկուական ձևով (օրինակ. xxd -b -c 11 v/minimal_yuv420.h264), ապա կարող եք գնալ վերջին NAL-ին, որն ինքնին շրջանակն է:

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Այստեղ մենք տեսնում ենք նրա առաջին 6 բայթ արժեքները. 01100101 10001000 10000100 00000000 00100001 11111111. Քանի որ հայտնի է, որ առաջին բայթը ցույց է տալիս NAL տեսակը, այս դեպքում (00101) IDR հատվածն է (5), և այնուհետև կարող եք հետագայում ուսումնասիրել այն.

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Օգտագործելով ճշգրտման տեղեկատվությունը, հնարավոր կլինի վերծանել հատվածի տեսակը (slice_type) և շրջանակի համարը (շրջանակ_թիվ) ի թիվս այլ կարևոր ոլորտների:

Որոշ դաշտերի արժեքներ ստանալու համար (ue(v), me(v), se(v), կամ te(v)), մենք պետք է ապակոդավորենք բեկորը՝ օգտագործելով հատուկ ապակոդավորիչ՝ հիմնված էքսպոնենցիալ Գոլոմբի ծածկագիրը. Այս մեթոդը շատ արդյունավետ է փոփոխական արժեքների կոդավորման համար, հատկապես, երբ կան բազմաթիվ լռելյայն արժեքներ:

Արժեքներ slice_type и շրջանակ_թիվ այս տեսանյութի 7-ն են (I-fragment) և 0 (առաջին կադր):

Մի քիչ հոսք կարելի է դիտարկել որպես արձանագրություն: Եթե ​​ցանկանում եք ավելին իմանալ bitstream-ի մասին, դուք պետք է դիմեք ճշգրտմանը ITU H.264. Ահա մակրո դիագրամ, որը ցույց է տալիս, թե որտեղ են պատկերի տվյալները (YUV սեղմված ձևով):

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Այլ բիթսթրիմները կարող են հետազոտվել, օրինակ VP9, H.265 (HEVC) կամ նույնիսկ մեր նոր լավագույն բիթսթրիմը AV1. Արդյո՞ք նրանք բոլորը նման են: Ոչ, բայց գոնե մեկը հասկանալուց հետո շատ ավելի հեշտ է հասկանալ մնացածը:

Ցանկանու՞մ եք զբաղվել: Ուսումնասիրեք H.264 բիթ հոսքը

Դուք կարող եք ստեղծել մեկ կադր տեսանյութ և օգտագործել MediaInfo-ն՝ բիթսթրիմը ուսումնասիրելու համար H.264. Փաստորեն, ոչինչ չի խանգարում ձեզ նույնիսկ նայելու բիթային հոսքը վերլուծող աղբյուրի կոդը H.264 (ՀՎՀ).

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Պրակտիկայի համար կարող եք օգտագործել Intel Video Pro Analyzer-ը (արդյո՞ք ես արդեն ասացի, որ ծրագիրը վճարովի է, բայց կա անվճար փորձնական տարբերակ 10 կադրերի սահմանաչափով):

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Վերանայել

Նկատի ունեցեք, որ շատ ժամանակակից կոդեկներ օգտագործում են նույն մոդելը, որը մենք նոր ենք ուսումնասիրել: Այստեղ եկեք նայենք վիդեո կոդեկի բլոկային դիագրամին Thor. Այն պարունակում է բոլոր այն քայլերը, որոնց միջով անցել ենք։ Այս գրառման ամբողջ իմաստն այն է, որ գոնե ձեզ ավելի լավ պատկերացնեք այս ոլորտում նորարարությունները և փաստաթղթերը:

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Նախկինում հաշվարկվում էր, որ 139 ԳԲ սկավառակի տարածություն կպահանջվի մեկ ժամ տևողությամբ վիդեո ֆայլը 720p որակով և 30 կադր/վրկ պահելու համար։ Եթե ​​դուք օգտագործում եք այս հոդվածում քննարկված մեթոդները (միջշրջանակային և ներքին կանխատեսումներ, փոխակերպում, քվանտացում, էնտրոպիայի կոդավորում և այլն), ապա կարող եք հասնել (հիմնվելով այն փաստի վրա, որ մենք ծախսում ենք 0,031 բիթ մեկ պիքսելում), բավականին տեսանյութ։ բավարար որակ՝ զբաղեցնելով ընդամենը 367,82 ՄԲ, ոչ թե 139 ԳԲ հիշողություն։

Ինչպե՞ս է H.265-ը հասնում սեղմման ավելի լավ հարաբերակցության, քան H.264-ը:

Այժմ, երբ մենք ավելին գիտենք այն մասին, թե ինչպես են աշխատում կոդեկները, ավելի հեշտ է հասկանալ, թե ինչպես են նոր կոդեկները կարող ավելի բարձր լուծումներ տալ ավելի քիչ բիթերով:

Եթե ​​համեմատենք ՀՎՀ и HEVC, հարկ է հիշել, որ սա գրեթե միշտ ընտրություն է պրոցեսորի ավելի մեծ բեռի և սեղմման հարաբերակցության միջև:

HEVC ունի ավելի շատ բաժին (և ենթաբաժին) տարբերակներ, քան ՀՎՀ, ավելի շատ ներքին կանխատեսման ուղղություններ, բարելավված էնտրոպիայի կոդավորում և այլն: Այս բոլոր բարելավումները կատարվել են H.265 ունակ է սեղմել 50%-ով ավելի, քան H.264.

Ինչպե՞ս է աշխատում վիդեո կոդեկը: Մաս 2. Ինչ, ինչու, ինչպես

Առաջին մասը ` Տեսանյութի և պատկերների հետ աշխատելու հիմունքներ

Source: www.habr.com

Добавить комментарий