45 տեսաերիզների թվայնացման իմ ութամյա ձգտումը: Մաս 2

Առաջին մասը նկարագրում է հին ընտանեկան տեսանյութերը թվայնացնելու և դրանք առանձին տեսարանների բաժանելու դժվարին փորձը. Բոլոր հոլովակները մշակելուց հետո ես ուզում էի կազմակերպել դրանց դիտումը առցանց այնպես, ինչպես հարմար է YouTube-ում։ Քանի որ դրանք ընտանիքի անձնական հիշողություններն են, դրանք չեն կարող տեղադրվել հենց YouTube-ում: Մեզ պետք է ավելի մասնավոր հոսթինգ, որը և՛ հարմար է, և՛ անվտանգ:

Քայլ 3. Հրապարակել

ClipBucket, բաց կոդով YouTube-ի կլոն, որը կարող եք տեղադրել ձեր սեփական սերվերի վրա

Առաջին հերթին ես փորձեցի ClipBucket, որն իրեն անվանում է բաց կոդով YouTube-ի կլոն, որը կարող եք տեղադրել ձեր սերվերում:

45 տեսաերիզների թվայնացման իմ ութամյա ձգտումը: Մաս 2

Զարմանալիորեն, ClipBucket-ը չունի տեղադրման հրահանգներ: Շնորհիվ արտաքին կառավարում я ավտոմատացված տեղադրման գործընթացը միջոցով Հղիություն, սերվերի կազմաձևման կառավարման գործիք:

Դժվարության մի մասն այն էր, որ ClipBucket-ի տեղադրման սկրիպտներն ամբողջությամբ կոտրված էին: Այդ ժամանակ ես աշխատել է Google-ում և պայմանագրի պայմաններով իրավունք չուներ նպաստել YouTube-ի բաց կոդով կլոնավորմանը, սակայն ես տեղադրեց վրիպակի զեկույցորից հեշտ էր անհրաժեշտ ուղղումներ կատարել։ Անցան ամիսներ, և նրանք դեռ չէին հասկանում, թե որն է խնդիրը։ Փոխարենը ամեն ինչ ավելացրեցին ավելին, քան սխալներ յուրաքանչյուր թողարկման մեջ:

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

MediaGoblin՝ ավելի ժամանակակից այլընտրանք

ClipBucket-ի հետ կապված մի քանի ամիս վրդովմունքից հետո ես վերանայեցի առկա տարբերակները և գտա ՄեդիաԳոբլին.

45 տեսաերիզների թվայնացման իմ ութամյա ձգտումը: Մաս 2
ՄեդիաԳոբլին ինքնուրույն մեդիա փոխանակման հարթակ է

MediaGoblin-ը շատ լավություններ ունի: Ի տարբերություն ClipBucket-ի անհրապույր PHP-ում, MediaGoblin-ը գրված է Python-ով, մի լեզվով, որով ես կոդ գրելու մեծ փորձ ունեմ: Ուտել հրամանի տողի ինտերֆեյս, ինչը հեշտացնում է տեսանյութերի ներբեռնման ավտոմատացումը: Ամենակարևորը, MediaGoblin-ը գալիս է Դոկերի պատկեր, որը վերացնում է տեղադրման հետ կապված ցանկացած խնդիր:

դոկեր տեխնոլոգիա է, որը ստեղծում է ինքնուրույն միջավայր ցանկացած վայրում աշխատող հավելվածի համար: Ես օգտագործում եմ Docker-ը իմ նախագծերից շատերը.

MediaGoblin-ի վերագրանցման զարմանալի դժվարությունը

Ես ենթադրում էի, որ MediaGoblin դոկերի պատկերի տեղակայումը աննշան խնդիր կլինի: Դե, այնքան էլ այդպես չստացվեց:

Ավարտված պատկերը չուներ երկու անհրաժեշտ գործառույթ.

  • Նույնականացմանը
    • MediaGoblin-ը լռելյայն ստեղծում է հանրային մեդիա պորտալ, և ինձ անհրաժեշտ էր միջոց՝ սահմանափակելու կողմնակի անձանց մուտքը:
  • Տրանսկոդավորում
    • Ամեն անգամ, երբ տեսանյութ եք վերբեռնում, MediaGoblin-ը փորձում է վերակոդավորել այն՝ օպտիմալ հոսքի համար: Եթե ​​տեսանյութն ի սկզբանե պատրաստ է հեռարձակման, տրանսկոդավորումը վատթարանում է որակը:
    • MediaGoblin-ը տրամադրում է անջատել տրանսկոդավորումը կազմաձևման ընտրանքների միջոցով, բայց դա հնարավոր չէ անել գոյություն ունեցող Docker պատկերում:

Դե, խնդիր չկա: Docker պատկերը գալիս է բաց կոդով, Այսպիսով դու կարող ես ինքներդ վերակառուցեք այն.

Ցավոք, Docker պատկերն այլևս կառուցված չէ հոսանքով MediaGoblin պահոց. Ես փորձեցի այն համաժամեցնել վերջին հաջող կառուցման տարբերակի հետ, բայց դա նույնպես չստացվեց: Թեև ես օգտագործեցի նույն կոդը, MediaGoblin-ի արտաքին կախվածությունները փոխվեցին՝ կոտրելով կառուցվածքը: Տասնյակ ժամ անց ես նորից ու նորից գործարկեցի 10-15 րոպեանոց MediaGoblin-ի կառուցման գործընթացը, մինչև այն վերջապես աշխատեց:

Նույնը տեղի ունեցավ մի քանի ամիս անց։ Ընդհանուր առմամբ, վերջին մի քանի տարիների ընթացքում MediaGoblin-ի կախվածության շղթան մի քանի անգամ կոտրել է իմ կառուցվածքը, և վերջին անգամ դա տեղի է ունեցել հենց այն ժամանակ, երբ ես գրում էի այս հոդվածը: Ես վերջացրի գրառումը MediaGoblin-ի սեփական պատառաքաղը c կոշտ կոդավորված կախվածություններ և բացահայտորեն նշված գրադարանային տարբերակները: Այսինքն՝ կասկածելի պնդման փոխարեն, որ MediaGoblin-ն աշխատում է ցանկացած տարբերակով նեխուր >= 3.0, ես տեղադրեցի հատուկ կախվածություն տարբերակից նեխուր 4.2.1, քանի որ MediaGoblin-ը փորձարկել եմ այս տարբերակով։ Կարծես թե արտադրանքը պետք է վերարտադրվող կառուցման մեխանիզմբայց ես դեռ չեմ արել:

Ինչևէ, երկար ժամերի պայքարից հետո ես վերջապես կարողացա կառուցել և կարգավորել MediaGoblin-ը Docker պատկերով։ Արդեն հեշտ էր բաց թողնել ավելորդ տրանսկոդավորումը и տեղադրեք Nginx նույնականացման համար.

Քայլ 4. Հոսթինգ

Քանի որ MediaGoblin-ը գործարկում էր Docker-ը իմ տեղական մեքենայի վրա, հաջորդ քայլը ամպային սերվերի վրա տեղակայումն էր, որպեսզի ընտանիքը կարողանա դիտել տեսանյութը:

MediaGoblin-ը և տեսանյութերի պահպանման խնդիրը

Կան բազմաթիվ հարթակներ, որոնք վերցնում են Docker պատկերը և տեղադրում այն ​​հանրային URL-ում: Բռնելն այն է, որ բացի բուն հավելվածից, պետք է տեղադրվեին 33 ԳԲ վիդեո ֆայլեր: Հնարավոր էր դրանք կոշտ կոդավորել դոկերի պատկերով, բայց պարզվեց, որ դա ծանր ու տգեղ էր: Կազմաձևի մեկ տող փոխելու համար կպահանջվի 33 ԳԲ տվյալների վերաբաշխում:

