استریم ویدیو در PHP

  • آپدیت شده در تاریخ

استریم ویدیو در PHP

قصد داریم در این آموزش به شما نحوه استریم ویدیو در PHP یا همان پخش زنده ویدیو بدون دانلود کامل آن را در وب (video stream) را نشان بدیم.

قبل از شروع مقاله آموزشی استریم ویدیو در PHP , نیاز است مفهوم Stream را درک کنیم.

استریمینگ یا لایو استریم تکنیکی است که به وسیله آن می توان یک فایل چند رسانه‌ای مانند صدا ویا تصویر ویدئویی را بدون این که احتیاج به دانلود همه فایل باشد، بر روی اینترنت به صورت لحظه ای از نقطه زمان مورد درخواست مشاهده کرد.

به عبارت دقیق تر برای مشاهده یک ویدئو معمولی، بایستی ابتدا کل فایل در سیستم بارگزاری شده و سپس نمایش داده شود. اما ویدئو استریمینگ به شما اجازه می دهد که از محتوا قبل از اینکه تمام فایل دانلود شود، شروع به استفاده و مشاهده کنید.

سایت های بزرگ اشتراک ویدیو مثلا یوتیوب و آپارات از این قابلیت Video Stream استفاده می کنند تا ما بدون نیاز به انتظار برای لود کل ویدیو, آن را پخش کنیم.

 

امروزه سرویسهای میزبانی ویدئو با استفاده از استانداردهای رایج از جمله RTMP و HLS به صورت هم زمان ویدیو را دریافت و نمایش می‌دهد؛ به گونه‌ای که طی این فرآیند، استریم‌های فایل ویدئویی به بخش های بسیار کوتاه (TS) چند ثانیه ای تقسیم شده و پلیر به جای دریافت کل فایل به صورت تکه های مجزا دریافت می‌کند.

استریم ویدیو در PHP

روش های زیادی برای استریم ویدیو در PHP وجود دارد یکی از این روش های بسیار قدیمی که به تنهایی کاربردی ندارد و یکسری عملیات دیگر نیاز است, ست کردن هدر و خواندن فایل با توابع fopen است که یک کلاس ساده از آن را قرار دادیم.

به دلایل زیر این روش به هیچ وجه توصیه نمی شود

  • عدم پشتیبانی از فایل های طولانی و حجیم ویدیویی
  • عدم پشتیبانی از لایه SSL بر روی HTTP
  • نبود امکان کنترل خودکار بر روی فرمت فایل ویدیویی
  • عدم حفظ وضعیت قبلی ویدیو
  • و …..

همچنین از ابزار قدرمتند FFmpeg نیز برای اینکار می توانید استفاده کنید که البته نیاز به سرور اختصاصی برای نصب و پیکیربندی آن دارید.

برای همین یک روش جایگزین را خدمت شما برای استریم ویدیو در PHP (Video Streaming) معرفی می کنیم.که از کامپونت ReactPHP برای اجرای زنده ویدیو در PHP و پروژه خود استفاده می کنیم.

در بتدا یک اپلیکیشن بسیار ساده Hello world را برای درک نحوه استفاده از ReactPHP و کار با کلاس Server و مدیریت درخواست های دریافتی ایجاد می کنیم.

منطق اصلی سرور بازگشتی, پاس دادن متد سازنده سرور است. این تابع برگشتی در هربار دریافت یک درخواست (request) جدید اجرا می شود. که خب نمونه شی ساخته شده از Request را دریافت و آبجکت Response را بازگشت می دهد.

کلاس سازنده Response کد پاسخ, هدرها و بدنه اصلی پاسخ را دریافت می کند. در مثال ما, ما در هر درخواست, مقدار ثابت رشته Hello world را برگشت می دهیم.

پس اگر ۱۲۷٫۰٫۰٫۱:۸۰۸۰ را در مرورگر باز کنیم, مقدار Hello World را در نتیجه می بینیم.

استریم ویدیو در PHP

مثال ساده استریم ویدیو در PHP

حالا, می توانیم یک مورد جالب را بررسی میکنم. متد سازنده React\Http\Response می تواند یک نمونه ReadableStreamInterface از ReactPHP را به عنوان بدنه پاسخ (response body) دریافت کند.

یک استیریم قابل خواندن به این منظور استفاده می شود که به جای خواندن کل فایل در مموری, داده ها را از سورس موردنظر بصورت مداوم بخواند. این قابلیت به ما اجازه می دهد که داده ها را مستقیم داخل بنده پاسخ (response body) استریم کند.

