Transliuokite savo vaizdo įrašus „YouTube“ XNUMX valandas per parą, XNUMX dienas per savaitę

Pastaruoju metu kaip pomėgis filmuoju pažįstamo psichologo paskaitas. Redaguoju filmuotą medžiagą ir paskelbiu ją savo svetainėje. Prieš mėnesį man kilo mintis surengti šių paskaitų transliaciją 24/7 per YouTube. Savotiškas teminis „TV kanalas“, skirtas asmeniniam augimui.

Žinau, kaip daryti įprastą transliaciją. Bet kaip padaryti, kad tai būtų vaizdo failų transliacija? Kad veiktų 24/7, būtų lankstus, kuo autonomiškesnis ir tuo pačiu niekaip nepriklausytų nuo mano namų kompiuterio. Tai aš turėjau išsiaiškinti.

Transliuokite savo vaizdo įrašus „YouTube“ XNUMX valandas per parą, XNUMX dienas per savaitę

Sprendimui rasti prireikė kelių dienų. Išstudijavau daugybę forumų ir įvairių žinynų, be kurių mano transliacija tiesiog nebūtų veikusi. Ir dabar, kai pokštas pavyko, jaučiu poreikį pasidalinti savo sprendimu. Taip pasirodė šis straipsnis.

Trumpai tariant, galutinis sprendimas buvo toks: VPS + ffmeg + bash scenarijus. Po pjūviu aprašau nueitus žingsnius ir kalbu apie spąstus, kurie buvo atrasti organizuojant transliaciją.

1 žingsnis – iš kur bus transliacija?

Pačioje pradžioje reikėjo apsispręsti, iš kur bus transliacija ir kur jos šaltinis. Pats pirmas dalykas, kuris atėjo į galvą, buvo iš savo namų kompiuterio. Surinkite vaizdo įrašus į grojaraštį ir pradėkite leisti juos bet kuriame vaizdo įrašų grotuve. Tada užfiksuokite ekrano vaizdą ir transliuokite jį į „YouTube“. Bet beveik iš karto atmečiau šį variantą, nes... Norint jį įgyvendinti, reikia nuolat įjungtą namų kompiuterį, o tai reiškia aušintuvų sklindantį triukšmą net naktį bei padidėjusias elektros sąnaudas (+100-150 kWh kas mėnesį). Ir pasirodo, kad transliacijos metu negalėsite naudotis namų kompiuteriu. bet koks pelės judesys bus matomas transliacijoje.

Tada pradėjau žiūrėti į šoną debesų paslaugos. Ieškojau paruoštos paslaugos, kur galėčiau įkelti savo vaizdo įrašus arba, pavyzdžiui, įterpti nuorodas į vaizdo įrašus iš YouTube ir visa tai būtų supakuota į vieną nenutrūkstamą transliaciją. Bet nieko tinkamo neradau. Gal nelabai gerai ieškojau. Vienintelis dalykas, kuris tinka funkcionalumui, yra restream.io, paslauga, padedanti vienu metu transliuoti į kelias platformas. Atrodo, kad jie leidžia jums įkelti savo vaizdo įrašus. Tačiau ši paslauga buvo sukurta visai kitiems tikslams ir jie tikisi, kad transliacija truks vos porą valandų. Manau, kad jei per šią paslaugą būtų galima organizuoti transliaciją visą parą, tai per mėnesį ji šautų į dešimtis ar net šimtus dolerių. Bet vis tiek norėjau transliaciją surengti arba nemokamai, arba su minimaliomis finansinėmis investicijomis.

Tapo aišku, kad transliacijai reikia arba atskiras įrenginys ar net atskirą kompiuterį. Aš galvojau apie kažką panašaus į Raspberri Pi. Ir ką? Jis neturi aušintuvo. Įrašiau vaizdo įrašą į „flash“ diską, įjungiau eterneto kabelį ir palikau gulėti kur nors nuošalioje vietoje ir transliavau. Parinktis. Bet neturėjau nei pačios lentos, nei darbo su ja patirties, todėl ir šio varianto atsisakiau.