Երբ ես օգտագործեցի ClipBucket-ը, ես լուծեցի խնդիրը gcsfuse - օգտակար ծրագիր, որը թույլ է տալիս օպերացիոն համակարգին դիրեկտորիաներ վերբեռնել Google Cloud ամպային պահեստում՝ որպես սովորական ուղիներ դեպի ֆայլային համակարգ: Ես հյուրընկալեցի վիդեո ֆայլերը Google Cloud-ում և օգտագործեցի gcsfuse՝ դրանք որպես տեղական ֆայլեր ClipBucket-ում ցուցադրելու համար:

Տարբերությունն այն էր, որ ClipBucket-ը աշխատում էր իրական վիրտուալ մեքենայով, մինչդեռ MediaGoblin-ն աշխատում էր Docker կոնտեյներով: Այստեղ ամպային պահեստից ֆայլերի մոնտաժումը շատ ավելի դժվար ստացվեց: Տասնյակ ժամեր ծախսեցի բոլոր խնդիրները լուծելու վրա ու գրեցի այդ մասին ամբողջ բլոգի գրառումը.

45 տեսաերիզների թվայնացման իմ ութամյա ձգտումը: Մաս 2
MediaGoblin-ի նախնական ինտեգրումը Google Cloud պահեստավորման հետ, որը Ի պատմել է 2018թ

Մի քանի շաբաթ անց բոլոր բաղադրիչները կարգավորելուց հետո ամեն ինչ աշխատեց: Առանց MediaGoblin կոդի որևէ փոփոխություն կատարելու՝ ես խաբում եմ, որպեսզի այն կարողանա կարդալ և գրել մեդիա ֆայլեր Google ամպային պահեստում:

Միակ խնդիրն այն էր, որ MediaGoblin-ը սկսեց անպարկեշտ դանդաղ աշխատել։ Տեսանյութի մանրապատկերները գլխավոր էջ վերբեռնելու համար պահանջվեց հսկայական 20 վայրկյան: Եթե ​​տեսանյութ դիտելիս առաջ եք ցատկել, MediaGoblin-ը կանգ է առել անվերջ 10 վայրկյանով մինչև վերսկսել նվագարկումը:

Հիմնական խնդիրն այն էր, որ տեսանյութերն ու նկարները օգտատերերին հասնում էին երկար, շրջանաձև ճանապարհով: Նրանք ստիպված էին Google-ի ամպային պահեստից gcsfuse-ի միջոցով անցնել MediaGoblin, Nginx, և միայն դրանից հետո նրանք մտան օգտատիրոջ զննարկիչ: Հիմնական խոչընդոտը gcsfuse-ն էր, որը օպտիմիզացված չէ արագ կատարման համար: Մշակողները նախազգուշացնում են կոմունալ ծառայության մեծ ուշացումների մասին հենց նախագծի գլխավոր էջում.

45 տեսաերիզների թվայնացման իմ ութամյա ձգտումը: Մաս 2
Ուշադրություն վատ կատարման մասին gcsfuse փաստաթղթերում

Իդեալում, զննարկիչը պետք է ֆայլեր քաշի անմիջապես Google Cloud-ից՝ շրջանցելով բոլոր միջանկյալ շերտերը: Ինչպե՞ս կարող եմ դա անել՝ առանց խորանալու MediaGoblin կոդերի բազայի մեջ և ավելացնելու Google Cloud ինտեգրման բարդ տրամաբանությունը:

sub_filter հնարք nginx-ում

Բարեբախտաբար, ես գտա հեշտ լուծում փոքր - ինչ տգեղ. Ես ավելացրել եմ default.conf կոնֆիգուրացիան Nginx-ում նման զտիչ:

sub_filter "/mgoblin_media/media_entries/" "https://storage.googleapis.com/MY-GCS-BUCKET/media_entries/";
sub_filter_once off;

Իմ կարգավորումներում Nginx-ը հանդես էր գալիս որպես վստահված անձ MediaGoblin-ի և վերջնական օգտագործողի միջև: Վերոնշյալ հրահանգը Nginx-ին ասում է որոնել և փոխարինել MediaGoblin HTML-ի բոլոր պատասխանները՝ նախքան դրանք վերջնական օգտագործողին մատուցելը: Nginx-ը փոխարինում է MediaGoblin մեդիա ֆայլերի բոլոր հարաբերական ուղիները Google-ի ամպային պահեստի URL-ներով:

Օրինակ, MediaGoblin-ը ստեղծում է այս HTML-ը.

<video width="720" height="480" controls autoplay>
  <source
    src="/mgoblin_media/media_entries/16/Michael-riding-a-bike.mp4"
    type="video/mp4">
</video>

Nginx-ը փոխում է պատասխանը՝

<video width="720" height="480" controls autoplay>
  <source
    src="https://storage.googleapis.com/MY-GCS-BUCKET/media_entries/16/Michael-riding-a-bike.mp4"
    type="video/mp4">
</video>

Այժմ ամեն ինչ աշխատում է այնպես, ինչպես պետք է.

45 տեսաերիզների թվայնացման իմ ութամյա ձգտումը: Մաս 2
Nginx-ը վերագրում է MediaGoblin-ի պատասխանները, որպեսզի հաճախորդները կարողանան մեդիա ֆայլեր պահանջել անմիջապես Google ամպային պահեստից

Իմ լուծման լավագույն մասն այն է, որ այն չի պահանջում որևէ փոփոխություն MediaGoblin կոդի մեջ: Երկու տողանի Nginx հրահանգը անխափան կերպով միավորում է MediaGoblin-ը և Google Cloud-ը, չնայած երկու ծառայությունները միմյանց մասին ոչինչ չգիտեն:

ՆշումԱյս լուծումը պահանջում է, որ Google Cloud Storage-ի ֆայլերը ընթեռնելի լինեն բոլորի համար: Չլիազորված մուտքի ռիսկը նվազեցնելու համար ես օգտագործում եմ երկար պատահական դույլի անվանում (օրինակ՝ mediagoblin-39dpduhfz1wstbprmyk5ak29) և ստուգեք, որ դույլի մուտքի վերահսկման քաղաքականությունը թույլ չի տալիս չարտոնված օգտվողներին ցուցադրել գրացուցակի բովանդակությունը:

Վերջնական արտադրանք

Այս պահին ես ունեի ամբողջական, աշխատանքային լուծում: MediaGoblin-ը ուրախությամբ աշխատում էր Google Cloud Platform-ում իր սեփական կոնտեյներով, ուստի այն հաճախակի կարկատելու կամ թարմացնելու կարիք չուներ: Իմ գործընթացում ամեն ինչ ավտոմատացված էր և վերարտադրելի՝ թույլ տալով պարզ խմբագրումներ կամ հետադարձումներ կատարել նախորդ տարբերակներից:

Իմ ընտանիքին շատ դուր եկավ, թե որքան հեշտ է տեսանյութեր դիտելը: Վերևում նկարագրված Nginx հաքի օգնությամբ տեսանյութի հետ աշխատելը դարձավ նույնքան արագ, որքան YouTube-ում:

Դիտման էկրանն այսպիսի տեսք ունի.

45 տեսաերիզների թվայնացման իմ ութամյա ձգտումը: Մաս 2
Ընտանեկան տեսանյութերի կատալոգի բովանդակությունը ըստ «Լավագույն» պիտակի

Մանրապատկերի վրա սեղմելով՝ բացվում է հետևյալ էկրանը.

