ارسال ویدیو بصورت Async در Web API
در دنیای امروز، محتوای ویدیویی بخش بزرگی از ترافیک اینترنت را به خود اختصاص داده است. پیادهسازی صحیح سیستم ارسال ویدیو در اپلیکیشنهای تحت وب اهمیت زیادی دارد. فریمورک ASP.NET Web API فراتر از یک ابزار ساده برای انتقال داده است. این فریمورک مدل جدیدی برای برنامهنویسی HTTP ارائه میدهد. یکی از قابلیتهای جذاب آن، ارسال ویدیو به صورت Asynchronous (ناهمگام) است. در مقاله ی ارسال ویدیو بصورت Async توسط Web Api، نحوه استریم ویدیو با کارایی بالا را بررسی میکنیم.
چرا باید از روش Async برای ارسال ویدیو استفاده کنیم؟ 📹
ارسال فایلهای حجیم مانند ویدیو، منابع سرور را به شدت درگیر میکند. اگر از روشهای سنتی استفاده کنید، یک رشته (Thread) سرور تا پایان دانلود کاربر اشغال میماند. این موضوع در ترافیک بالا باعث از کار افتادن سایت میشود. روش Async اجازه میدهد سرور بدون انتظار برای پایان انتقال، به درخواستهای دیگر پاسخ دهد.
مزایای استریم ویدیو در وب API
استفاده از این روش مزایای متعددی برای توسعهدهنده و کاربر نهایی دارد:
- ✅ کاهش مصرف حافظه: فایل به جای بارگذاری کامل، تکه تکه (Chunk) ارسال میشود.
- ✅ پاسخگویی سریع: کاربر بلافاصله پس از دریافت اولین پکیجها، ویدیو را مشاهده میکند.
- ✅ مدیریت پهنای باند: تنها بخشهایی از ویدیو که کاربر مشاهده میکند، ارسال میشود.
- ✅ تجربه کاربری بهتر: امکان اسکرول کردن ویدیو به زمانهای مختلف فراهم میگردد.
- ✅ مقیاسپذیری بالا: سرور توانایی مدیریت همزمان هزاران کاربر را پیدا میکند.
کاربردهای اصلی این تکنولوژی
- 🎥 ساخت پلتفرمهای اشتراک ویدیو مشابه یوتیوب.
- 🎥 پیادهسازی سیستمهای آموزشی آنلاین و LMS.
- 🎥 استریم خروجی دوربینهای مداربسته در پنلهای مدیریتی.
- 🎥 ارسال محتوای مالتیمدیا در اپلیکیشنهای موبایل.
گام اول: تنظیمات اولیه و Routing 🛠️
برای شروع، یک پروژه از نوع ASP.NET Web Application ایجاد کنید. قالب آن را بر روی MVC + Web API قرار دهید. اولین قدم، تنظیم مسیرها (Routes) برای دسترسی به ویدیوهاست.
به فایل WebApiConfig.cs در پوشه App_Start بروید. مسیرهای پیشفرض را حذف کنید. ما از Attribute Routing برای انعطافپذیری بیشتر استفاده میکنیم. کد شما باید به شکل زیر باشد:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// فعالسازی مسیریابی بر اساس اتریبیوت
config.MapHttpAttributeRoutes();
}
}
سپس در ریشه پروژه، پوشهای به نام Videos ایجاد کنید. یک فایل نمونه با نام sample.mp4 در آن قرار دهید.
گام دوم: پیادهسازی کلاس VideoStream 💡
ما به کلاسی نیاز داریم که مسئول خواندن فایل و نوشتن آن در جریان خروجی (Output Stream) باشد. این کلاس باید به صورت هوشمند عمل کند تا فایل قفل نشود.
شرح عملکرد کلاس
این کلاس مسیر فایل را دریافت میکند. سپس با استفاده از یک بافر ۶۴ کیلوبایتی، دادهها را میخواند. استفاده از FileShare.Read بسیار حیاتی است. این کار اجازه میدهد چندین کاربر همزمان یک فایل را بخوانند.
public class VideoStream
{
private readonly string _filename;
private long _contentLength;
public long FileLength => _contentLength;
public VideoStream(string videoPath)
{
_filename = videoPath;
using (var video = File.Open(_filename, FileMode.Open, FileAccess.Read, FileShare.Read))
{
_contentLength = video.Length;
}
}
public async Task WriteToStream(Stream outputStream, HttpContent content, TransportContext context)
{
try
{
var buffer = new byte[65536]; // بافر 64 کیلوبایتی
using (var video = File.Open(_filename, FileMode.Open, FileAccess.Read, FileShare.Read))
{
var length = (int)video.Length;
var bytesRead = 1;
while (length > 0 && bytesRead > 0)
{
bytesRead = video.Read(buffer, 0, Math.Min(length, buffer.Length));
await outputStream.WriteAsync(buffer, 0, bytesRead);
length -= bytesRead;
}
}
}
catch (HttpException)
{
// مدیریت قطع شدن کاربر
}
finally
{
outputStream.Close();
}
}
}گام سوم: ساخت کنترلر VideoController 🖥️
حالا باید یک کنترلر برای مدیریت درخواستهای HTTP بسازیم. این کنترلر پارامترهای نام فایل و پسوند را دریافت میکند. سپس با استفاده از PushStreamContent خروجی را تولید میکند.
public class VideoController : ApiController
{
[Route("api/video/{ext}/{fileName}")]
public HttpResponseMessage Get(string ext, string fileName)
{
string videoPath = HostingEnvironment.MapPath(string.Format("~/Videos/{0}.{1}", fileName, ext));
if (File.Exists(videoPath))
{
var video = new VideoStream(videoPath);
var response = Request.CreateResponse();
// استفاده از PushStreamContent برای استریمینگ
response.Content = new PushStreamContent((Action<Stream, HttpContent, TransportContext>)video.WriteToStream,
new MediaTypeHeaderValue("video/" + ext));
response.Content.Headers.Add("Content-Disposition", "attachment;filename=" + fileName);
response.Content.Headers.Add("Content-Length", video.FileLength.ToString());
return response;
}
return Request.CreateResponse(HttpStatusCode.NotFound);
}
}
راهنمای ثبتنام در سامانه توسعهدهندگان 📝
برای استفاده از سرویسهای پیشرفته و دریافت API Key اختصاصی، باید در سامانه ما عضو شوید. فرآیند ثبتنام بسیار سریع است:
- 🔹 ابتدا به آدرس
p.api.irمراجعه نمایید. - 🔹 فرم مشخصات فردی و ایمیل خود را تکمیل کنید.
- 🔹 کد تایید ارسال شده به ایمیل را وارد نمایید.
- 🔹 پنل کاربری شما بلافاصله فعال شده و آماده استفاده است.
گام چهارم: نمایش ویدیو در سمت کلاینت (HTML5) 🌐
در بخش فرانتاند، کافی است از تگ <video> استفاده کنید. مرورگرهای مدرن به خوبی با استریمهای ارسالی از سمت سرور تعامل میکنند.
<div>
<video width="640" height="360" controls preload="auto">
<source src="/api/video/mp4/sample" type="video/mp4" />
مرورگر شما از تگ ویدیو پشتیبانی نمیکند.
</video>
</div>نکته مهم: مقدار preload="auto" به مرورگر کمک میکند تا بلافاصله شروع به بافر کردن ویدیو کند. این کار باعث میشود کاربر تجربه روانی داشته باشد.
گام آخر 🏁
ارسال ویدیو بصورت Async توسط Web Api یکی از بهترین روشها برای بهینهسازی منابع سرور است. با استفاده از کلاس PushStreamContent و مدیریت صحیح بافر، میتوانید پلتفرمی قدرتمند و مقیاسپذیر بسازید. این روش نه تنها فشار روی سرور را کاهش میدهد، بلکه رضایت کاربران را نیز جلب میکند.
آیا در پیادهسازی این کد با مشکلی مواجه شدید؟ سوالات خود را در بخش نظرات بپرسید تا متخصصان ما شما را راهنمایی کنند. همچنین اگر این مقاله برایتان مفید بود، آن را با دوستان برنامهنویس خود به اشتراک بگذارید! ✨

Schöner Artikel! Danke .. Shaun Arne Sitnik