Dėl to aš susidūriau su tam tikra diskusija, kurioje jie aptarė kūrybą nuosavas serveris transliacijos. Tai nebuvo būtent tai, ko ieškojau, bet aš supratau pagrindinę mintį - galite naudoti serverį! Toje diskusijoje buvo pasiūlyta naudoti VPS + nginx + OBS derinį. Tapo aišku, kad šis derinys gali tikti ir man. Vienintelis dalykas, kuris mane supainiojo, buvo tai, kad niekada neadministravau serverio ir man atrodė, kad turėti savo dedikuotą serverį buvo painu ir brangu. Nusprendžiau pasidomėti kiek kainuotų serverio nuoma su minimalia konfigūracija ir likau maloniai nustebintas.

Transliuokite savo vaizdo įrašus „YouTube“ XNUMX valandas per parą, XNUMX dienas per savaitę

Kainos nurodytos Baltarusijos rubliais ir tai tik trupiniai. Kad suprastume, 8 Baltarusijos rubliai yra apie 3.5 dolerio arba 240 Rusijos rublių. Mėnesiui naudotis visaverčiu kompiuteriu, įjungtu 24/7 ir turinčiu greitą interneto prieigą. Kažkodėl šis atradimas mane labai nudžiugino ir kelias dienas vaikščiojau siaubingai laimingas, kaip vaikas atradęs kosmines raketas :)

Beje, pasinaudojau pirmosios svetainės pasiūlymu, kurį „Google“ man davė užklausai „VPS nuoma“. Galbūt yra ir daugiau biudžetinių sprendimų, bet tokia kaina man tiko ir toliau neieškojau.

Kurdami serverį galite pasirinkti operacinę sistemą, kurioje jis veiks. Galite organizuoti transliaciją bet kurioje iš išvardytų sistemų ir pasirinkti pagal savo pageidavimus ir finansines galimybes (už serverį su „Windows“ jie prašo už papildomą mokestį). Aš pasirinkau CentOS. Tiesiog todėl, kad anksčiau turėjau mažai patirties.

Transliuokite savo vaizdo įrašus „YouTube“ XNUMX valandas per parą, XNUMX dienas per savaitę

2 žingsnis – serverio sąranka

Pirmas dalykas, kurio reikia sukūrus serverį, yra prisijungti prie jo per SSH. Iš pradžių naudojau „PuTTy“, bet vėliau pradėjau naudoti „Secure Shell“ programą, kuri veikia „Google Chrome“. Man taip pasirodė patogiau.

Tada pakeičiau pagrindinio kompiuterio pavadinimą, nustatiau laiko sinchronizavimą serveryje, atnaujinau sistemą, padirbėjau su iptables... ir dar daug kitų dalykų, bet ne todėl, kad tai buvo būtina. Mane tiesiog domino serverio nustatymas ir jis man padėjo. Man patinka kai pavyksta :)

Toliau nurodyti veiksmai, kuriuos turite atlikti:

  1. Prijunkite EPEL saugyklą.
  2. Nustatykite FTP serverį (aš pasirinkau vsftp).
  3. Įdiekite ffmpeg.

Detaliau komandų neduosiu, šios instrukcijos yra gana konceptualios, kad būtų galima perteikti bendrą veiksmų planą. Jei kyla kokių nors sunkumų atliekant bet kurį iš veiksmų, juos galima greitai išspręsti naudojant paieškos variklio užklausą, pvz., „CentOS connect EPEL“ arba „CentOS įdiegti FTP serverį“. Ir pirmosiose nuorodose galite rasti išsamias nuoseklias instrukcijas.

Taigi, kaip rašiau anksčiau, man reikėjo VPS + nginx + OBS derinio. VPS – paruošta. Tačiau pradėjo kilti klausimų dėl kitų dalykų. OBS yra transliavimo programa, Open Broadcaster Software. Ir veikia tik su srautais t.y. pavyzdžiui, jis paima vaizdą iš internetinės kameros ir jį transliuoja. Arba ekrano įrašymas. Arba jau vykstanti transliacija nukreipiama į kitą svetainę. Bet aš neturiu srauto, turiu tik vaizdo failų rinkinį, kurį reikia paversti srautu.

Pradėjau kasti šia kryptimi ir aptikau ffmpeg. FFmpeg yra nemokamų atvirojo kodo bibliotekų rinkinys, leidžiantis įrašyti, konvertuoti ir srautiniu būdu transliuoti skaitmeninį garso ir vaizdo įrašą įvairiais formatais.

