مجله ایرانیکاسرورآموزش سرور، هاست، وردپرس و شبکه
لینوکس

ساخت Restream Server با MediaMTX و FFmpeg روی VPS

ساخت Restream Server با MediaMTX و FFmpeg؛ ارسال هم‌زمان یک لایو به چند پلتفرم اگر بخواهید یک Live را هم‌زمان روی چند سرویس منتشر کنید، ارسال مستقیم چند Stream از OBS مصرف Upload اینترنت…

ساخت Restream Server با MediaMTX و FFmpeg روی VPS
خلاصه سریع این آموزش

ساخت Restream Server با MediaMTX و FFmpeg؛ ارسال هم‌زمان یک لایو به چند پلتفرم اگر بخواهید یک Live را هم‌زمان روی چند سرویس منتشر کنید، ارسال مستقیم چند Stream از…

۸ دقیقه مطالعه ۰ دیدگاه ۱۰ مهر ۱۴۰۵ آخرین به‌روزرسانی

فهرست مطالب

ساخت Restream Server با MediaMTX و FFmpeg؛ ارسال هم‌زمان یک لایو به چند پلتفرم

اگر بخواهید یک Live را هم‌زمان روی چند سرویس منتشر کنید، ارسال مستقیم چند Stream از OBS مصرف Upload اینترنت فرستنده را چند برابر می‌کند. راه بهتر این است که OBS فقط یک Stream به VPS بفرستد و Restream Server همان Stream را برای مقصدهای مختلف Forward کند.

در این آموزش با MediaMTX 1.21.1 و FFmpeg 9.0.2 یک Restream Server می‌سازیم که یک ورودی RTMP را از OBS دریافت می‌کند و می‌تواند آن را هم‌زمان به چند RTMP/RTMPS Server، SRT Server یا Media Server دیگر ارسال کند. برای مقصدهایی که نیاز به Transcoding دارند نیز FFmpeg را وارد معماری می‌کنیم.

📌 معماری:

                    +--> Destination 1
                    |
OBS --> VPS Restream +--> Destination 2
                    |
                    +--> Destination 3
                    |
                    +--> Private Server

Restream Server دقیقاً چه کاری انجام می‌دهد؟

فرض کنید OBS یک Stream با Bitrate شش مگابیت ارسال می‌کند. اگر بخواهید مستقیماً سه مقصد را از OBS پوشش دهید، به Upload بسیار بیشتری در کامپیوتر فرستنده نیاز دارید.

با Restream Server، OBS فقط همان یک Stream را به VPS ارسال می‌کند. VPS Stream را دریافت و خودش به سه مقصد Forward می‌کند.

در نتیجه فشار اصلی Upload چندمقصدی از اینترنت شما به شبکه دیتاسنتر منتقل می‌شود.

Restream با Transcoding فرق دارد

اگر Stream را بدون تغییر Codec و کیفیت Forward کنیم، عملیات بیشتر شبیه Remux/Relay است و CPU زیادی نمی‌خواهد.

اگر یک مقصد H.264 1080p و مقصد دیگری 720p با Bitrate پایین‌تر بخواهد، باید Transcoding انجام شود و مصرف CPU یا GPU افزایش پیدا می‌کند.

روش CPU کیفیت خروجی
Copy / Forward کم همان ورودی
Transcoding زیاد قابل تغییر

MediaMTX برای Restream چه قابلیت‌هایی دارد؟

در نسخه‌های جدید MediaMTX قابلیت Forward به‌صورت Native وجود دارد. Stream ورودی می‌تواند به مقصدهای RTMP/RTMPS، SRT، RTSP، WebRTC/WHIP و Media-over-QUIC Forward شود.

اگر مقصد نیازمند Filter یا Transcoding باشد، می‌توان FFmpeg را با runOnAvailable اجرا کرد.

برای Restream چه VPSای لازم است؟

اگر از Forward Native یا -c copy استفاده می‌کنید، CPU معمولاً مسئله اصلی نیست؛ پهنای باند مهم‌تر است.

برای مثال یک Stream با Bitrate شش مگابیت که به سه مقصد فرستاده شود، تقریباً ۱۸Mbps ترافیک خروجی Restream ایجاد می‌کند؛ علاوه بر حدود ۶Mbps ورودی از OBS.

اگر سه مقصد هرکدام کیفیت جدا بخواهند، منابع CPU/GPU نیز باید به محاسبه اضافه شوند.

Restream روی سرور مجازی ایران

اگر منبع Stream شما داخل ایران است، قرار دادن Ingest/Restream Server روی VPS ایران می‌تواند مسیر کوتاه‌تری میان OBS و سرور ایجاد کند. برای Forward بین‌المللی باید کیفیت مسیر دیتاسنتر به مقصدهای خارجی را نیز بررسی کنید.

مرحله اول: نصب MediaMTX

اگر مقاله قبلی ساخت سرور پخش زنده با OBS را انجام داده‌اید، MediaMTX از قبل آماده است.

