Zend uw video's XNUMX/XNUMX uit op YouTube

De laatste tijd film ik als hobby lezingen van een psycholoog die ik ken. Ik bewerk de beelden en publiceer deze op mijn website. Een maand geleden kreeg ik het idee om een ​​24/7 uitzending van deze lezingen op YouTube te organiseren. Een soort thematische ‘tv-zender’ gewijd aan persoonlijke groei.

Ik weet hoe ik een reguliere uitzending moet maken. Maar hoe zorg je ervoor dat het een uitzending van videobestanden is? Zodat het 24/7 draait, flexibel is, zo autonoom mogelijk is en tegelijkertijd op geen enkele manier afhankelijk is van mijn thuiscomputer. Dit is wat ik moest ontdekken.

Zend uw video's XNUMX/XNUMX uit op YouTube

Het duurde enkele dagen voordat er een oplossing werd gevonden. Ik heb veel forums en verschillende handleidingen bestudeerd, zonder welke mijn uitzending simpelweg niet zou hebben gewerkt. En nu de grap een succes is, voel ik de behoefte om mijn oplossing te delen. Zo verscheen dit artikel.

Kort gezegd was de uiteindelijke oplossing als volgt: VPS + ffmeg + bash-script. Onder de cut beschrijf ik de genomen stappen en vertel ik over de valkuilen die ontdekt zijn bij het organiseren van de uitzending.

Stap 1 – waar komt de uitzending vandaan?

Helemaal aan het begin was het nodig om te beslissen waar de uitzending vandaan zou komen en waar de bron zou zijn. Het allereerste wat in me opkwam was vanaf uw thuiscomputer. Verzamel video's in een afspeellijst en speel ze af in elke videospeler. Leg vervolgens het schermbeeld vast en zend het uit naar YouTube. Maar ik heb deze optie vrijwel onmiddellijk afgewezen omdat... Om dit te implementeren, moet u uw thuiscomputer constant aan laten staan, wat leidt tot lawaai van koelers, zelfs 's nachts, en een hoger elektriciteitsverbruik (+100-150 kWh per maand). En het blijkt dat u tijdens de uitzending uw thuiscomputer niet kunt gebruiken. elke beweging van de muis is zichtbaar in de uitzending.

Toen begon ik opzij te kijken cloud diensten. Ik was op zoek naar een kant-en-klare dienst waarbij ik mijn video’s kon uploaden of bijvoorbeeld links naar video’s van YouTube kon invoegen en dat alles verpakt in één non-stop uitzending. Maar ik heb niets passends gevonden. Misschien heb ik niet goed gezocht. Het enige dat bij de functionaliteit past, is restream.io, een dienst die helpt gelijktijdig uit te zenden naar verschillende platforms. Het lijkt erop dat je hiermee je eigen video's kunt uploaden. Maar deze dienst is voor heel andere doeleinden gemaakt en ze verwachten dat de uitzending maar een paar uur zal duren. Ik denk dat als het via deze dienst mogelijk zou zijn om XNUMX uur per dag een uitzending te organiseren, dit tientallen of zelfs honderden dollars per maand zou kunnen opleveren. Maar toch wilde ik de uitzending gratis of met een minimale financiële investering organiseren.

Het werd duidelijk dat het voor de uitzending noodzakelijk was of apart apparaat of zelfs een aparte computer. Ik dacht aan iets als Raspberri Pi. En wat? Hij heeft geen koeler. Ik heb de video op een flashstation opgenomen, de Ethernet-kabel aangesloten en ergens op een afgelegen plek laten liggen en uitgezonden. Keuze. Maar ik had noch het bord zelf, noch ervaring met het werken ermee, dus ik weigerde ook deze optie.

Hierdoor kwam ik een bepaalde discussie tegen waarin ze de creatie bespraken eigen server uitzendingen. Het was niet precies wat ik zocht, maar ik kreeg het hoofdidee: je kunt een server gebruiken! In die discussie werd voorgesteld om een ​​combinatie van VPS + nginx + OBS te gebruiken. Het werd duidelijk dat deze combinatie ook bij mij zou kunnen passen. Het enige dat mij in verwarring bracht, was dat ik nog nooit een server had beheerd en het leek mij dat het hebben van een eigen dedicated server verwarrend en duur was. Ik besloot uit te zoeken hoeveel het zou kosten om een ​​server met een minimale configuratie te huren en was aangenaam verrast.

Zend uw video's XNUMX/XNUMX uit op YouTube

