برنامه نویسی

تولید ویدیو با Streamtasks – انجمن DEV

Summarize this content to 400 words in Persian Lang
از زمان شروع تولید ویدیو، ما با یک چالش مهم روبرو بوده ایم: پردازش حجم وسیعی از داده ها. در ابتدا، کامپیوترها بسیار کند بودند و منجر به ظهور صنعتی شد که بر ساخت جعبه های سخت افزاری تخصصی برای کارهای مختلف مانند رمزگذاری، رمزگشایی، انتقال، دریافت، سوئیچینگ و نمایش ویدئو متمرکز بود. این جعبه ها ضروری شدند و تولید ویدئو را به یک تلاش گران تبدیل کردند.

با این حال، امروزه ما سخت‌افزار همه‌منظوره قدرتمندی مانند GPU و CPU داریم که می‌توانند داده‌های ویدیویی و صوتی مورد نیاز پردازش را مدیریت کنند. اما صنعت هنوز در این زمینه عقب است. چرا زمانی که GPU ها می توانند این وظایف را انجام دهند، جعبه های رمزگذار ویدیویی هنوز وجود دارند؟

پس مشکل چیست؟

یکپارچه سازی و نرم افزار. ما نرم افزارهای کوچکی داریم که می توانند برخی کارها را انجام دهند، اما برخی دیگر را نه. برای کارهای ضبط ساده، ابزارهایی مانند OBS کافی است. برای سوئیچینگ پیچیده تر، از ابزارهایی مانند vMix استفاده می شود. همه این ابزارها یک چیز مشترک دارند: آنها به اندازه اتصال برخی از سیم ها به هر کجا که می خواهید انعطاف پذیر نیستند. شما با چیزی که به شما داده شده گیر کرده اید.

راه حل

جعبه و سیم را در نرم افزار می سازیم. به جای خرید جعبه های انکودر، ویدیوی خود را با برنامه های کوچک رمزگذاری می کنید و این برنامه های کوچک را با سیم های مجازی متصل می کنید. این ایده کارهای جریانی است. حتی می‌توانید کدک مورد نظر، وضوح، فرمت‌های پیکسلی، هر آنچه را که این نرم‌افزار کوچک («Task») به شما اجازه تغییر دهد، تغییر دهید. برای درک بهتر نحوه عملکرد نرم افزار، توصیه می کنم ویدیوی کلی را تماشا کنید.

Streamtasks به شما امکان می دهد موضوعاتی را که به صورت دایره های رنگی نمایش داده می شوند را به یکدیگر متصل کنید. در طول عملیات، وظیفه داده های ورودی را در زمان واقعی پردازش می کند. به عنوان مثال، یک رمزگذار ویدیو، ویدیوی خامی را که دریافت می‌کند رمزگذاری می‌کند و سپس ویدیوی کدگذاری شده را در موضوع خروجی خروجی می‌دهد.

کاری که می توانید با استریم تسک انجام دهید به دو چیز بستگی دارد:

وظایف موجود
تخیل شما

در حالی که نمی‌توانم تخیل شما را بهبود ببخشم، می‌توانم کارها را انجام دهم و فرآیند ایجاد کارهای جدید را ساده کنم.در حال حاضر، بیش از 50 کار مختلف در streamtasks یکپارچه شده است. اینها از وظایف بسیار ساده تا پیچیده تر و قدرتمندتر هستند که بسیاری از آنها در اینجا مستند شده اند.

ایده کلی این است که تا حد امکان کنترل بیشتری به کاربر داده شود. اگر بتوان یک کار را به دو کار ساده‌تر تقسیم کرد، معمولاً ایده خوبی است.

اگر می توانید نرم افزار بنویسید، می توانید وظایف خود را بنویسید. ساده ترین کار را می توان در 4 خط کد نوشت (حتی کمتر، اگر واقعا تلاش کنید). اگر علاقه مند به انجام وظایف خود هستید، من شما را به مستندات ارجاع می دهم: https://leopf.github.io/streamtasks/custom-task.html

هوش مصنوعی

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

رونویسی صوتی زنده
تشخیص چهره زنده
تشخیص چهره
متن به گفتار

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

توزیع داده ها و بارهای کاری

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

امروز با استریم تسک این امکان وجود دارد.

می‌توانید چندین نمونه از کارهای جریانی را در ماشین‌های مختلف اجرا کنید و با استفاده از رابط کاربری مدیریت اتصال یا مشخص کردن یک URL اتصال/خدمت در خط فرمان، آنها را به هم متصل کنید.