Ir aš buvau labai nustebęs, kiek daug ffmpeg gali padaryti. Jei norite, jis išskirs garsą iš vaizdo įrašo. Jei norite, jis iškirps vaizdo įrašo fragmentą be perkodavimo. Jei norite, jis bus konvertuojamas iš vieno formato į kitą. Ir daug, daug daugiau. Kad galėtumėte nurodyti failą, jis konvertuos jį į srautą ir perduos į „YouTube“. Štai ir viskas, grandinė surinkta. Belieka tik užbaigti niuansus.

3 žingsnis – transliacijos sąranka

Kuriame transliaciją „YouTube“. Šiame etape mums reikia tik nuorodos ir transliacijos rakto. Žemiau esančioje ekrano kopijoje jie paryškinti raudonai.

Transliuokite savo vaizdo įrašus „YouTube“ XNUMX valandas per parą, XNUMX dienas per savaitę

Toliau įkelti vaizdo failus į serverį, kurį planuojame transliuoti. Tiesą sakant, FTP reikia tik šiam etapui. Jei turite kitą patogų būdą įkelti failus į serverį, jums nereikia nustatyti FTP serverio.

Mes perduodame srautą į YouTube. Norėdami pradėti transliuoti, turite paleisti ffmpeg su keliais atributais. Štai kaip atrodo trumpiausia mano gauta komanda:

ffmpeg -re -i lecture1.mp4 -f flv rtmp://a.rtmp.youtube.com/live2/%КЛЮЧ_ТРАНСЛЯЦИИ%

Atributų dekodavimas-re – rodo, kad failas turi būti konvertuotas į srautą.

-i – nurodo, kuris failas turi būti paleistas. Svarbu, kad komanda būtų paleista iš to paties katalogo, kuriame yra pats vaizdo failas. Kitu atveju turėtumėte nurodyti absoliučią nuorodą į failą, pvz /usr/media/lecture1.mp4.

-f – nustato išvesties failo formatą. Mano atveju paaiškėja, kad ffmpeg konvertuoja mano failą iš mp4 į flv.

O pabaigoje transliacijos nustatymų puslapyje nurodome duomenis, kuriuos paėmėme iš YouTube, t.y. adresas, kuriuo reikia perduoti duomenis, ir transliacijos raktas, kad transliacija būtų rodoma būtent jūsų kanale.

Jei viską padarėte teisingai, paleidę šią komandą „YouTube“ matys perduotą srautą. Norėdami pradėti transliaciją, tiesiog spustelėkite mygtuką „Pradėti transliaciją“ pačioje „YouTube“.

4 žingsnis - pridėkite autonomiją

Sveikiname! Dabar žinote, kaip pradėti transliuoti iš vaizdo failo. Tačiau to nepakanka transliacijai visą parą. Svarbu, kad pasibaigus pirmam vaizdo įrašui, iškart prasidėtų kitas, o kai bus parodyti visi vaizdo įrašai, atkūrimas prasidėtų iš naujo.

Sugalvojau tokį variantą: sukurti .sh failą, kuriame parašiau komandą kiekvienam vaizdo failui ir pačioje pabaigoje nurodžiau komandą paleisti tą patį scenarijų dar kartą. Rezultatas yra tokia rekursija:

Команда 1... (запуск трансляции файла lecture1.mp4)
Команда 2... (запуск трансляции файла lecture2.mp4)
Команда 3... (запуск трансляции файла lecture3.mp4)
bash start.sh

Ir taip, pavyko. Patenkinta savimi paleidau bandomąją transliaciją ir nuėjau miegoti.

Ryte manęs laukė nemaloni staigmena. Paaiškėjo, kad transliacija truko vos porą minučių ir pasibaigė beveik iš karto, kai išjungiau kompiuterį. Tyrimas parodė, kad tokiu būdu paleistos komandos vykdomos vartotojui prisijungus prie serverio. Kai tik atsijungiau, mano vykdomos komandos buvo nutrauktos. Kad taip nenutiktų, užtenka prieš komandą bash pridėkite komandą nohup. Tai leis paleisti procesą nepriklausomai nuo jūsų buvimo.