Prijzen worden aangegeven in Wit-Russische roebels en dit zijn slechts kruimels. Om te begrijpen: 8 Wit-Russische roebel is ongeveer 3.5 dollar of 240 Russische roebel. Een maand lang gebruik maken van een volwaardige computer die 24/7 aanstaat en snelle internettoegang heeft. Om de een of andere reden werd deze ontdekking erg vreugdevol voor mij en een aantal dagen liep ik vreselijk blij rond, als een kind dat ruimteraketten ontdekte :)

Overigens heb ik gebruik gemaakt van het aanbod van de eerste site die Google mij gaf voor de vraag “VPS verhuur”. Misschien zijn er nog meer budgetoplossingen, maar deze prijs beviel mij en ik heb niet verder gezocht.

Bij het aanmaken van een server kunt u het besturingssysteem selecteren waaronder deze zal draaien. Je kunt een uitzending organiseren op elk van de genoemde systemen en een keuze maken op basis van je voorkeuren en financiële mogelijkheden (voor een server met Windows vragen ze een extra vergoeding). Ik heb voor CentOS gekozen. Simpelweg omdat ik er voorheen weinig ervaring mee had.

Zend uw video's XNUMX/XNUMX uit op YouTube

Stap 2 – serverconfiguratie

Het eerste dat u nodig heeft nadat u een server heeft gemaakt, is verbinding maken via SSH. In eerste instantie gebruikte ik PuTTy, maar daarna begon ik de Secure Shell-app te gebruiken, die in Google Chrome draait. Het bleek handiger voor mij.

Vervolgens veranderde ik de hostnaam, stelde tijdsynchronisatie in op de server, updatete het systeem, sleutelde aan iptables... en deed nog een heleboel andere dingen, maar niet omdat het nodig was. Ik was gewoon geïnteresseerd in het opzetten van de server en het werkte voor mij. Ik hou ervan als het lukt :)

Hier zijn de stappen die u moet nemen:

  1. Sluit de EPEL-repository aan.
  2. Zet een FTP-server op (ik heb vsftp gekozen).
  3. ffmpeg installeren.

Ik zal de commando’s niet in detail geven; deze instructies zijn nogal conceptueel om het algemene actieplan over te brengen. Als u problemen ondervindt bij een van de stappen, kunt u deze snel oplossen met behulp van een zoekmachinequery zoals “CentOS connect EPEL” of “CentOS install FTP server”. En op de eerste links vindt u gedetailleerde stapsgewijze instructies.

Dus, zoals ik eerder schreef, had ik een combinatie van VPS + nginx + OBS nodig. VPS – klaar. Maar op andere punten begonnen er vragen te rijzen. OBS is een uitzendprogramma, Open Broadcaster Software. En het werkt alleen met streams, d.w.z. Het neemt bijvoorbeeld een beeld van een webcam en zendt dit uit. Of schermopname. Of een reeds lopende uitzending wordt doorgestuurd naar een andere site. Maar ik heb geen stream, ik heb alleen een set videobestanden waarvan een stream moet worden gemaakt.

Ik begon in deze richting te graven en kwam ffmpeg tegen. FFmpeg is een reeks gratis en open source-bibliotheken waarmee u digitale audio en video in verschillende formaten kunt opnemen, converteren en streamen.

En ik was zeer verrast hoeveel ffmpeg kan doen. Als je wilt, haalt het het geluid uit de video. Als je wilt, wordt een fragment van de video uitgesneden zonder opnieuw te coderen. Als je wilt, wordt het van het ene formaat naar het andere geconverteerd. En veel veel meer. Tot het punt dat je er een bestand aan kunt specificeren, zal het het in een stream converteren en naar YouTube zelf verzenden. Dat is alles, de ketting is gemonteerd. Het enige dat overblijft is het finaliseren van de nuances.

Stap 3 – uitzending instellen

Wij maken een uitzending op YouTube. In dit stadium hebben we alleen de link en de uitzendsleutel nodig. In de onderstaande schermafbeelding zijn ze rood gemarkeerd.

Zend uw video's XNUMX/XNUMX uit op YouTube

Volgende upload videobestanden naar de server, die we van plan zijn uit te zenden. Eigenlijk is FTP alleen nodig voor deze fase. Als u een andere handige manier heeft om bestanden naar de server te uploaden, hoeft u geen FTP-server in te stellen.

Wij verzenden de stream naar YouTube. Om te beginnen met uitzenden, moet je ffmpeg uitvoeren met verschillende attributen. Zo ziet het kortste commando dat ik kreeg eruit:

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