45 տեսաերիզների թվայնացման իմ ութամյա ձգտումը: Մաս 2
Անհատական ​​հոլովակի դիտում մեդիա սերվերի վրա

Երկար տարիների աշխատանքից հետո ես աներևակայելի ուրախ էի հարազատներին հնարավորություն տալ դիտելու մեր տեսանյութերը նույն հարմար ինտերֆեյսով, ինչ YouTube-ում, որն ի սկզբանե ցանկանում էի:

Բոնուս. ծախսերի կրճատում ամսական $1-ից պակաս

Դուք հազվադեպ եք դիտում տնային տեսանյութերը, միայն մի քանի ամիսը մեկ: Իմ ընտանիքը միասին տարեկան մոտ 20 ժամ թրաֆիկ էր ստեղծում, բայց սերվերը աշխատում էր 15/99,7: Ես ամսական վճարում էի XNUMX դոլար մի սերվերի համար, որը ժամանակի XNUMX%-ով անկում էր ապրում:

2018-ի վերջին Google-ը թողարկեց արտադրանք Cloud Run. Killer ֆունկցիան այնքան արագ էր գործարկում Docker կոնտեյներները, որ հավելվածը կարող էր պատասխանել HTTP հարցումներին: Այսինքն, սերվերը կարող է մնալ սպասման ռեժիմում և սկսել միայն այն ժամանակ, երբ ինչ-որ մեկը ցանկանում է գնալ դրան: Իմ նման հազվադեպ գործարկվող հավելվածների համար ծախսերը ամսական $15-ից հասել են տարեկան մի քանի ցենտի:

Չեմ հիշում պատճառներով, Cloud Run-ը չաշխատեց իմ MediaGoblin պատկերի հետ: Բայց Cloud Run-ի գալուստով ես դա հիշեցի Heroku առաջարկում է նմանատիպ ծառայություն անվճար, և նրանց գործիքները շատ ավելի հարմար են, քան Google-ը:

Անվճար հավելվածի սերվերի դեպքում միակ ծախսը տվյալների պահպանումն է: Google-ի ստանդարտ տարածքային պահեստն արժե 2,3 ցենտ/ԳԲ: Տեսաարխիվը 33 ԳԲ է, ուստի ամսական վճարում եմ ընդամենը 77 ցենտ։

45 տեսաերիզների թվայնացման իմ ութամյա ձգտումը: Մաս 2
Այս լուծումը ամսական արժե ընդամենը 0,77 դոլար

Խորհուրդներ նրանց համար, ովքեր պատրաստվում են փորձել