Galutinė minimali scenarijaus versija atrodo taip:

ffmpeg -re -i lecture1.mp4 -f flv rtmp://a.rtmp.youtube.com/live2/%КЛЮЧ_ТРАНСЛЯЦИИ%
ffmpeg -re -i lecture2.mp4 -f flv rtmp://a.rtmp.youtube.com/live2/%КЛЮЧ_ТРАНСЛЯЦИИ%
ffmpeg -re -i lecture3.mp4 -f flv rtmp://a.rtmp.youtube.com/live2/%КЛЮЧ_ТРАНСЛЯЦИИ%
nohup bash start.sh $

Kur start.sh yra failas, kuriame parašytas šis scenarijus. Ir šis failas turi būti tame pačiame kataloge kaip ir vaizdo failai.

Pabaigoje pridėjus dolerio ženklą, procesas vyks fone, kad galėtumėte toliau naudotis konsole nenutraukdami transliacijos.

Į premijas buvo įtrauktos šios gėrybės:

  • Galite rankiniu būdu perjungti failų atkūrimą. Norėdami tai padaryti, turite „nužudyti“ šiuo metu veikiantį ffmpeg procesą. Po to automatiškai prasidės kito sąrašo failo atkūrimas.
  • Nauji vaizdo įrašai gali būti įtraukti į transliaciją nestabdant transliacijos. Tiesiog įkelkite vaizdo įrašą į serverį, pridėkite komandą paleisti šį failą scenarijuje ir išsaugokite. Tai viskas. Kitame atkūrimo etape naujas failas bus transliuojamas kartu su senais failais.

5 veiksmas – tinkinkite ffmpeg

Iš principo galėjome ir sustoti. Tačiau norėjau, kad transliacija būtų kiek draugiškesnė žiūrovams.

Tarkime, žmogus nuėjo į transliaciją, pradėjo žiūrėti, patiko ir norėjo žiūrėti šią paskaitą nuo pat pradžių, bet transliacija neleidžia atsukti. Norėdamas žiūrėti paskaitą nuo pat pradžių, žmogus turės eiti į mano svetainę ir gauti dominančios paskaitos įrašą. Kaip galite pasakyti, kuri paskaita jį domina? Svetainėje jau yra 16 paskaitų ir kas savaitę jų tik daugėja. Manau, kad net ir aš, kuris filmavau ir montuojau visas šias paskaitas, iš atsitiktinio fragmento negalėsiu nustatyti, kuri tai paskaita. Todėl būtina, kad kiekviena paskaita būtų kažkaip paskirta.

Galimybė redagavimo programoje pridėti antraštes prie šaltinio vaizdo failų man netiko. Reikėjo užtikrinti, kad būtų naudojami originalūs failai. Kad laidos palaikymas pareikalautų iš manęs kuo mažiau kūno judesių.

Paaiškėjo, kad ffmpeg gali man padėti ir šiuo klausimu. Jis turi ypatingą atributą -vf, kuri leidžia tekstą dėti virš vaizdo įrašo. Norėdami pridėti tekstą prie vaizdo įrašo, prie komandos turite pridėti šį fragmentą:

-vf drawtext="fontfile=OpenSans.ttf:text='Лекция 13: Психология эмоций. Как создавать радость?':fontsize=26:fontcolor=white:borderw=1:bordercolor=black:x=40:y=670"

Parametrų paaiškinimasfontfile= – nuoroda į šrifto failą. Be to antraštė nebus pridėta prie vaizdo įrašo. Lengviausias būdas yra įdėti šrifto failą į tą patį aplanką kaip ir vaizdo įrašas. Arba turėsite nurodyti visą failo kelią.

text= – iš tikrųjų pats tekstas, kurį reikia įdėti vaizdo įrašo viršuje.

fontsize= – šrifto dydis pikseliais.

fontcolor= - šrifto spalva.

borderw= – kontūro aplink tekstą storis pikseliais (turiu baltą tekstą su juodu 1 pikselio storio kontūru).

bordercolor= - kontūro spalva.

x= и y= – teksto koordinates. Taškas 0;0 yra viršutiniame kairiajame kampe. Mano koordinatės parinktos taip, kad tekstas būtų patalpintas apatiniame kairiajame kampe su 1280x720 pikselių vaizdo raiška.