Attributen decoderen-re – geeft aan dat het bestand moet worden geconverteerd naar een stream.

-i – geeft aan welk bestand moet worden afgespeeld. Het is belangrijk dat de opdracht wordt gestart vanuit dezelfde map waar het videobestand zelf zich bevindt. Anders moet u een absolute link naar het bestand opgeven, bijvoorbeeld /usr/media/lecture1.mp4.

-f – stelt het uitvoerbestandsformaat in. In mijn geval blijkt dat ffmpeg mijn bestand direct van mp4 naar flv converteert.

En aan het einde geven we de gegevens aan die we van YouTube hebben gehaald op de pagina met uitzendinstellingen, d.w.z. het adres waarnaar u gegevens moet overbrengen, en de uitzendsleutel, zodat de uitzending specifiek op uw kanaal wordt weergegeven.

Als je alles goed hebt gedaan, zal YouTube na het uitvoeren van deze opdracht de verzonden stream zien. Om de uitzending te starten, hoef je alleen maar op de knop ‘Start uitzending’ in YouTube zelf te klikken.

Stap 4 – voeg autonomie toe

Gefeliciteerd! Nu weet u hoe u kunt beginnen met uitzenden vanaf een videobestand. Maar dit is niet genoeg voor XNUMX/XNUMX uitzendingen. Het is belangrijk dat nadat de eerste video is afgespeeld, de volgende meteen begint en wanneer alle video's zijn weergegeven, het afspelen opnieuw begint.

Ik kwam op de volgende optie: maak een .sh-bestand waarin ik voor elk videobestand een commando schreef en helemaal aan het einde een commando aangaf om hetzelfde script opnieuw uit te voeren. Het resultaat is een recursie als deze:

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

En ja, het werkte. Tevreden over mezelf lanceerde ik een testuitzending en ging naar bed.

In de ochtend wachtte mij een onaangename verrassing. Het bleek dat de uitzending maar een paar minuten duurde en vrijwel onmiddellijk eindigde toen ik mijn computer uitzette. Uit het onderzoek is gebleken dat op deze manier gelanceerde commando's worden uitgevoerd terwijl de gebruiker ingelogd is op de server. Zodra ik de verbinding verbrak, werden de opdrachten die ik uitvoerde onderbroken. Om dit te voorkomen, is het voldoende om voor het team te staan bash voeg de opdracht toe nohup. Hierdoor kan het lopende proces worden uitgevoerd, ongeacht uw aanwezigheid.

De uiteindelijke minimale versie van het script ziet er als volgt uit:

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 $

Waar start.sh het bestand is waarin dit script is geschreven. En dit bestand moet zich in dezelfde map bevinden als de videobestanden.

Door aan het einde een dollarteken toe te voegen, kan het proces op de achtergrond worden uitgevoerd, zodat u de console kunt blijven gebruiken zonder de uitzending te onderbreken.

De bonussen omvatten de volgende goodies:

  • U kunt handmatig overschakelen naar het afspelen van bestanden. Om dit te doen, moet u het momenteel lopende ffmpeg-proces “doden”. Hierna start het afspelen van het volgende bestand uit de lijst automatisch.
  • Nieuwe video's kunnen aan de uitzending worden toegevoegd zonder de uitzending te stoppen. Upload de video naar de server, voeg een opdracht toe om dit bestand in het script uit te voeren en sla het op. Dat is alles. Bij de volgende afspeelronde wordt het nieuwe bestand samen met de oude bestanden uitgezonden.

Stap 5 – pas ffmpeg aan

In principe hadden we daar kunnen stoppen. Maar ik wilde de uitzending wat vriendelijker maken voor de kijkers.

Laten we zeggen dat iemand naar de uitzending ging, begon te kijken, het leuk vond en deze lezing vanaf het begin wilde bekijken, maar de uitzending staat terugspoelen niet toe. Om een ​​lezing vanaf het begin te bekijken, moet iemand naar mijn website gaan en een opname van de interessante lezing opvragen. Hoe kun je zien welke lezing hem interesseert? Er staan ​​al 16 lezingen op de site en er komen er elke week alleen maar meer bij. Ik denk dat zelfs ik, die al deze lezingen heb gefilmd en gemonteerd, niet uit een willekeurig fragment zal kunnen opmaken welke lezing het is. Daarom is het noodzakelijk dat elke lezing op de een of andere manier wordt aangeduid.