# the main instance (started with -C) accepting tcp connections on 9002
streamtasks -C –serve tcp://0.0.0.0:9002
# a sub instance connecting to the main system (in this case running on the same machine)
streamtasks –connect tcp://127.0.0.1:9002

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

هر کار موجود در هر دو دستگاه اکنون دو بار در انتخاب کار نمایش داده می شود. برای هر گره یک بار

در نتیجه اکنون می توانید کارهایی را در ماشین های مختلف شروع کنید و آنها را به طور بی رویه وصل کنید.

در این مثال ما دو ورودی صوتی مختلف (مانند میکروفون) داریم که یکی روی node/machine “demo1” و دیگری روی “demo2” اجرا می شود. این صدا میکس شده و سپس بر روی یک خروجی صوتی در “demo1” پخش می شود. احتیاط کن! داده های صوتی از ورودی صوتی در دمو2 از طریق TCP ارسال می شود. اگر ویدیوی خام را از طریق اتصال TCP ارسال کنید، احتمالاً به نتیجه دلخواه نخواهید رسید. ویدیوی 1080p 30 فریم در ثانیه RGB24، 1492 مگابیت بر ثانیه داده است. اگر پهنای باند کافی نداشته باشید، کار نخواهد کرد.

توزیع بارهای کاری

با اجرای وظایف بر روی ماشین های مختلف، می توانید بارهای کاری سنگین مانند رمزگذاری ویدئو را توزیع کنید. این کار را می‌توان در حالی انجام داد که اطلاعات مفیدی مانند میزان فعالیت در یک ویدیو (چند و چند پیکسل تغییر کرده است) را قبل از کدگذاری ویدیو استخراج کنید.

در مثال زیر دو ورودی ویدیو داریم (مانند دوربین). یکی در هر گره. فعالیت ویدیو اندازه گیری می شود تا بین فیدهای ویدیو جابجا شود و ویدیو در هر گره کدگذاری می شود. سپس داده‌های ویدیویی رمزگذاری‌شده از demo2 به دمو1 ارسال می‌شود، جایی که ما بین فیدهای ویدیویی بر اساس فعالیت آنها جابجا می‌شویم. فعال ترین ویدیو سپس در یک نمایشگر ویدیو نمایش داده می شود.

این به ما امکان می دهد از یک دستگاه به عنوان رمزگذار برای هر فید ویدیو استفاده کنیم. هنگام استفاده از رمزگذارهای سخت‌افزار GPU، هر دستگاه معمولاً می‌تواند خیلی بیشتر از یک فید ویدیویی را رمزگذاری کند. با افزایش مقیاس، می خواهیم بار را بین ماشین ها توزیع کنیم.

توزیع داده ها

اتصالات اینترنتی محلی اغلب بسیار محدود است. حتی اگر خوش شانس باشید که سرعت آپلود 1 گیگابیت بر ثانیه را دریافت کنید، باز هم با سرعتی که می توانید از سروری که در یک مرکز داده کار می کند بایگانی کنید، قابل مقایسه نیست.

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

در مثال‌های زیر یک ورودی ویدیویی داریم که روی کامپیوترمان اجرا می‌شود. داده های ویدئویی کدگذاری می شوند و سپس به 3 کانتینر خروجی مختلف ارسال می شوند. سپس این کانتینرهای خروجی هر کدام فید ویدئو را به عنوان یک جریان rtmp در یک سرویس استریم منتشر می‌کنند (دمو پخش زنده را ببینید).

شبکه streamtasks به اندازه‌ای هوشمند است که فقط یک بار فید ویدیو را به سرور ما در حال اجرا در مرکز داده ارسال کند، علیرغم وجود سه وظیفه دریافت داده‌ها. در نتیجه ما فقط از یک سوم پهنای باند آپلود در دستگاه محلی خود استفاده می کنیم، در حالی که به سه سرویس مختلف پخش می شود.

داشبوردهای ساختمانی

هرچه خطوط لوله تولید شما پیچیده تر باشد، برای نظارت بر آنها به نظارت بیشتری نیاز دارید. Streamtasks به شما امکان می دهد داشبوردهایی ایجاد کنید که از پنجره ها تشکیل شده است، هر پنجره “نمایش” یک کار است. این می تواند ویدیوی یک نمایشگر ویدیو، متن یک نمایشگر متنی، سوئیچ رابط کاربری سوئیچ باشد.