Tai atrodo taip:

Transliuokite savo vaizdo įrašus „YouTube“ XNUMX valandas per parą, XNUMX dienas per savaitę

6 veiksmas – nustatykite transliacijos kokybę

Viskas, transliacija paruošta. FFmpeg transliacijos, failai atkuriami, mano dalyvavimas transliacijai nereikalingas. Netgi kiekviena paskaita yra pasirašyta. Atrodo, kad viskas.

Tačiau išryškėjo dar vienas niuansas – pasirinkau minimalią serverio konfigūraciją ir ji nepatraukė transliacijos. Serverio konfigūracija: 1 branduolys (pvz., 2.2 GHz), 1 gigabaitas RAM, 25 GB SSD. RAM pakako, bet procesorius buvo beveik pilnai apkrautas 100% (o kartais net 102-103%) :) Dėl to transliacija sustingdavo kas kelias sekundes. Negražu.

Galite tiesiog pasiimti brangesnę konfigūraciją su dviem branduoliais, laimei, naudojant debesų technologijas, serverio konfigūracijos pakeitimas vyksta paspaudus porą mygtukų. Bet aš norėjau tilpti į minimalų konfigūracijos pajėgumą. Pradėjau studijuoti ffmpeg dokumentaciją ir taip, ten taip pat yra nustatymai, leidžiantys reguliuoti sistemos apkrovą.

Aukštą vaizdo kokybę galima pasiekti dviem būdais: arba dideliu procesoriaus apkrovimu, arba dideliu išeinančiu srautu. Pasirodo, kuo daugiau apkrovos gali atlaikyti procesorius, tuo mažiau reikės kanalo pralaidumo. Arba negalite per daug įkelti procesoriaus, bet tada jums reikės plataus kanalo su dideliu srauto srautu. Jei yra apribojimų ir procesoriui, ir išeinančio kanalo/srauto dydžiui, tuomet teks sumažinti vaizdo kokybę, kad transliacija vyktų sklandžiai.

Mano serveris turi prieigą prie 10 Mbit/s pločio kanalo. Šis plotis yra tinkamas. Tačiau yra srauto limitas – 1 TB per mėnesį. Todėl, norint laikytis eismo apribojimų, mano išeinantis srautas neturėtų viršyti ~300 KB per sekundę t.y. Išeinančio srauto bitų sparta turi būti ne didesnė kaip 2,5 Mbit/s. „YouTube“, beje, rekomenduoja transliuoti tokiu bitų greičiu.

Norėdami reguliuoti sistemos apkrovą, ffmpeg naudoja skirtingus metodus. Gerai parašyta apie tai čia. Galiausiai panaudojau du atributus: -crf и -preset.

Pastovios normos koeficientas (CRF) – tai koeficientas, kurio dėka galite reguliuoti vaizdo kokybę. CRF gali turėti reikšmes nuo 0 iki 51, kur 0 yra šaltinio failo kokybė, 51 yra blogiausia įmanoma kokybė. Rekomenduojama naudoti reikšmes nuo 17 iki 28, numatytoji vertė yra 23. Su koeficientu 17 vaizdo įrašas bus vizualiai identiškas originalui, tačiau techniškai jis nebus toks pat. Dokumentacijoje taip pat nurodyta, kad galutinio vaizdo įrašo dydis, priklausomai nuo nurodyto CRF, kinta eksponentiškai, t.y. padidinus koeficientą 6 taškais, išeinančio vaizdo įrašo sparta padvigubės.

Jei naudojate CRF, galite pasirinkti išeinančios nuotraukos „svorį“, tada naudodami išankstiniai nustatymai (-iš anksto) galite nustatyti, kiek bus apkrautas procesorius. Šis atributas turi šiuos parametrus:

  • ultrafast
  • superfast
  • veryfast
  • faster
  • fast
  • medium - Numatytoji reikšmė
  • slow
  • slower
  • veryslow

Kuo „greičiau“ nurodomas parametras, tuo didesnė bus procesoriaus apkrova.

Pirmiausia pasirinkau išankstinį nustatymą, kuris iš esmės buvo per sunkus mano procesoriui, o tada tiksliau pasirinkau apkrovą naudodamas CRF. Mano atveju išankstinis nustatymas veikė fast, o crf apsistojau ties 24 verte.