De optie om ondertiteling toe te voegen aan de bronvideobestanden in het bewerkingsprogramma beviel mij niet. Het was noodzakelijk om ervoor te zorgen dat de originele bestanden werden gebruikt. Zodat het ondersteunen van de uitzending zo min mogelijk lichaamsbewegingen van mij vergt.

Het bleek dat ffmpeg mij hier ook mee kon helpen. Het heeft een speciaal kenmerk -vf, waarmee tekst over video kan worden geplaatst. Om tekst aan een video toe te voegen, moet je het volgende fragment aan de opdracht toevoegen:

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

Uitleg van parametersfontfile= – link naar het lettertypebestand. Zonder dit wordt het bijschrift niet aan de video toegevoegd. De eenvoudigste manier is om het lettertypebestand in dezelfde map te plaatsen als de video. Of u moet het volledige pad naar het bestand opgeven.

text= – eigenlijk de tekst zelf die bovenop de video moet worden geplaatst.

fontsize= – lettergrootte in pixels.

fontcolor= – lettertypekleur.

borderw= – de dikte van de omtrek rond de tekst in pixels (ik heb witte tekst met een zwarte omtrek van 1 pixel dik).

bordercolor= – omtrekkleur.

x= и y= – tekstcoördinaten. Punt 0;0 bevindt zich in de linkerbovenhoek. Mijn coördinaten zijn zo geselecteerd dat de tekst in de linker benedenhoek wordt geplaatst met een videoresolutie van 1280x720 pixels.

Het ziet er zo uit:

Zend uw video's XNUMX/XNUMX uit op YouTube

Stap 6 – bepaal de kwaliteit van de uitzending

Dat is alles, de uitzending is klaar. FFmpeg uitzendingen, bestanden worden afgespeeld, mijn aanwezigheid is niet nodig voor uitzending. Zelfs elke lezing is ondertekend. Kijk alsof dat het is.

Maar er kwam nog een nuance naar voren: ik koos voor de minimale serverconfiguratie en deze haalde de uitzending niet op. Serverconfiguratie: 1 core (zoals 2.2 GHz), 1 gigabyte RAM, 25 GB SSD. Er was voldoende RAM, maar de processor was bijna volledig belast op 100% (en soms zelfs 102-103% :) Dit leidde ertoe dat de uitzending om de paar seconden bevroor, niet leuk.

Je zou eenvoudigweg een duurdere configuratie met twee kernen kunnen nemen, gelukkig kun je met cloudtechnologieën de serverconfiguratie wijzigen door op een paar knoppen te drukken. Maar ik wilde passen in de minimale configuratiecapaciteit. Ik begon de ffmpeg-documentatie te bestuderen en ja, er zijn daar ook instellingen waarmee je de belasting van het systeem kunt regelen.

Hoge beeldkwaliteit kan op twee manieren worden bereikt: hoge CPU-belasting of veel uitgaand verkeer. Het blijkt dat hoe meer belasting de processor kan verdragen, hoe minder kanaalbandbreedte nodig zal zijn. Of je kunt de processor niet te veel belasten, maar dan heb je een breed kanaal nodig met veel verkeersruimte. Als er beperkingen zijn aan zowel de processor als de grootte van het uitgaande kanaal/verkeer, dan zul je de beeldkwaliteit moeten verlagen zodat de uitzending soepel verloopt.

Mijn server heeft toegang tot een 10 Mbit/s breed kanaal. Deze breedte is precies goed. Maar er is een verkeerslimiet: 1 TB per maand. Om aan de verkeersbeperkingen te voldoen, mag mijn uitgaande stroom daarom niet hoger zijn dan ~300 KB per seconde, d.w.z. De bitrate van de uitgaande stream mag niet hoger zijn dan 2,5 Mbit/s. YouTube raadt overigens aan om met deze bitrate uit te zenden.

Om de belasting van het systeem te regelen, gebruikt ffmpeg verschillende benaderingen. Goed hierover geschreven hier. Uiteindelijk heb ik twee attributen gebruikt: -crf и -preset.

Constante snelheidsfactor (CRF) – dit is een coëfficiënt waarmee u de kwaliteit van het beeld kunt aanpassen. CRF kan waarden hebben van 0 tot 51, waarbij 0 de kwaliteit van het bronbestand is, 51 de slechtst mogelijke kwaliteit. Het wordt aanbevolen om waarden van 17 tot 28 te gebruiken, de standaard is 23. Met een coëfficiënt van 17 zal de video visueel identiek zijn aan het origineel, maar technisch gezien zal deze niet hetzelfde zijn. De documentatie stelt ook dat de grootte van de uiteindelijke video, afhankelijk van de gespecificeerde CRF, exponentieel verandert, d.w.z. Als u de coëfficiënt met 6 punten verhoogt, wordt de bitsnelheid van de uitgaande video verdubbeld.