مثال زیر یک سوئیچ kill است. به‌روزرسانی‌کننده مهر زمان، زمان فید ویدیوی ۵ ثانیه را به آینده منتقل می‌کند. هنگامی که با سایر فیدهای ویدئویی هماهنگ می شود، این باعث می شود که فید واقعی 5 ثانیه به عقب برگردد. به این ترتیب می‌توانید پیش‌نمایش ویدیو را در نمای زنده مشاهده کنید و سپس خروجی را به یک تصویر ثابت 5 ثانیه قبل از نمایش آن تغییر دهید.

بینندگان ویدیو هر کدام یک ویدیو را نمایش می دهند که می تواند در داشبورد مرتب شود. رابط کاربری سوئیچ که برای روشن/خاموش کردن ویدیو استفاده می‌شود، یک عنصر کنترلی را نمایش می‌دهد.

نمونه های بیشتر

از آنجایی که شما آزادید هر کاری را که می خواهید ترکیب کنید، می توانید چیزهای شگفت انگیزی با آن بسازید. در اینجا چند نمونه آورده شده است:

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

کاهش حجم صدای محیط (مانند میکروفون استادیوم) زمانی که فردی در حال صحبت است.

با جابجایی همیشه به بلندترین بلندگو، ویدیوی پادکست‌ها را تغییر دهید

پخش صداها
ایجاد چت ربات هایی که صحبت می کنند

اگر علاقه مند به دیدن نمونه های کار بیشتر هستید، می توانید آنها را در یوتیوب تماشا کنید.

از زمان شروع تولید ویدیو، ما با یک چالش مهم روبرو بوده ایم: پردازش حجم وسیعی از داده ها. در ابتدا، کامپیوترها بسیار کند بودند و منجر به ظهور صنعتی شد که بر ساخت جعبه های سخت افزاری تخصصی برای کارهای مختلف مانند رمزگذاری، رمزگشایی، انتقال، دریافت، سوئیچینگ و نمایش ویدئو متمرکز بود. این جعبه ها ضروری شدند و تولید ویدئو را به یک تلاش گران تبدیل کردند.

با این حال، امروزه ما سخت‌افزار همه‌منظوره قدرتمندی مانند GPU و CPU داریم که می‌توانند داده‌های ویدیویی و صوتی مورد نیاز پردازش را مدیریت کنند. اما صنعت هنوز در این زمینه عقب است. چرا زمانی که GPU ها می توانند این وظایف را انجام دهند، جعبه های رمزگذار ویدیویی هنوز وجود دارند؟

پس مشکل چیست؟

یکپارچه سازی و نرم افزار. ما نرم افزارهای کوچکی داریم که می توانند برخی کارها را انجام دهند، اما برخی دیگر را نه. برای کارهای ضبط ساده، ابزارهایی مانند OBS کافی است. برای سوئیچینگ پیچیده تر، از ابزارهایی مانند vMix استفاده می شود. همه این ابزارها یک چیز مشترک دارند: آنها به اندازه اتصال برخی از سیم ها به هر کجا که می خواهید انعطاف پذیر نیستند. شما با چیزی که به شما داده شده گیر کرده اید.

راه حل

جعبه و سیم را در نرم افزار می سازیم. به جای خرید جعبه های انکودر، ویدیوی خود را با برنامه های کوچک رمزگذاری می کنید و این برنامه های کوچک را با سیم های مجازی متصل می کنید. این ایده کارهای جریانی است. حتی می‌توانید کدک مورد نظر، وضوح، فرمت‌های پیکسلی، هر آنچه را که این نرم‌افزار کوچک («Task») به شما اجازه تغییر دهد، تغییر دهید. برای درک بهتر نحوه عملکرد نرم افزار، توصیه می کنم ویدیوی کلی را تماشا کنید. https://www.youtube.com/watch?v=cMmoPQrjQ0M

ورودی ویدیو و رمزگذار

Streamtasks به شما امکان می دهد موضوعاتی را که به صورت دایره های رنگی نمایش داده می شوند را به یکدیگر متصل کنید. در طول عملیات، وظیفه داده های ورودی را در زمان واقعی پردازش می کند. به عنوان مثال، یک رمزگذار ویدیو، ویدیوی خامی را که دریافت می‌کند رمزگذاری می‌کند و سپس ویدیوی کدگذاری شده را در موضوع خروجی خروجی می‌دهد.