išvada

Tai viskas. Paskutinė transliacijos pradžios komanda buvo tokia:

ffmpeg -re -i lecture1.mp4 -vf drawtext="fontfile=OpenSans.ttf:text='Лекция 1: Жонглирование картинами мира':fontsize=26:fontcolor=white:borderw=1:bordercolor=black:x=40:y=670" -c:v libx264 -preset fast -crf 24 -g 3 -f flv rtmp://a.rtmp.youtube.com/live2/%КЛЮЧ_ТРАНСЛЯЦИИ%

Čia liko tik du neaprašyti punktai:

1) -c:v libx264 – nurodant konkretų kodeką darbui su šaltinio failu.
2) -g 3 – aiškiai nurodyta raktų kadrų skaičius. Šiuo atveju nurodyta, kad kas trečias kadras turi būti rakto kadras. Standartinė vertė yra 5 arba 8, tačiau „YouTube“ prisiekia ir prašo bent 3.

Galite pamatyti, kokios kokybės transliacija pasirodė čia.

Serverio apkrova buvo tokia:

Transliuokite savo vaizdo įrašus „YouTube“ XNUMX valandas per parą, XNUMX dienas per savaitę

Transliuokite savo vaizdo įrašus „YouTube“ XNUMX valandas per parą, XNUMX dienas per savaitę

Remiantis stebėjimo duomenimis, aišku, kad procesoriaus apkrova svyruoja nuo 70% iki 95%, o per savaitę transliacija niekada nepasiekė 100%. Tai reiškia, kad su šiais nustatymais pakanka procesoriaus.

Įkeldamas diską galiu pasakyti, kad jis beveik neapkrautas ir transliacijai turėtų pakakti įprasto HDD.

Tačiau man kelia nerimą išeinančio srauto kiekis. Pasirodo, mano išeinantis srautas svyruoja nuo 450 iki 650 KB per sekundę. Per mėnesį tai bus apie 1,8 terabaito. Gali tekti nusipirkti papildomo srauto arba perjungti konfigūraciją su dviem branduoliais, nes... Nenorėčiau pabloginti nuotraukos kokybės.

***

Dėl to pasakysiu, kad tokios transliacijos nustatymas nuo nulio užtrunka apie 1-2 valandas. Be to, vaizdo įrašo įkėlimas į serverį užtruks didžiąją laiko dalį.

Tokios transliacijos pradžia nepasiteisino kaip rinkodaros priemonė. Galbūt, jei padidintume peržiūrų skaičių taip, kad „YouTube“ algoritmai paimtų šią transliaciją ir pradėtų ją aktyviai rodyti rekomendacijose, kažkas pasisektų. Mano atveju per 16 nepertraukiamo transliavimo dienų buvo peržiūrėta 58 kartus.

Tai yra gerai. Transliacija harmoningai dera pagrindiniame mano svetainės puslapyje. Tai suteikė galimybę greitai susidaryti savo nuomonę apie dėstytoją ir pačias paskaitas.

Ir vieną akimirką. Svarbu, kad transliacija nepažeistų kieno nors autorių teisių, kitaip ji bus užblokuota. Esu ramus dėl savo transliacijos, nes... Muzikinius intarpus pasirinkau specialiai su nemokamu naudojimu, o turinio autorė sėdi prie šalia esančio kompiuterio ir visiškai neprieštarauja, kad aš naudojuosi jos turiniu :)

Bet jei kur nors transliacijos metu fone groja radijas arba redaguodami naudojote mėgstamą takelį arba paėmėte vaizdo įrašų seką iš populiaraus muzikinio vaizdo įrašo, TV serialo ar filmo, jūsų transliacijai kyla pavojus. Taip pat svarbu, kad transliacija atliktų bent minimalią semantinę apkrovą, kitaip ji gali būti užblokuota kaip nepageidaujamas el.

***

Tai viskas, ką turiu. Tikiuosi, kad šis vadovas kam nors pasitarnaus. Na, o jei turite ką papildyti, rašykite, mielai perskaitysiu straipsnio papildymus ir patikslinimus.

Šaltinis: www.habr.com

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