برای مثال ما فایل bunny.mp4 را در حالت read باز میکنیم, یک ReadableResourceStream را با آن ساخته و سپس این استریم را مانند مثال زیر بر بدنه Response قرار می دیم:

نکته : در این مثال از fopen() فقط برای سادگی و نمایش دمو استفاده کردیم! بنابراین برای اپلیکیشن های مختلف خود استفاده کنید زیر با اجرای این فایل سیستم کل درخواست ها مسدود می شود و هر درخواست هم طبیعتا چند ثانیه طول می کشد.

 

برای ساختن یک نمونه از ReadableResourceStreamنیازه به یک حلقه رویدادی (event loop) داریم. همچنین ما Content-Type هدر را به video/mp4 تغییر  دادیم تا مرورگر را مطلع کنیم که یک ویدیو در حال ارسال است.

نیازی به مشخص کردن هدر Content-Length نیست چرا که در پشت صحنه ReactPHP بطور خودکار از اینکودینگ chunked استفاده می کند و بطورت مرتب هدر Transfer-Encoding: chunked استفاده می کند.

حالا مرورگر را رفرش و استریم شدن ویدیو را می بینیم:

استریم ویدیو در PHP

خب دیدید به چه راحتی با چند خط کد استریم ویدیو در PHP را پیاده سازی کردیم.

امیدوارم از آموزش استریم ویدیو در PHP نهایت استفاده را برده باشید. به زودی این مقاله ویرایش و قابلیت های جدیدی را برای استریم ویدیو در PHP اضافه می کنیم.

هر سوالی داشتید ، از قسمت نظرات ارسال کنید . سریعا ، پاسخگوی سوالات شما هستیم .

موفق و پیروز باشید