کاری که می توانید با استریم تسک انجام دهید به دو چیز بستگی دارد:

  1. وظایف موجود
  2. تخیل شما

در حالی که نمی‌توانم تخیل شما را بهبود ببخشم، می‌توانم کارها را انجام دهم و فرآیند ایجاد کارهای جدید را ساده کنم.
در حال حاضر، بیش از 50 کار مختلف در streamtasks یکپارچه شده است. اینها از وظایف بسیار ساده تا پیچیده تر و قدرتمندتر هستند که بسیاری از آنها در اینجا مستند شده اند.

ایده کلی این است که تا حد امکان کنترل بیشتری به کاربر داده شود. اگر بتوان یک کار را به دو کار ساده‌تر تقسیم کرد، معمولاً ایده خوبی است.

اگر می توانید نرم افزار بنویسید، می توانید وظایف خود را بنویسید. ساده ترین کار را می توان در 4 خط کد نوشت (حتی کمتر، اگر واقعا تلاش کنید). اگر علاقه مند به انجام وظایف خود هستید، من شما را به مستندات ارجاع می دهم: https://leopf.github.io/streamtasks/custom-task.html

هوش مصنوعی

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

  • رونویسی صوتی زنده
  • تشخیص چهره زنده
  • تشخیص چهره
  • متن به گفتار

شما می توانید این نسخه ی نمایشی یک چت بات را با TTS تماشا کنید تا ایده ای از آنچه ممکن است به دست آورید.
https://www.youtube.com/watch?v=j6mSyNTFCM4

توزیع داده ها و بارهای کاری

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

امروز با استریم تسک این امکان وجود دارد.

می‌توانید چندین نمونه از کارهای جریانی را در ماشین‌های مختلف اجرا کنید و با استفاده از رابط کاربری مدیریت اتصال یا مشخص کردن یک URL اتصال/خدمت در خط فرمان، آنها را به هم متصل کنید.

# the main instance (started with -C) accepting tcp connections on 9002 
streamtasks -C --serve tcp://0.0.0.0:9002
# a sub instance connecting to the main system (in this case running on the same machine)
streamtasks --connect tcp://127.0.0.1:9002
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

هر کار موجود در هر دو دستگاه اکنون دو بار در انتخاب کار نمایش داده می شود. برای هر گره یک بار

انتخاب کار

در نتیجه اکنون می توانید کارهایی را در ماشین های مختلف شروع کنید و آنها را به طور بی رویه وصل کنید.

میکس صدا

در این مثال ما دو ورودی صوتی مختلف (مانند میکروفون) داریم که یکی روی node/machine “demo1” و دیگری روی “demo2” اجرا می شود. این صدا میکس شده و سپس بر روی یک خروجی صوتی در “demo1” پخش می شود. احتیاط کن! داده های صوتی از ورودی صوتی در دمو2 از طریق TCP ارسال می شود. اگر ویدیوی خام را از طریق اتصال TCP ارسال کنید، احتمالاً به نتیجه دلخواه نخواهید رسید. ویدیوی 1080p 30 فریم در ثانیه RGB24، 1492 مگابیت بر ثانیه داده است. اگر پهنای باند کافی نداشته باشید، کار نخواهد کرد.

توزیع بارهای کاری

با اجرای وظایف بر روی ماشین های مختلف، می توانید بارهای کاری سنگین مانند رمزگذاری ویدئو را توزیع کنید. این کار را می‌توان در حالی انجام داد که اطلاعات مفیدی مانند میزان فعالیت در یک ویدیو (چند و چند پیکسل تغییر کرده است) را قبل از کدگذاری ویدیو استخراج کنید.

در مثال زیر دو ورودی ویدیو داریم (مانند دوربین). یکی در هر گره. فعالیت ویدیو اندازه گیری می شود تا بین فیدهای ویدیو جابجا شود و ویدیو در هر گره کدگذاری می شود. سپس داده‌های ویدیویی رمزگذاری‌شده از demo2 به دمو1 ارسال می‌شود، جایی که ما بین فیدهای ویدیویی بر اساس فعالیت آنها جابجا می‌شویم. فعال ترین ویدیو سپس در یک نمایشگر ویدیو نمایش داده می شود.

تعویض ویدیو