Ակնհայտ է, որ գործընթացն ինձ երկար խլեց։ Բայց հուսով եմ, որ այս հոդվածը կօգնի ձեզ խնայել ձեր տնային տեսանյութերի թվայնացման և հրապարակման ջանքերի 80-90%-ը: Առանձին բաժնում կարող եք գտնել մանրամասն քայլ առ քայլ ուղեցույց ողջ գործընթացում, բայց ահա մի քանի ընդհանուր խորհուրդ.

  • Պահպանեք որքան հնարավոր է շատ մետատվյալներ թվայնացման և խմբագրման փուլում:
    • Արժեքավոր տեղեկություններ հաճախ գրանցվում են տեսաերիզների պիտակների վրա:
    • Ձայնագրեք, թե որ տեսահոլովակը որ ձայներիզից և ինչ հերթականությամբ է վերցված։
    • Գրեք նկարահանման ամսաթիվը, որը կարող է նշված լինել տեսանյութում։
  • Մտածեք վճարել պրոֆեսիոնալ թվայնացման ծառայությունների համար:
    • Դու պետք է գերազանց թվայնացման որակի առումով դրանց համապատասխանելը դժվար և թանկ է:
    • Բայց հեռու մնացեք EverPresent կոչվող ընկերությունից (տեղեկացրեք ինձ, եթե ձեզ ավելի շատ մանրամասներ են անհրաժեշտ):
  • Եթե ​​դուք ինքներդ եք կատարում թվայնացումը, գնեք HDD:
    • Չսեղմված ստանդարտ հստակությամբ տեսանյութը րոպեում 100-200 ՄԲ է պահանջում:
    • Ես ամեն ինչ պահեցի իմ վրա Սինոլոգիա DS412 + (10 ՏԲ):
  • Գրեք մետատվյալներ ինչ-որ սովորական ձևաչափով, որը կապված չէ կոնկրետ հավելվածի հետ:
    • Հոլովակների նկարագրություններ, ժամային ծածկագրեր, ամսաթվեր և այլն:
    • Եթե ​​դուք պահպանում եք մետատվյալները հավելվածին հատուկ ձևաչափով (կամ ավելի վատ՝ ընդհանրապես մի պահեք), դուք չեք կարողանա նորից կատարել աշխատանքը, եթե որոշեք օգտագործել այլ լուծում:
    • Խմբագրելիս տեսանյութում տեսնում եք շատ օգտակար մետատվյալներ։ Դուք կկորցնեք նրանց, եթե չփրկեք նրանց:
      • Ի՞նչ է կատարվում տեսանյութում.
      • Ո՞վ է այնտեղ գրանցված:
      • Ե՞րբ է այն ձայնագրվել:
  • Նշեք ձեր սիրելի տեսանյութերը։
    • Անկեղծ ասած, տնային վիդեո բովանդակության մեծ մասը բավականին ձանձրալի է:
    • Ես կիրառում եմ «լավագույնը» պիտակը իմ սիրելի հոլովակների վրա և բացում եմ դրանք, երբ ուզում եմ զվարճալի տեսանյութեր դիտել:
  • Կազմակերպեք համապարփակ լուծում որքան հնարավոր է շուտ, որպեսզի գործընթացն անմիջապես գնա սկզբից մինչև վերջ:
    • Փորձեցի սկզբում թվայնացնել բոլոր ձայներիզները, հետո խմբագրել բոլոր ձայներիզները և այլն։
    • Ափսոս, որ ես չսկսեցի մեկ ձայներիզից և ամբողջ աշխատանքը դրանով չեմ արել: Այդ ժամանակ ես կհասկանայի, թե ինչ որոշումներ և ինչ փուլերում են ազդում վերջնական արդյունքի վրա։
  • Նվազագույնի հասցնել վերակոդավորումը:
    • Ամեն անգամ, երբ դուք խմբագրում եք կամ վերակոդավորում եք հոլովակը, դուք վատացնում եք դրա որակը:
    • Թվայնացրե՛ք չմշակված կադրերը առավելագույն որակով, այնուհետև յուրաքանչյուր հոլովակ վերծանեք ուղիղ մեկ անգամ այն ​​ձևաչափով, որը բրաուզերները սկզբում նվագարկում են:
  • Տեսահոլովակներ տեղադրելու համար օգտագործեք հնարավոր ամենապարզ լուծումը:
    • Հետագայում, MediaGoblin-ը կարծես չափազանց բարդ գործիք է վեբ էջեր ստեղծելու բավականին պարզ սցենարի համար՝ ստատիկ վիդեո ֆայլերի հավաքածուով:
    • Եթե ​​ես նորից սկսեի, ես կօգտագործեի ստատիկ կայքի գեներատոր, ինչպիսին է Ուգո, Ջեկիլլ կամ Մռայլ.
  • Կատարեք մոնտաժ.
    • Տեսանյութերի խմբագրումը զվարճալի միջոց է մի քանի տեսանյութերից լավագույն պահերը համատեղելու համար:
    • Մոնտաժում գլխավորը երաժշտությունն է։ Օրինակ, թեման զարմանալի է Դանդաղ ձյուն The National-ից, սա իմ անձնական բացահայտումն է։

Source: www.habr.com