در غیر این صورت با Docker نسخه فعلی را اجرا کنید:

services:
  mediamtx:
    image: bluenviron/mediamtx:1.21.1

    restart: unless-stopped

    ports:
      - "1935:1935"
      - "8888:8888"

    volumes:
      - ./mediamtx.yml:/mediamtx.yml:ro

مرحله دوم: تعریف Publisher

authInternalUsers:
  - user: obs
    pass: CHANGE_THIS_PASSWORD
    permissions:
      - action: publish
        path: live

  - user: any
    pass:
    permissions:
      - action: read
        path: live

paths:
  live:

مرحله سوم: اتصال OBS

در OBS:

Service: Custom

Server:

rtmp://restream.example.com/live?user=obs&pass=PASSWORD

Stream Key: خالی

مرحله چهارم: Forward به چند RTMP Server

حالا بخش paths را کامل می‌کنیم:

paths:
  live:
    forward:
      - dest: rtmps://DESTINATION-1/app#STREAM_KEY_1

      - dest: rtmps://DESTINATION-2/app#STREAM_KEY_2

      - dest: rtmps://DESTINATION-3/app#STREAM_KEY_3

با شروع Stream روی مسیر live، MediaMTX آن را به هر سه Destination ارسال می‌کند.

⚠️ آدرس Ingest و Stream Key هر سرویس را از پنل همان سرویس بگیرید. Endpointها ممکن است در طول زمان تغییر کنند؛ آن‌ها را از مقاله یا نمونه اینترنتی کپی نکنید.

ارسال به YouTube

در پنل Live سرویس مقصد، Stream URL و Stream Key را دریافت کنید و آن‌ها را به شکل Destination RTMPS در MediaMTX قرار دهید.

برای YouTube باید Stream شما هم Track ویدئو و هم Audio داشته باشد؛ Streamهای Video-only ممکن است پذیرفته نشوند.

ارسال هم‌زمان به SRT Server

Native Forward محدود به RTMP نیست. برای SRT:

paths:
  live:
    forward:
      - dest: srt://remote.example.com:8890?streamid=publish:live

Forward به MediaMTX دیگر

اگر یک Media Server دوم دارید، می‌توانید Stream را با RTSP، RTMP، SRT، WHIP یا Media-over-QUIC Forward کنید.

این روش برای ساخت Relay Node در دیتاسنتر دیگر کاربردی است.

چه زمانی Native Forward کافی نیست؟

اگر مقصد Stream را با Codec فعلی قبول کند، Native Forward بهترین مسیر است؛ چون Transcoding اضافه ندارید.

اما فرض کنید OBS با 1080p و 6000kbps Stream می‌فرستد و مقصد دوم فقط 720p و 3000kbps می‌خواهد. اینجا باید FFmpeg وارد مسیر شود.

Restream با FFmpeg و بدون Transcoding

MediaMTX می‌تواند با runOnAvailable هنگام شروع Stream فرمان FFmpeg را اجرا کند.

pathDefaults:
  runOnAvailable: >
    ffmpeg
    -i rtsp://127.0.0.1:8554/$MTX_PATH
    -c copy
    -f flv
    rtmp://remote.example.com/live/STREAM_KEY

  runOnAvailableRestart: yes

چون -c copy استفاده شده، ویدئو دوباره Encode نمی‌شود.

Restream با کاهش کیفیت

ffmpeg \
  -i rtsp://127.0.0.1:8554/live \
  -vf "scale=-2:720" \
  -c:v libx264 \
  -preset veryfast \
  -b:v 2800k \
  -maxrate 3000k \
  -bufsize 5600k \
  -c:a aac \
  -b:a 128k \
  -f flv \
  rtmp://remote.example.com/live/STREAM_KEY

این دستور CPU بیشتری مصرف می‌کند، چون Frameها Decode و دوباره Encode می‌شوند.

یک Stream به چند مقصد با FFmpeg

FFmpeg Tee Muxer نیز برای خروجی چندگانه قابل استفاده است، اما اگر مقصدها مستقل هستند و قابلیت Native Forward MediaMTX نیاز شما را پوشش می‌دهد، مدیریت Destinationها در MediaMTX ساده‌تر است.

FFmpeg را زمانی وارد کنید که به Transcoding، Filter، Watermark، تغییر Resolution یا Protocol خاص نیاز دارید.

Watermark هنگام Restream

برای افزودن لوگو باید Stream دوباره Encode شود:

ffmpeg \
  -i rtsp://127.0.0.1:8554/live \
  -i logo.png \
  -filter_complex \
  "overlay=W-w-30:H-h-30" \
  -c:v libx264 \
  -preset veryfast \
  -b:v 4500k \
  -c:a aac \
  -b:a 128k \
  -f flv \
  rtmp://remote.example.com/live/STREAM_KEY

Failover در Restream