این به ما امکان می دهد از یک دستگاه به عنوان رمزگذار برای هر فید ویدیو استفاده کنیم. هنگام استفاده از رمزگذارهای سخت‌افزار GPU، هر دستگاه معمولاً می‌تواند خیلی بیشتر از یک فید ویدیویی را رمزگذاری کند. با افزایش مقیاس، می خواهیم بار را بین ماشین ها توزیع کنیم.

توزیع داده ها

اتصالات اینترنتی محلی اغلب بسیار محدود است. حتی اگر خوش شانس باشید که سرعت آپلود 1 گیگابیت بر ثانیه را دریافت کنید، باز هم با سرعتی که می توانید از سروری که در یک مرکز داده کار می کند بایگانی کنید، قابل مقایسه نیست.

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

در مثال‌های زیر یک ورودی ویدیویی داریم که روی کامپیوترمان اجرا می‌شود. داده های ویدئویی کدگذاری می شوند و سپس به 3 کانتینر خروجی مختلف ارسال می شوند. سپس این کانتینرهای خروجی هر کدام فید ویدئو را به عنوان یک جریان rtmp در یک سرویس استریم منتشر می‌کنند (دمو پخش زنده را ببینید).

پخش زنده به چندین سرویس

شبکه streamtasks به اندازه‌ای هوشمند است که فقط یک بار فید ویدیو را به سرور ما در حال اجرا در مرکز داده ارسال کند، علیرغم وجود سه وظیفه دریافت داده‌ها. در نتیجه ما فقط از یک سوم پهنای باند آپلود در دستگاه محلی خود استفاده می کنیم، در حالی که به سه سرویس مختلف پخش می شود.

داشبوردهای ساختمانی

هرچه خطوط لوله تولید شما پیچیده تر باشد، برای نظارت بر آنها به نظارت بیشتری نیاز دارید. Streamtasks به شما امکان می دهد داشبوردهایی ایجاد کنید که از پنجره ها تشکیل شده است، هر پنجره “نمایش” یک کار است. این می تواند ویدیوی یک نمایشگر ویدیو، متن یک نمایشگر متنی، سوئیچ رابط کاربری سوئیچ باشد.

مثال زیر یک سوئیچ kill است. به‌روزرسانی‌کننده مهر زمان، زمان فید ویدیوی ۵ ثانیه را به آینده منتقل می‌کند. هنگامی که با سایر فیدهای ویدئویی هماهنگ می شود، این باعث می شود که فید واقعی 5 ثانیه به عقب برگردد. به این ترتیب می‌توانید پیش‌نمایش ویدیو را در نمای زنده مشاهده کنید و سپس خروجی را به یک تصویر ثابت 5 ثانیه قبل از نمایش آن تغییر دهید.

کشتن استقرار سوئیچ

بینندگان ویدیو هر کدام یک ویدیو را نمایش می دهند که می تواند در داشبورد مرتب شود. رابط کاربری سوئیچ که برای روشن/خاموش کردن ویدیو استفاده می‌شود، یک عنصر کنترلی را نمایش می‌دهد.

Kill Switch Dashboard Off

Kill Switch Dashboard On

نمونه های بیشتر

از آنجایی که شما آزادید هر کاری را که می خواهید ترکیب کنید، می توانید چیزهای شگفت انگیزی با آن بسازید. در اینجا چند نمونه آورده شده است:

  1. می‌توانید با داشتن چندین جریان ویدیویی و استفاده از یک سوئیچ برای جابه‌جایی بین آن‌ها، تغییر ویدیو را اجرا کنید. تنها چیزی که برای تغییر نیاز دارید، روشی برای کنترل سوئیچ است مانند دکمه‌های رادیویی، یک رابط کاربری کوچک که برخی از گزینه‌ها را نمایش می‌دهد و به شما امکان می‌دهد یکی را انتخاب کنید. سوئیچ همیشه به فید ویدیویی سوئیچ می کند که بیشترین عدد را به عنوان سیگنال کنترلی خود دارد.
    تعویض ویدیو
  2. کاهش حجم صدای محیط (مانند میکروفون استادیوم) زمانی که فردی در حال صحبت است.
    میکس صدا
  3. با جابجایی همیشه به بلندترین بلندگو، ویدیوی پادکست‌ها را تغییر دهید
    جابجایی پادکست
  4. پخش صداها
  5. ایجاد چت ربات هایی که صحبت می کنند

اگر علاقه مند به دیدن نمونه های کار بیشتر هستید، می توانید آنها را در یوتیوب تماشا کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

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

دکمه بازگشت به بالا