Цілодобова трансляція своїх відео на YouTube

Останнім часом як хобі знімаю на відео лекції знайомого психолога. Знятий матеріал монтую та публікую на своєму сайті. Місяць тому я спалахнув ідеєю організувати цілодобову трансляцію цих лекцій на YouTube в режимі 24/7. Такий собі тематичний «телеканал», присвячений особистісному зростанню.

Як зробити звичайну трансляцію, я знаю. А ось як зробити так, щоб це була трансляція саме відеофайлів? Щоб вона йшла 24/7, була гнучкою, максимально автономною і при цьому не залежала від мого домашнього комп'ютера. Це мені і треба було з'ясувати.

Цілодобова трансляція своїх відео на YouTube

На пошук рішення пішло кілька днів. Я вивчив безліч форумів та різних мануалів без яких моя трансляція просто не вийшла б. І тепер, коли витівка вдалася, я відчуваю потребу поділитися своїм рішенням. Так виникла ця стаття.

Якщо коротко, то підсумкове рішення вийшло так: VPS + ffmeg + bash-скрипт. Під катом я описую зроблені кроки та розповідаю про «підводне каміння», яке виявилося при організації трансляції.

Крок 1 – звідки йтиме трансляція?

На самому початку потрібно було визначитися, звідки вестиметься трансляція, де буде її джерело. Найперше, що спадало на думку – з домашнього комп'ютера. Зібрати відео в програвач і запустити їх відтворення в будь-якому відеоплеєрі. Потім захопити зображення з екрана та транслювати його на YouTube. Але майже відразу відмів цей варіант т.к. для його реалізації потрібно тримати домашній комп'ютер постійно увімкненим, а це шум від кулерів навіть уночі та збільшене споживання електроенергії (+100-150 кВт*год. щомісяця). І виходить, що домашнім комп'ютером на час трансляції користуватися буде не можна. будь-яке ворушіння мишкою буде видно в трансляції.

Далі я став дивитися убік хмарних сервісів. Шукав готовий сервіс, куди б можна було завантажити свої відео або, наприклад, вставити посилання на відео з YouTube і це все упаковувалося в одну нон-стоп трансляцію. Але нічого придатного не знайшов. Можливо, погано шукав. Єдине щось підходяще під функціонал – це restream.io, сервіс, який допомагає вести одночасну трансляцію на кілька платформ. Вони начебто можна завантажувати свої відео. Але цей сервіс створювався зовсім для інших цілей і вони розраховують, що трансляція триватиме лише кілька годин. Думаю, що якщо б через цей сервіс вдалося організувати цілодобову трансляцію, то це б вистрілило в десятки, а то й сотні доларів на місяць. А трансляцію все ж таки хотілося організувати або безкоштовно, або з мінімальними фінансовими вкладеннями.

Стало зрозуміло, що під трансляцію потрібно або окремий пристрій чи взагалі окремий комп'ютер. Думав у бік чогось на кшталт Raspberri Pi. А чого? Кулера в нього нема. Записав відео на флешку, застромив Ethernet-кабель і нехай лежить собі десь в затишному місці, трансляцію веде. Варіант. Але ні самої плати, ні досвіду роботи з нею я не мав, тому від цього варіанту я теж відмовився.

У результаті я натрапив на якесь обговорення, де обговорювали створення власного сервера трансляції. Це було не зовсім те, що я шукав, але основну думку я вловив - можна використовувати сервер! У цьому обговоренні пропонували використовувати зв'язок VPS + nginx + OBS. Стало зрозуміло, що це зв'язування може підійти і мені. Бентежило лише те, що я ніколи не адміністрував сервера і мені здавалося, що свій виділений сервер – це заморочено та дорого. Вирішив дізнатися скільки коштуватиме орендувати сервер у мінімальній комплектації та був приємно здивований.

Цілодобова трансляція своїх відео на YouTube

Ціни вказані у білоруських рублях і це просто крихти. Для розуміння, 8 білоруських рублів – це десь 3.5 долара чи 240 російських рублів. За місяць використання повноцінного комп'ютера, який увімкнено 24/7 і має швидкий доступ до Інтернету. Чомусь це відкриття стало дуже радісним для мене і я кілька днів ходила моторошно задоволена немов дитина, яка відкрила для себе космічні ракети 🙂

До речі, я скористався пропозицією першого ж сайту, який видав мені Google на запит «оренда VPS». Можливо, є ще більш бюджетні рішення, але ця ціна мене влаштувала і далі я не шукав.

Під час створення сервера можна вибрати операційну систему, під керуванням якої він працюватиме. На будь-якій із перерахованих систем можна організувати трансляцію і робити вибір варто виходячи з ваших переваг та фінансових можливостей (за сервер із Windows просять додаткову плату). Я вибрав CentOS. Просто тому, що у мене раніше був невеликий досвід роботи з нею.

