Перейти до основного вмісту

Конструктор FFmpeg tee

Вставте адреси RTMP або RTMPS і отримайте аргумент -f tee чи повну команду FFmpeg, яка стрімить на всі платформи одночасно. Якщо одна платформа відхилить з'єднання або перестане читати, інші працюватимуть далі. Усе працює у вашому браузері. Це також безкоштовний інструмент командного рядка і бібліотека Python під ліцензією MIT.

Призначення

Усе збирається на цій сторінці: введене нікуди не надсилається і не зберігається.

Результат
Відео й аудіо

Задає rw_timeout. Без нього інші призначення стрімлять далі, але сервер, який прийняв з'єднання і більше не відповідає, може не дати FFmpeg завершитися, коли стрім закінчиться.

Результат

Взято в лапки для bash, zsh чи sh: вставляйте як є. Не пропускайте через echo в zsh, бо він перетворює дві зворотні похилі риски на одну.

ffmpeg -hide_banner -re -i input.mp4 -map 0:v:0 -map 0:a:0 -c:v libx264 -preset veryfast -b:v 4500k -maxrate 4500k -bufsize 9000k -g 60 -pix_fmt yuv420p -c:a aac -b:a 160k -ar 44100 -f tee '[f=flv:flvflags=+no_duration_filesize:onfail=ignore:use_fifo=1:fifo_options=queue_size=600\\:drop_pkts_on_overflow=1]rtmp://a.rtmp.youtube.com/live2/YOUR-YOUTUBE-KEY|[f=flv:flvflags=+no_duration_filesize:onfail=ignore:use_fifo=1:fifo_options=queue_size=600\\:drop_pkts_on_overflow=1]rtmp://live.twitch.tv/app/YOUR-TWITCH-KEY'
2 призначення.

Навіщо кожен параметр

Мультиплексор tee у FFmpeg кодує один раз і пише ті самі пакети в кожне призначення, тож стрім на три платформи коштує процесору майже стільки ж, скільки на одну. Усі його налаштування вміщаються в один аргумент, і три частини цього аргументу ламаються без жодного повідомлення про помилку.

ПараметрЩо буде без нього
onfail=ignoreЗа документацією типове значення — abort. Якщо одне призначення відхилить з'єднання, наприклад через скинутий ключ чи завершену подію, зупиниться весь процес, а з ним і всі інші платформи.
use_fifo=1tee пише в усі призначення з одного потоку. Сервер, який тримає з'єднання відкритим, але перестав читати, рано чи пізно блокує цей запис для всіх призначень. Помилки немає, і всі призначення досі виглядають підключеними.
drop_pkts_on_overflow=1Сама черга лише відкладає те саме зависання. Коли черзі дозволено відкидати пакети, втрачає їх тільки завислий сервер, а решта йде далі в реальному часі.
queue_size=600\\:drop_pkts_on_overflow=1tee знімає один рівень екранування з параметрів призначення, а вкладений fifo_options — ще один. З однією зворотною рискою drop_pkts_on_overflow потрапляє до мультиплексора flv, той відхиляє його як Unknown option, і падають усі виходи.

Адреси теж перевіряються. В аргументі tee символ | розділяє призначення, [ і ] позначають блоки параметрів, а зворотна риска екранує символи. Ключ стріму з будь-яким із цих символів непомітно змінює команду. Такі символи і будь-які пробіли відхиляються, а помилка називає рядок, але ніколи не показує ключ.

Із цими налаштуваннями наші власні цілодобові стріми на кілька платформ працюють у продакшні з серпня 2026 року. Тести проєкту перевіряють кожне твердження вище на справжньому FFmpeg і локальних RTMP-серверах. Один тест відтворює зависання без черги, інший показує, що одна зворотна риска вимикає всі виходи.

Те саме з термінала або з Python

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

pip install git+https://github.com/YouPanel/ffmpeg-tee-builder

ffmpeg-tee-builder --command -i show.mp4 --timeout 10 --file destinations.txt > stream.sh
sh stream.sh

Як бібліотека, вона повертає список аргументів для subprocess, тож немає екранування для shell, у якому можна помилитися:

from ffmpeg_tee_builder import build_command
import subprocess

urls = ["rtmp://a.rtmp.youtube.com/live2/KEY1", "rtmp://live.twitch.tv/app/KEY2"]
subprocess.run(build_command(urls, input="show.mp4", timeout=10), check=True)

Код, тести і повна історія: ffmpeg-tee-builder на GitHub (MIT) · Один завислий RTMP-сервер зупинив усі інші (англ.)

Або не запускайте FFmpeg самі

TheLoops запускає таку роздачу в хмарі цілодобово: завантажте відео один раз і стріміть їх як ефір 24/7 на кілька платформ, навіть коли ваш комп'ютер вимкнено.

Почати безкоштовно

Запитання

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

Мультиплексор tee не вибирає потоки сам, як звичайний вихід, тож без -map може залишитися без звуку чи без відео. Згенерована команда бере перший відеопотік і перший аудіопотік входу.

З onfail=ignore FFmpeg пише в лог, що slave muxer впав, і продовжує з рештою, наприклад continuing with 1/2 slaves. Це призначення залишається вимкненим до перезапуску FFmpeg. Сам tee не перепідключає призначення, яке впало, тож довгому стріму потрібен наглядач, що його перезапустить.

Так. Адреси rtmps:// приймаються, зокрема з явним портом, як у Facebook: rtmps://live-api-s.facebook.com:443/rtmp/. Двокрапка перед портом безпечна в аргументі tee, бо параметри читаються лише всередині квадратних дужок.

Ні. Конструктор на цій сторінці працює у вашому браузері й не робить жодних запитів із введеним. Версія для командного рядка працює на вашому комп'ютері й може читати ключі з файлу, а не з аргументів.