حسن شفیعی توسعه دهنده وب و موبایل مدیر سایت علاقه خاصی به برنامه نویسی وب و موبایل دارم و هر روز تلاش می کنم به این حوزه مسلط تر شوم و اطلاعاتم را به شکل کاربردی برای علاقه مندان در وب به اشتراک بگذارم. اگر نیاز به برنامه نویس برای انجام پروژه و نوشتن اسکریپت های سمت وب, اپلیکیشن های اندروید و ios, پیدا کردن راه حل توسعه و غیره داشتید حتما از طریق تماس با ما/ واتساپ/ تلگرام بهم پیام بدید. برایتهیه هاست مطمین و پرسرعت کلیک کنید
مطالب زیر را حتما بخوانید
دیدگاه کاربران (۴۲)

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

  1. رسول ۲۵ خرداد ۱۴۰۳

    سلام وقت به خیر
    من یک سوال خیلی مهم دارم برای خودم و کسایی که میخان وارد حوزه برنامه نویسی بشن و پاسخش از اون مهم تر
    کسایی که وارد حوزه برنامه نویسی میشن اندروید سایت یا هر چیز دیگه
    و سفارش مثلا طراحی سایت یا اندروید میگیرن مثل اپ فروشگاه اینترنتی
    آیا این کد نویسی ها رو از حفظ مینویسن
    یعنی قبلش الگو ندارن مثل یک اپ آماده فروشگاهی خارجی یا این که مثل یک اختراع انجام میشه دفترچه راهنماش هست آیا خود گوگل سازنده این زبان این الگوها رو نزاشته که کامل باشه و برنامه نویس ها از روی اون الگو برن جلو
    همیشه این سوال ذهنم رو مشغول کرده ایا برنامه نویس خود بدون نیاز به اینها کد مینویسه و آیا حتی بعد مدتها کدهای خودش یادش میمونه؟

    پاسخ
    1. حسن شفیعی ۲۶ خرداد ۱۴۰۳

      سلام ممنون
      با تمرین و تکرار زیاد کدها یادتون میمونه و مهم اصول هست یاد بگیرید نه اینکه اول تا اخر کد رو حفظ کنید.
      تو مرحله یادگیری اول شما اصول و توابع و نحوه نوشتن کد رو یاد میگیرید و بعد اموزش های پروژه محور که نحوه ساخت مثلا یه اپ یا سایت یا فروشگاه رو یاد میدن میتونید تمام اینارو یاد بگیرید

      پاسخ
  2. احسان ۲ تیر ۱۴۰۲

    سلام باتشکر از آموزش خوبتون
    گفته شده که از fopen() استفاده نشود. به جای fopen از چه تابعی باید استفاده کنیم؟

    پاسخ
    1. حسن شفیعی ۲ تیر ۱۴۰۲

      سلام
      file_put_contents(‘path_and_filename’ , ‘content’ , FILE_APPEND )

      پاسخ
  3. نریمان ۲۵ دی ۱۴۰۱

    تو این حالت ها لینک ویدیو کامل دیده میشه ؟ و راحت میشه لینک دانلود رو در اورد ؟ یا نه

    پاسخ
    1. حسن شفیعی ۲۵ دی ۱۴۰۱

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

      پاسخ
  4. علی سعیدی ۲۲ اردیبهشت ۱۴۰۱

    با سلام این روش از دانلود کردن توسط idm جلوگیری میکنه ؟

    پاسخ
    1. حسن شفیعی ۲۳ اردیبهشت ۱۴۰۱

      سلام. نه باز امکان دانلود هست

      پاسخ
  5. حمید ۲۸ دی ۱۳۹۹

    سلام وقتتون بخیر کسی میتونه سایت ویدی وود رو برام آنالیز کنه که کدنویسیش به چه شکل هست.ممنون میشم

    پاسخ
  6. محمد ۸ مهر ۱۳۹۹

    سلام استاد یه سوال میشه از اسون ترین روش فیلم بزارید صفر تا صدش
    چون متوجه نمیشم
    لطفا سمت کاربر رو هم بزرید تا یه پخش زنده کامل داشته باشیم

    پاسخ
  7. نیما ۲۵ شهریور ۱۳۹۹

    سلام چجور میشه چیزی رو ساخت که بشه با او بی اس روش استریم کرد؟

    پاسخ
    1. حسن شفیعی ۲۵ شهریور ۱۳۹۹
  8. طاها ۱۶ شهریور ۱۳۹۹

    استاد سلام چرا من وقتی کد را می نویسم php ارور می دهد

    پاسخ
    1. حسن شفیعی ۱۶ شهریور ۱۳۹۹

      سلام. یا بخاطر ورژن php هست یا اینکه کتابخانه لود نشده که باید ارور رو دید

      پاسخ
      1. طاها ۱۶ شهریور ۱۳۹۹

        استاد با سلام مجدد این ارور را می دهد Parse error: syntax error, unexpected ‘use’ (T_USE) بعد آدرس فایل مشکل دار را می دهد

        پاسخ
      2. حسن شفیعی ۱۶ شهریور ۱۳۹۹

        سلام. حتما طبق کامنت قبلی که برای یکی از دوستان شرح دادم reactphp رو هم به پروژه اضافه کنید

        پاسخ
  9. محمد ۱۶ شهریور ۱۳۹۹

    با سلام ببخشید چرا هیچ یک از دو روشی که گفتید در لوکال هاست کار نمی کند ؟ و چگونه باید react php را نصب کرد ؟

    پاسخ
    1. حسن شفیعی ۱۶ شهریور ۱۳۹۹

      سلام.
      باید پورت موردنظر را بدرستی در لوکال هاست باز کنید.
      نیاز نیست کل reactphp رو نصب کنید و فقط اون قسمتی که نیاز هست و داخل آموزش اشاره شده رو با کامپوزر نصب کنید
      https://packagist.org/search/?query=reactphp

      https://packagist.org/packages/react/stream

      https://netparadis.com/what-composer-in-php

      پاسخ
  10. مرتضی ۱۵ مرداد ۱۳۹۹

    ینی میخوام بگم اگه شما سرچ کنی :
    آموزش ساخت شیر مرغ در php همه سایت ها در مورد ضرب المثلش میارن… ولی از نت پارادیس نتیجه اصلی میاد …
    خوشم میاد مطالبتون تکمیله واقعا ….

    دمتون گرم 💪❤️👍

    پاسخ
    1. حسن شفیعی ۱۵ مرداد ۱۳۹۹

      سلام. خوشحالیم که مفید واقع شده.
      ممنون از لطفتون.
      موفق باشید.

      پاسخ
  11. منصور ۹ تیر ۱۳۹۹

    سلام میخام مثل اینستا روی هر ویدویی اسکرول شد پخش بشه

    پاسخ
    1. حسن شفیعی ۹ تیر ۱۳۹۹

      سلام. کافیه autoplay ویدیو رو true بزارید

      پاسخ
  12. علیرضا ۲۸ فروردین ۱۳۹۹

    سلام برادر، خیلی ممنون از آموزش.
    من میخوام ویدیو رو به صورت استریم برگردونم ، پکیج رو نصب کردم و عین کد شما زدم ولی روی لوکال هاست اتفاقی نمیافته،!!!
    خیلی گیرم، اگر میتونی یه کمکی بم بکن
    $loop = Factory::create();
    $server = new Server(function (ServerRequestInterface $request) use ($loop) {
    $video = new \React\Stream\ReadableResourceStream(fopen(‘1.mp4’, ‘r’), $loop);

    return new Response(200, [‘Content-Type’ => ‘video/mp4’], $video);
    });

    پاسخ
    1. حسن شفیعی ۲۹ فروردین ۱۳۹۹

      سلام. خوشحالیم که مفید واقع شده. دقیق نمیشه مشکل شما از کجاست. احتمالا یا مشکل از محیط اجرا و ورژن php و یا کدهای شما باشه که تا بررسی نشه نمیشه نظر دقیقی داد.

      پاسخ
  13. امید ۲۶ فروردین ۱۳۹۹

    سلام
    من میخوام ویدیویی که از سرورم میاد به پلیرم بصورت تکه های چند ثانیه ای باشه که قابلیت دانلود رو سخت کنه آیا با این راهکار امکانپذیره؟
    و سوال دیگه هم اینکه فایل ویدیویی رو تو سرور باز میکنیم،سرعت سایت افت نمیکنه؟اگر ۲۰ تا کاربر همزمان یک ویدیو ۲۰۰ مگابایتی رو پخش کنن سایت میاد پایین

    پاسخ
    1. حسن شفیعی ۲۶ فروردین ۱۳۹۹

      سلام. پایین تر کاربران برسیدند و توضیح داده شده به چه صورت باید انجام بشه. باید یک سرور با پهنای باند بالا و سخت افزار قوی تهیه کنید.

      پاسخ
  14. Kwn ۱۴ مهر ۱۳۹۸

    سلام خسته نباشید، میخوایم لینک لایو استریم یک شبکه رو کپی کنم در هوم اسکرین گوشی، ولی هر نیم ساعت ارور forbidden 404 میده وباید مجدد لینک جدید رو کپی کنم، دوستی گفت چون جنریت میشه و امبد کد باید برداری، اما من اصلا بلد نیستم و نمیدونم چطور اینکارو کنم، میشه لطفا مرحله به مرحله بفرمایید چطور باید امبد کد بردارم. ممنون

    پاسخ
    1. حسن شفیعی ۱۵ مهر ۱۳۹۸

      سلام. ممنون.
      از این سایت می توانید برای تولید امبد کد برای ویدیو استفاده کنید :
      https://embed.ly/code
      موفق باشید.

      پاسخ
  15. امید ۲ شهریور ۱۳۹۸

    سلام وقت شما بخیر باشد برای ساخت video chat یا audio chat یا مثلا ساخت پروژه ای مثل video conferece یا audio conference که ما نیاز داریم به طور همزمان تصویر یا صوت را با دوربین یا وبکم یا میکروفون کامپیوتر ضبط نماییم و مستقیم بر روی سرور سایت ارسال کنیم و در همان لحظه هم برای نمایش یا پخش بر روی سایت قرار دهیم در حقیقیت می خواهیم یک پخش زنده آنلاین راه اندازی کنیم لطفا در این مورد راهنمایی بفرمایید که به چه ابزار سخت افزاری و نرم افزاری نیاز داریم و آیا تنها با زبان php این کار انجام شدنی است یا از زبان ها و تکنولوژی های دیگر هم باید استفاده کنیم ؟
    با تشکر از شما خدانگهدار شما .

    پاسخ
    1. حسن شفیعی ۲ شهریور ۱۳۹۸

      سلام. ممنون.
      بله با php امکانش هست و باید یک سرور RTMP داشته باشید. اگر سرور اختصاصی داشته باشید میتونید این فابلیت رو با نصب برنامه مورد نظر روی سرور شخصی پیاده کنید.
      اگر سرور شخصی ندارید, یک سری هاستینگ ها هستند که RTMP سرور کانفیگ شده ارایه میدن و میتونید خریداری و ازش استفاده کنید
      بعضی اسکریپت هایی هم برای اینکار وجود دارند که از فلش مرورگر استفاده می کنند که باید روی سیستم تمام کسانی که روی این پلتفرم استریم می کنند, این فلش نصب شود که البته این هم جدا از سرور RTMP نیست.
      یک سایت هم که RTMP سرور فری تریال میده : https://rtmp-server.com/ که برای تست کارهاتون میتونید ازش استفاده کنید
      مورد آخر هم یک ابزار آمده ساخته شده توسط گوگل به اسم WebRTC هست که با جاواسکریپت ساخته شده و این امکان رو در اختیار ما قرار میده که بصورت realtime بتونیم ویدیو استریم کنیم.
      با این ابزار دیگه سرور RTMP نیاز نیست ولی به جای آن ابزار دیگری نیاز است روی سرور نصب بشه که در سایت اصلی راهنمایی های لازم اومده
      البته ابزارهای جالب دیگری هم هست که فقط از قابلیت websocket در html5 استفاده می کنند که نمونه های آن را در کدکنیون میتونید ببینید که به چه صورت پیاده سازی شدند.
      موفق باشید.

      پاسخ
      1. امید ۵ شهریور ۱۳۹۸

        تشکر فراوان بابت راهنمایی کامل شما موفق باشید انشاء الله.

        پاسخ
      2. احمد ۱۳ شهریور ۱۳۹۹

        سلام
        خیلی خوب می شد اگه یاد می دادین چجوری باید چنین چیزی رو بسازیم

        پاسخ
      3. محسن ۶ اردیبهشت ۱۴۰۰

        سلام این فایل از کجا بگیرم؟
        use Evenement\EventEmitter;

        پاسخ
  16. میلاد ۲۴ اسفند ۱۳۹۷

    مثلاً وبسایت فیلم نت…
    البته خودمم بررسی میکنم اسکرپیت های فیلم نت رو بهتون خبر میدم
    نمونه های دیگه ای هم هست که با اسنیف ترافیک شبکه فهمیدم…

    ولی اینا از قبل فیلم ها رو به چندصد پارت تقسیم میکنن و ذخیره میکنن و روی مرورگر به تدریج لود میشه

    پاسخ
  17. میلاد ۲۳ اسفند ۱۳۹۷

    سلام … شما همیشه راه حل های جالبی میدید 😀… یک سری سایت هستن خود فایل اصلی فیلم رو به پارت های مجزای ۸ ثانیه ای تبدیل میکنن و داخل اپ تحت وب و یا موبایلی نمایش میدن….
    روشی هست که برنامه بالارو تغییر داد و بیاد مثلا ۴۰۰ تا پارت بدون وقفه پشت سر هم پخش کنه؟

    پاسخ
    1. حسن شفیعی ۲۴ اسفند ۱۳۹۷

      سلام ممنونم.
      با همچنین موردی تا حالا برنخوردیم و واقعیش تا تست نشه نمیشه گفت که روش قطعی یا نحوه تغییر کد بالا به چه صورت است.
      اپ یا نمونه سایت رو معرفی کنید تا بررسی بشه.
      موفق باشید.

      پاسخ
  18. Safin ۷ بهمن ۱۳۹۷

    Please send me your email

    پاسخ
    1. حسن شفیعی ۷ بهمن ۱۳۹۷
  19. امیر علی ۱۹ مرداد ۱۳۹۷

    سلام .
    عاااالی بود . ممنون <3

    پاسخ
    1. حسن شفیعی ۱۹ مرداد ۱۳۹۷

      سلام . خوشحالم که مفید واقع شده .
      موفق باشید.

      پاسخ
      1. علی ۳۰ شهریور ۱۳۹۸

        سلام و عرض خسته نباشید.
        میخوام یه اپلیکیشن بسازم که بیاد چندتا فیلم کوتاه رو از یک پوشه در سرور دانلود کنه و پشت سر هم هر کدوم از این فیلم ها رو در اپ به صورت خودکار نمایش بده و بعد از اتمام هر ویدئو به صورت خودکار ویدئوی بعدی رو نمایش بده.ممنون میشم اگه راهنمایی کنید.مرسی.

        پاسخ
      2. حسن شفیعی ۳۰ شهریور ۱۳۹۸

        سلام. ممنون.
        در زمینه اپلیکیشن اطلاعات زیادی ندارم که بتونم راهنمایی کنم

        پاسخ
دوره های آموزشی