Цілодобова трансляція своїх відео на YouTube

Крок 2 – налаштування сервера

Перше, що потрібно після створення сервера – це підключитися до нього через SSH. Спочатку я використовував PuTTy, але потім почав використовувати програму Secure Shell App, яка запускається в Google Chrome. Так мені виявилося зручніше.

Далі я змінив ім'я хоста, налаштував синхронізацію часу на сервері, оновив систему, порався з iptables… і зробив ще купу речей, але не тому, що це було необхідно. Просто мені цікаво було налаштовувати сервер, і в мене це виходило. Люблю колись виходить 🙂

А ось ті кроки, які потрібно зробити:

  1. Підключити репозиторій EPEL.
  2. Підняти сервер FTP (я вибрав vsftp).
  3. Встановити ffmpeg.

Детально команди наводити не буду, ця інструкція, швидше, концептуальна, щоб донести загальний план дій. Якщо у вас по якомусь з кроків виникнуть труднощі, вони швидко вирішуються запитом у пошуковій системі «CentOS підключити EPEL» чи «CentOS установка FTP-сервера». І за першими посиланнями ви зможете знайти детальні покрокові інструкції.

Отже, як я вже писав раніше, мені потрібна була зв'язка VPS + nginx + OBS. VPS – готове. Але по решті пунктів почали виникати питання. OBS – це програма для трансляцій, Open Broadcaster Software. І він працює лише з потоками тобто. наприклад, бере зображення з веб-камери та його транслює. Або записування екрана. Або трансляцію, що вже йде, перенаправляє на інший сайт. А у мене немає потоку, у мене є лише набір відеофайлів, який потрібно зробити потоком.

Став копати в цей бік і натрапив на ffmpeg. FFmpeg – це набір вільних бібліотек з відкритим вихідним кодом, які дозволяють записувати, конвертувати та передавати цифрові аудіо- та відеозаписи у різних форматах.

Та я дуже здивувався скільки всього ffmpeg може. Хочеш – витягне звук із відео. Хочеш – виріже фрагмент відео без перекодування. Хочеш – конвертує з одного формату в інший. І багато чого ще. Аж до того, що йому можна вказати файл, він його перетворює на потік і сам передасть на YouTube. Все, ланцюжок зібрано. Залишилося лише доопрацювати нюанси.

Крок 3 – налаштування трансляції

Створюємо трансляцію на YouTube. На цьому етапі нам потрібне лише посилання та ключ трансляції. На скріншоті нижче виділено червоним.

Цілодобова трансляція своїх відео на YouTube

Далі завантажуємо на сервер відео-файли, які плануємо транслювати. Власне, FTP тільки для цього етапу потрібний. Якщо у вас є інший зручний спосіб завантаження файлів на сервер, FTP-сервер можна не піднімати.

Передаємо потік на YouTube. Для старту мовлення необхідно запустити ffmpeg з кількома атрибутами. Ось так виглядає найкоротша команда, яка в мене вийшла:

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

Розшифрування атрибутів-re – вказує, що файл потрібно конвертувати в потік.

-i - Вказує, який файл потрібно відтворювати. Важливо, щоб команда запускалася з каталогу, де розташований сам відео-файл. Інакше варто вказувати абсолютне посилання на файл, на зразок /usr/media/lecture1.mp4.

-f - Вказує формат вихідного файлу. У моєму випадку виходить, що ffmpeg «на льоту» конвертує мій файл із mp4 у flv.

І насамкінець вказуємо дані, які ми взяли на YouTube на сторінці налаштування трансляції тобто. адресу, на яку потрібно передавати дані, та ключ трансляції, щоб трансляція відобразилася саме на вашому каналі.

Якщо ви все зробили правильно, то після запуску цієї команди, YouTube побачить потік, що передається. Для запуску трансляції вам залишиться натиснути кнопку «Почати трансляцію» у YouTube.

Крок 4 – додаємо автономність

Вітаю! Тепер ви знаєте, як запустити трансляцію з відео-файлу. Але цього недостатньо для цілодобової трансляції. Важливо, щоб після закінчення першого відео, відразу ж запускалося наступне, а коли з'являться все відео, відтворення починалося спочатку.

Я вигадав наступний варіант: створити .sh-файл, в якому прописав по команді на кожен відео-файл і в кінці вказав команду на повторний запуск цього ж скрипта. Вийшла така собі рекурсія:

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

І, так, це спрацювало. Я задоволений собою, запустив тестову трансляцію і пішов спати.

Вранці на мене чекав неприємний сюрприз. Виявилося, що трансляція йшла всього кілька хвилин і закінчилася практично відразу, як я вимкнув свій комп'ютер. Розслідування показало, що команди, запущені таким чином, виконуються, поки користувач авторизований на сервері. Як тільки я вимкнувся, виконання запущених команд мною перервалося. Щоб такого не відбувалося, достатньо перед командою bash дописати команду nohup. Це дозволить запущеному процесу виконуватись незалежно від вашої присутності.

Підсумкова мінімальна версія скрипта виглядає так:

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 $

Де start.sh – це файл, у якому записано цей скрипт. І цей файл повинен розташовуватися в одному каталозі з відеофайлами.

Додавання знака долара в кінці дозволяє запускати процес у фоновому режимі, щоб можна було далі користуватися консоллю, не перериваючи мовлення.

З бонусів вийшли такі плюшки:

  • Можна відтворювати файли вручну. Для цього потрібно «вбити» процес ffmpeg, що виконується в даний момент. Після цього автоматично запуститься відтворення наступного файлу зі списку.
  • Нові відео можна додавати до трансляції без зупинки мовлення. Просто завантажуєте відео на сервер, дописуєте у скрипті команду для запуску цього файлу, зберігаєте. І все. На наступному колі відтворення новий файл вже транслюватиметься нарівні зі старими файлами.

Крок 5 – доналаштовуємо ffmpeg

На цьому, загалом, можна було зупинитися. Але мені хотілося зробити трансляцію трохи більш доброзичливою для глядачів.

Припустимо, людина зайшла на трансляцію, почала дивитися, їй сподобалося і вона захотіла подивитися цю лекцію з початку, а трансляція не передбачає перемотування. Для перегляду лекції з початку людині потрібно буде перейти на мій сайт і отримати запис лекції, що цікавить. А як зрозуміти, яка лекція його цікавить? На сайті вже 16 лекцій і щотижня їх стає лише більше. Думаю, що навіть я, хто знімав та монтував усі ці лекції, не зможу за випадковим фрагментом визначити яка це лекція. Тому потрібно, щоби кожна лекція була якось позначена.

Варіант додати написи до вихідних відео-файлів у програмі для монтажу мене не влаштовував. Потрібно було зробити так, щоб використовувалися оригінальні файли. Щоб підтримка трансляції вимагала від мене якнайменше рухів тіла.

Виявилося, що і в цьому мені допоможе ffmpeg. Має спеціальний атрибут -vf, який дозволяє наносити текст поверх відео. Щоб додати текст на відео, необхідно до команди додати наступний фрагмент:

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

Розшифрування параметрівfontfile= - Посилання на файл шрифту. Без цього напис на відео не додається. Найпростіше файл шрифту покласти в одну папку з відео. Або потрібно буде вказати повний шлях до файлу.

text= - Власне, сам текст, який необхідно розмістити поверх відео.

fontsize= - Розмір шрифту в пікселях.

fontcolor= - Колір шрифту.

borderw= - Товщина контуру навколо тексту в пікселях (у мене білий текст з чорним контуром товщиною в 1 піксель).

bordercolor= – колір контуру.

x= и y= - Координати тексту. Крапка 0;0 знаходиться у лівому верхньому кутку. У мене координати підібрані таким чином, щоб текст розміщувався в лівому нижньому кутку при роздільній здатності відео 1280х720 пікселів.

Виглядає це так:

Цілодобова трансляція своїх відео на YouTube

Крок 6 – визначаємо з якістю трансляції

Все, трансляція готова. FFmpeg мовить, файли відтворюються, моя присутність для трансляції не потрібна. Навіть кожну лекцію підписано. Наче все.

Але сплив ще один нюанс – я вибрав мінімальну конфігурацію сервера, і він не витягував трансляцію. Конфігурація сервера: 1 ядро ​​(на зразок 2.2 ГГц), 1 гігабайт оперативної пам'яті, SSD на 25 Гб. Оперативної пам'яті вистачало, а ось процесор практично наглухо йшов у завантаження на 100% (а часом навіть у 102-103%) Це призводило до того, що трансляція раз на кілька секунд підвисала.

Можна було просто взяти дорожчу конфігурацію з двома ядрами, добре, що з хмарними технологіями зміна конфігурації сервера відбувається натисканням кількох кнопок. Але мені хотілося вміститися на потужності мінімальної конфігурації. Став вивчати документацію ffmpeg та так, там також є налаштування, які дозволяють регулювати навантаження на систему.

Висока якість зображення може бути досягнута двома шляхами: або високим навантаженням на процесор, або великим трафіком. Виходить, що більше навантаження він може взяти процесор, тим менше потрібна буде пропускна здатність каналу. Або можна сильно не навантажувати процесор, але тоді буде потрібен широкий канал з великим запасом по трафіку. Якщо ж є обмеження і за процесором, і за розміром вихідного каналу/трафіку, доведеться знижувати якість картинки, щоб трансляція йшла без ривків.

Моєму серверу доступний канал шириною 10 Мбіт/с. Такий ширини прямий із запасом. Але є обмеження щодо трафіку – 1 ТБ на місяць. Тому, щоб вкластися в обмеження щодо трафіку, мій вихідний потік не повинен перевищувати ~300 Кб на секунду. бітрейт вихідного потоку може бути трохи більше 2,5 Мбіт/с. YouTube, до речі, рекомендує вести трансляції в такому бітрейті.

Для регулювання навантаження на систему ffmpeg використовує різні підходи. Добре про це розписано тут. Я в результаті використав два атрибути: -crf и -preset.

Constant Rate Factor (CRF) - Це коефіцієнт, завдяки якому можна регулювати якість картинки. CRF може мати значення від 0 до 51, де 0 – якість вихідного файлу, 51 – найгірша можлива якість. Рекомендується використовувати значення від 17 до 28, за умовчанням коштує 23. При коефіцієнті 17 відео візуально буде ідентично вихідному, але технічно таким не буде. Також документації зазначено, що розмір підсумкового відео залежно від зазначеного CRF змінюється експоненційно тобто. збільшення коефіцієнта на 6 пунктів призведе до подвоєння бітрейту вихідного відео.

Якщо за допомогою CRF можна підібрати «вагу» вихідної картинки, то за допомогою пресетів (-preset) можна визначити, наскільки сильно буде завантажений процесор. Параметри цього атрибуту є такі:

  • ultrafast
  • superfast
  • veryfast
  • faster
  • fast
  • medium - значення за замовчуванням
  • slow
  • slower
  • veryslow

Чим «швидше» параметр вказано, тим вище буде навантаження на процесор.

Я спочатку підібрав пресет, який був у принципі «по зубах» моєму процесору, а потім тонше підібрав навантаження за допомогою CRF. У моєму випадку підійшов пресет fastдля crf я зупинився на значенні 24.

Висновок

На цьому все. Підсумкова команда для запуску трансляції у мене вийшла такою:

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

Тут залишилося лише два неописані моменти:

1) -c:v libx264 - Вказівка ​​конкретного кодека для роботи з вихідним файлом.
2) -g 3 – явна вказівка ​​кількості ключових кадрів. У цьому випадку зазначено, що кожен третій кадр має бути ключовим. Стандартне значення чи то на 5, чи то на 8, але YouTube лається, вимагає не менше 3.

Якої якості вийшла трансляція можна переглянути тут.

Навантаження на сервер вийшло таке:

Цілодобова трансляція своїх відео на YouTube

Цілодобова трансляція своїх відео на YouTube

Виходячи з даних моніторингу, видно, що навантаження на процесор коливається в межах від 70% до 95% і за тиждень трансляція жодного разу не вперлася на 100%. Значить, із такими налаштуваннями процесора вистачає.

Завантаження диска можу сказати, що він майже не навантажений і для трансляції цілком повинно вистачити і звичайного HDD.

А ось кількість вихідного трафіку мене непокоїть. Виходить, що мій вихідний потік коливається від 450 до 650 Кбайт на секунду. За місяць це становитиме близько 1,8 терабайт. Можливо доведеться докуповувати трафік або все ж таки перейти на конфігурацію з двома ядрами т.к. якість картинки не хотілося б знижувати.

***

Як результат, скажу, що налаштування такої трансляції з нуля займає близько 1-2 годин. Причому більшу частину часу займе завантаження відео на сервер.

Як маркетинговий інструмент, запуск такої трансляції себе не виправдав. Можливо, якщо накрутити перегляди, щоб алгоритми YouTube підхопили цю трансляцію і почали активно показувати її в рекомендаціях, тоді щось вийшло б. У моєму випадку за 16 днів безперервної трансляції її подивилися 58 разів.

Ну нічого. Трансляція гармонійно вписалася на головну сторінку мого сайту. Вийшла така можливість швидко скласти свою думку про лектор і самі лекції.

І ще один момент. Важливо, щоб трансляція не порушувала нічиїх авторських прав, інакше її заблокують. Я за свою трансляцію спокійний. музичні вставки я спеціально вибирав з вільним використанням, а автор контенту сидить за сусіднім комп'ютером і не проти того, щоб я використовував її контент 🙂

Але якщо у вас у трансляції десь фоном грає радіо, чи ви при монтажі використовували улюблений трек, чи взяли відеоряд із популярного музичного кліпу, серіалу чи фільму – тоді ваша трансляція у зоні ризику. Також важливо, щоб трансляція несла хоча б мінімальне смислове навантаження, інакше його можуть заблокувати як спамерське.

***

На цьому маю все. Сподіваюся цей мануал послужить комусь хорошу службу. Ну а якщо вам є що додати – пишіть, із задоволенням почитаю доповнення та уточнення до статті.

Джерело: habr.com

Додати коментар або відгук