Als u CRF gebruikt, kunt u het “gewicht” van het uitgaande beeld selecteren en vervolgens gebruiken voorinstellingen (-voorinstelling) je kunt zelf bepalen hoe zwaar de processor wordt belast. Dit attribuut heeft de volgende parameters:

  • ultrafast
  • superfast
  • veryfast
  • faster
  • fast
  • medium - standaardwaarde
  • slow
  • slower
  • veryslow

Hoe “sneller” de parameter is opgegeven, hoe hoger de belasting van de processor zal zijn.

Ik selecteerde eerst een preset die eigenlijk te zwaar was voor mijn processor, en selecteerde vervolgens de belasting nauwkeuriger met behulp van CRF. In mijn geval werkte de preset fast, en voor crf heb ik gekozen voor de waarde 24.

Conclusie

Dat is alles. Het laatste commando voor het starten van de uitzending was dit:

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/%КЛЮЧ_ТРАНСЛЯЦИИ%

Er zijn hier nog maar twee onbeschreven punten:

1) -c:v libx264 – het specificeren van een specifieke codec voor het werken met het bronbestand.
2) -g 3 – expliciete aanduiding van het aantal keyframes. In dit geval wordt gespecificeerd dat elk derde frame een sleutelframe moet zijn. De standaardwaarde is 5 of 8, maar YouTube zweert en vraagt ​​om minimaal 3.

Je kunt zien welke kwaliteit de uitzending is gebleken hier.

De belasting op de server was als volgt:

Zend uw video's XNUMX/XNUMX uit op YouTube

Zend uw video's XNUMX/XNUMX uit op YouTube

Op basis van de monitoringgegevens is het duidelijk dat de processorbelasting varieert van 70% tot 95% en dat de uitzending gedurende de week nooit 100% heeft bereikt. Dit betekent dat met deze instellingen de processor voldoende is.

Door de schijf te laden, kan ik zeggen dat deze bijna niet wordt geladen en dat een gewone harde schijf voldoende zou moeten zijn voor uitzendingen.

Maar de hoeveelheid uitgaand verkeer baart mij zorgen. Het blijkt dat mijn uitgaande stream varieert van 450 tot 650 KB per seconde. Over een maand zal dit ongeveer 1,8 terabyte zijn. Mogelijk moet u extra verkeer kopen of overstappen naar een configuratie met twee kernen omdat... Ik wil de kwaliteit van de foto niet verminderen.

***

Als gevolg hiervan zal ik zeggen dat het helemaal opnieuw opzetten van een dergelijke uitzending ongeveer 1-2 uur duurt. Bovendien zal het uploaden van de video naar de server het grootste deel van de tijd in beslag nemen.

De lancering van een dergelijke uitzending rechtvaardigde zichzelf niet als marketinginstrument. Als we het aantal weergaven vergroten, zodat YouTube-algoritmen deze uitzending oppikken en deze actief in aanbevelingen gaan weergeven, zou er misschien iets lukken. In mijn geval werd het in 16 dagen ononderbroken uitzending 58 keer bekeken.

Dat is goed. De uitzending past harmonieus op de hoofdpagina van mijn website. Hierdoor kreeg ik de kans om snel een eigen mening te vormen over de docent en de colleges zelf.

En een ogenblik. Het is belangrijk dat de uitzending niemands auteursrecht schendt, anders wordt deze geblokkeerd. Ik ben kalm over mijn uitzending omdat... Ik heb specifiek gekozen voor muziekinserts met gratis gebruik, en de auteur van de inhoud zit op een computer in de buurt en is er helemaal niet op tegen dat ik haar inhoud gebruik :)

Maar als je ergens in je uitzending een radio op de achtergrond hebt staan, of je hebt je favoriete nummer gebruikt tijdens de montage, of een videofragment uit een populaire muziekvideo, tv-serie of film genomen, dan loopt je uitzending gevaar. Het is ook belangrijk dat de uitzending minimaal een minimale semantische lading heeft, anders kan deze als spam worden geblokkeerd.

***

Dat is alles wat ik heb. Ik hoop dat deze handleiding iemand goed van pas zal komen. Nou, als je iets toe te voegen hebt, schrijf, dan lees ik graag de toevoegingen en verduidelijkingen aan het artikel.

Bron: www.habr.com

Voeg een reactie