یک Restream Server خودش می‌تواند Single Point of Failure باشد. برای Liveهای مهم می‌توانید Server دوم، Source Backup یا Pipeline جایگزین داشته باشید.

همچنین runOnAvailableRestart می‌تواند Process مربوط به Forward را در صورت خروج دوباره اجرا کند، اما Failover کامل شبکه موضوع جداگانه‌ای است.

چطور مصرف پهنای باند را حساب کنیم؟

فرمول ساده:

Outbound ≈ Stream Bitrate × Number of Destinations

مثلاً:

6 Mbps × 4 destinations ≈ 24 Mbps outbound

این فقط Bitrate Media است و سربار Protocol را حساب نمی‌کند.

چطور Stream Keyها را امن نگه داریم؟

Stream Key عملاً Credential حساب Live شما است.

✅ فایل mediamtx.yml را عمومی نکنید.

✅ Permission فایل را محدود کنید.

✅ Configuration را داخل Repository عمومی Git قرار ندهید.

✅ بعد از افشای Stream Key فوراً آن را Rotate کنید.

✅ در صورت امکان از RTMPS استفاده کنید.

نمونه Permission:

sudo chmod 600 mediamtx.yml

آیا Restream کیفیت را کم می‌کند؟

اگر Native Forward یا -c copy انجام شود، Media دوباره Encode نمی‌شود و افت کیفیت ناشی از Re-encoding نداریم.

اگر برای هر مقصد Transcode انجام دهید، کیفیت و حجم خروجی به Encoder Settings بستگی دارد.

مانیتورینگ Restream Server

در Restream فقط Up بودن VPS کافی نیست. بهتر است این موارد را مانیتور کنید:

🔹 اتصال Publisher اصلی

🔹 اتصال هر Destination

🔹 پهنای باند ورودی و خروجی

🔹 CPU در صورت Transcoding

🔹 Packet Loss و Network Error

🔹 Logهای FFmpeg و MediaMTX

خطاهای رایج

یک مقصد Stream دریافت نمی‌کند

Stream URL و Key همان مقصد را دوباره از پنل Live بررسی کنید. همچنین Log MediaMTX را ببینید.

YouTube Stream را رد می‌کند

وجود Track صوت و تصویر، Codec، Bitrate و تنظیمات Live همان سرویس را بررسی کنید.

CPU به ۱۰۰ درصد می‌رسد

اگر فقط Forward می‌خواهید، مطمئن شوید Transcoding ناخواسته انجام نمی‌شود. -c copy یا Native Forward بسیار سبک‌تر است.

Stream بعد از قطع اینترنت OBS برنمی‌گردد

Reconnect Settings OBS، Network Stability و وضعیت Path MediaMTX را بررسی کنید.

سؤالات متداول

Restream Server چیست؟

سروری است که یک Stream ورودی دریافت می‌کند و آن را به یک یا چند مقصد دیگر Forward می‌کند.

آیا Restream به CPU زیاد نیاز دارد؟

اگر Stream بدون تغییر Forward شود، مصرف CPU پایین است. Transcoding کیفیت یا Codec مصرف CPU/GPU را بالا می‌برد.

آیا MediaMTX می‌تواند مستقیم Restream کند؟

بله. نسخه‌های فعلی Forward Native برای چند Protocol از جمله RTMP/RTMPS، SRT، RTSP و WebRTC دارند.

چه زمانی FFmpeg لازم است؟

وقتی مقصد به Resolution، Bitrate، Codec، Watermark یا Filter متفاوت نیاز دارد.

آیا یک Live را می‌توان به چند مقصد هم‌زمان فرستاد؟

بله. می‌توانید چند Forward Destination روی یک Path تعریف کنید.

Restream بهتر است روی VPS باشد یا سیستم شخصی؟

قرار دادن Restream روی VPS باعث می‌شود اینترنت فرستنده فقط یک Upload داشته باشد و توزیع به مقصدها داخل شبکه دیتاسنتر انجام شود.

جمع‌بندی

یک Restream Server ساده می‌تواند OBS را از ارسال چند Stream هم‌زمان بی‌نیاز کند. MediaMTX Stream ورودی را دریافت می‌کند و با Forward Native آن را به چند مقصد می‌فرستد.

تا زمانی که Codec و کیفیت تغییر نمی‌کنند، بهتر است از Forward مستقیم استفاده کنید. FFmpeg را زمانی وارد مسیر کنید که واقعاً به Transcoding، Watermark یا تغییر مشخصات Stream نیاز دارید.

اگر قرار است Restream برای Liveهای مهم Production استفاده شود، امنیت Stream Key، مانیتورینگ مقصدها، ظرفیت پورت شبکه و Failover را از ابتدا در طراحی لحاظ کنید.

اشتراک‌گذاری مقاله
گفت‌وگو درباره آموزش

دیدگاه‌ها (۰)

هنوز دیدگاهی ثبت نشده است.

دیدگاه یا سؤال خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *