silsin
دوشنبه 16 شهریور 1394, 13:16 عصر
با سلام
خوشبختانه در دنیای شبکه هر کاری که مربوط به ارتباط باشد رو می توان انجام داد .به بیان ساده این ارتباط هر چه می خواهد باشد و به هرچیزی که می خواهد منجر شود . چه ارتباط صوتی - تلفنی و یا ارسال و دریافت داده . مهمترین نکته که شرکت ها و متخصصان فعال در این زمینه همیشه به دنبال آن بوده و هستند پایین اوردن نرخ هزینه داده و به تبع افزایش سرعت ارتباط می باشد
نرخ هزینه داده : اشاره به مقدار داده دریافتی و یا ارسالی ***
در ادامه تاپیک های اموزشی خودم در زمینه برنامه نویسی شبکه اینبار می خواهیم روند ارتباط تصویری را برررسی کنیم . همانطور که در مقدمه بالا گفتم مهمترین نکته در این گونه ارتباط ها موضوع هزینه ارسال و دریافت داده است به طوری که مقدار داده های ارسالی و یا دریافتی کمتر باشد ما ارتباط بهتر و راحت تری خواهیم داشت اما نکته اینجاست هنوز که هنوزه ما روش کاملا بی نقص و ایده الی برای این کار نداریم . البته دیده ایم که شرکت های پیشرو و معروف در این زمینه مانند Skype راه کارهای بسیار خوب برای اینگونه ارتباط های تصویری را ارائه داده اند اما متاسفانه حداقل برای ما ایرانی ها استفاده از این راهکار ها بدون مشکل نبوده یعنی به خاطر کیفیت بد اینترنت کشور همه ما حداقل تجربه کیفیت نامناسب برای این گونه ارتباط ها را داشته ایم . همانطور که گفتم مهمترین نکته در این گونه ارتباط ها مبحث سرعت در انتقال می باشد . هرچه سرعت انتقال بیشتر باشد کیفیت هم بهتر خواهد بود و این خود مستلزم این است که داده های ارسالی و دریافتی تغییراتی داشته باشند . به طور معمول یک داده تصویری را می توان به مجموعه بسیار زیادی از تصاویر پشت سر هم تعبیر کرد که تعداد زیادی از انها یک فریم از ویدئو ما را تشکیل خواهند داد . نکته مهم در اینجا این است که هرچه کیفیت این فریم ها بیشتر باشد مسلما حجم داده به دست اماده نیز بیشتر خواهد شد . اگر چه بسیار از شرکت ها برای کنترل این بخش از ابزارهایی به نام Codec استفاده می کنند.
این Codec ها وظیفه تغییرات در بیت های دریافتی بر عهده دارند که به طبع به وسیله هر کدام از انها می توان نتیجه بهتر - فشرده تر را در اختیار گرفت . اگر چه نباید منکر این قضیه شد که استفاده از Codec ها خود کیفیت داده ها را دچار تغییر می کند اما مهمتر از کیفیت داده ها سرعت انتقال می باشد . اگر علاوه بر سرعت نیز باید کیفیت مناسب و قابل قبول تری را برای کاربر نهایی ارائه کرد.
در این تاپیک به وسیله ارائه نکات کلیدی می خواهیم روند ارسال و دریافت صوت در شبکه را بررسی کنیم .
کتابخانه هایی که از آنها برای این کار استفاده خواهیم کرد دو کتاب خانه :
DirectShow , Directx.Capture برای انجام Capture ویدئو از وب کم خواهد بود
این دو کتاب خانه را می توانید از پیوست زیر دریافت کنید
135061
در بخش اول این اموزش روند کپچر کردن ویدئو و در بخش دوم روند ارسال و دریافت تحت شبکه را بررسی می کنیم
1 - پروژه جدیدی ایجاد کرده فایل های کتابخانه را به آن اضافه کنید
2 - در بخش اعلان نیز این دو کتابخانه را اضافه کنید
using DirectX.Capture;
using DShowNET;
دو متغییر جدید تعریف خواهیم کرد :
public Capture capture = null;
public Filters filters = new Filters();
در بخش اعلان این دو متغییر جدید :
capture = new Capture(filters.VideoInputDevices[0], null);
filters.VideoInputDevices وظیفه برگرداندن دستگاه های موجود برای دریافت ویدئو را بر عهده دارد (با انتخاب index 0 ما اعلان خواهیم کرد که اولین device که همان دوربین پیش فرض سیستم عامل هست را انتخاب کن )
گزینه دوم نیز برای تعریف دستگاه دریافت صدا می باشد . در این مثال ما ان را null در نظر می گیریم چون می خواهیم فقط تصاویر را دریافت کنیم
capture.FrameRate = 15;
capture.FrameSize = new Size(320, 240);
به وسیله این دو property نیز به ترتیب فریم ریت و رزولوشن تصاویر را تعریف می کنیم
foreach (Filter ex in filters.VideoCompressors)
{
if (ex.Name == "Xvid MPEG-4 Codec")
{
capture.VideoCompressor = (ex);
}
}
به وسیله این شرط Codec مورد نظرمان را تعریف می کنیم (توضیحات مربوط به کدک و دلیل استفاده در بخش دوم بررسی خواهد شد )
برای متوقف کردن ضبط ویدئو از دستور زیر استفاده می کنیم
capture.Stop();
برای شروع ضبط از دستورات زیر استفاده می کنیم
capture.Cue();
Thread.Sleep(3000);
capture.Start();
عبارت Cue در خط اول برای اماده سازی فرایند ضبط و Start نیز برای شروع ضبط ویدئو می باشد
نکته : شما می توانید از Start به تنهایی استفاده کنید اما استفاده از Cue قبل از ان باعث میشود تا روند Start سریعتر شود
نکته : برای نمایش ویدئو شما باید از یک Picture Box در کنار یک Panel استفاده کنید
try
{
if (capture.PreviewWindow != p)
{
capture.PreviewWindow = p;
}
capture.FrameEvent2 += new Capture.HeFrame(CaptureDone);
capture.GrapImg();
isSending = true;
}
catch (Exception s)
{
MessageBox.Show(s.Message);
}
شروع نمایش و دریافت تصاویر با دستورات بالا امکان پذیر خواهد بود
دستور Grapimg برای دریافت تصاویر
event تعریف شده نیز برای عملیات در زمان کپچر تصاویر می باشد
private void CaptureDone(System.Drawing.Bitmap e)
{
try
{
picture.Image = e;
}
catch(Exception)
{
}
}
همانطور که مشاهده می کنید e به عنوان بافر دریافت شده به pictureBox ما نسبت داده شده است
پایان بخش اول
خوشبختانه در دنیای شبکه هر کاری که مربوط به ارتباط باشد رو می توان انجام داد .به بیان ساده این ارتباط هر چه می خواهد باشد و به هرچیزی که می خواهد منجر شود . چه ارتباط صوتی - تلفنی و یا ارسال و دریافت داده . مهمترین نکته که شرکت ها و متخصصان فعال در این زمینه همیشه به دنبال آن بوده و هستند پایین اوردن نرخ هزینه داده و به تبع افزایش سرعت ارتباط می باشد
نرخ هزینه داده : اشاره به مقدار داده دریافتی و یا ارسالی ***
در ادامه تاپیک های اموزشی خودم در زمینه برنامه نویسی شبکه اینبار می خواهیم روند ارتباط تصویری را برررسی کنیم . همانطور که در مقدمه بالا گفتم مهمترین نکته در این گونه ارتباط ها موضوع هزینه ارسال و دریافت داده است به طوری که مقدار داده های ارسالی و یا دریافتی کمتر باشد ما ارتباط بهتر و راحت تری خواهیم داشت اما نکته اینجاست هنوز که هنوزه ما روش کاملا بی نقص و ایده الی برای این کار نداریم . البته دیده ایم که شرکت های پیشرو و معروف در این زمینه مانند Skype راه کارهای بسیار خوب برای اینگونه ارتباط های تصویری را ارائه داده اند اما متاسفانه حداقل برای ما ایرانی ها استفاده از این راهکار ها بدون مشکل نبوده یعنی به خاطر کیفیت بد اینترنت کشور همه ما حداقل تجربه کیفیت نامناسب برای این گونه ارتباط ها را داشته ایم . همانطور که گفتم مهمترین نکته در این گونه ارتباط ها مبحث سرعت در انتقال می باشد . هرچه سرعت انتقال بیشتر باشد کیفیت هم بهتر خواهد بود و این خود مستلزم این است که داده های ارسالی و دریافتی تغییراتی داشته باشند . به طور معمول یک داده تصویری را می توان به مجموعه بسیار زیادی از تصاویر پشت سر هم تعبیر کرد که تعداد زیادی از انها یک فریم از ویدئو ما را تشکیل خواهند داد . نکته مهم در اینجا این است که هرچه کیفیت این فریم ها بیشتر باشد مسلما حجم داده به دست اماده نیز بیشتر خواهد شد . اگر چه بسیار از شرکت ها برای کنترل این بخش از ابزارهایی به نام Codec استفاده می کنند.
این Codec ها وظیفه تغییرات در بیت های دریافتی بر عهده دارند که به طبع به وسیله هر کدام از انها می توان نتیجه بهتر - فشرده تر را در اختیار گرفت . اگر چه نباید منکر این قضیه شد که استفاده از Codec ها خود کیفیت داده ها را دچار تغییر می کند اما مهمتر از کیفیت داده ها سرعت انتقال می باشد . اگر علاوه بر سرعت نیز باید کیفیت مناسب و قابل قبول تری را برای کاربر نهایی ارائه کرد.
در این تاپیک به وسیله ارائه نکات کلیدی می خواهیم روند ارسال و دریافت صوت در شبکه را بررسی کنیم .
کتابخانه هایی که از آنها برای این کار استفاده خواهیم کرد دو کتاب خانه :
DirectShow , Directx.Capture برای انجام Capture ویدئو از وب کم خواهد بود
این دو کتاب خانه را می توانید از پیوست زیر دریافت کنید
135061
در بخش اول این اموزش روند کپچر کردن ویدئو و در بخش دوم روند ارسال و دریافت تحت شبکه را بررسی می کنیم
1 - پروژه جدیدی ایجاد کرده فایل های کتابخانه را به آن اضافه کنید
2 - در بخش اعلان نیز این دو کتابخانه را اضافه کنید
using DirectX.Capture;
using DShowNET;
دو متغییر جدید تعریف خواهیم کرد :
public Capture capture = null;
public Filters filters = new Filters();
در بخش اعلان این دو متغییر جدید :
capture = new Capture(filters.VideoInputDevices[0], null);
filters.VideoInputDevices وظیفه برگرداندن دستگاه های موجود برای دریافت ویدئو را بر عهده دارد (با انتخاب index 0 ما اعلان خواهیم کرد که اولین device که همان دوربین پیش فرض سیستم عامل هست را انتخاب کن )
گزینه دوم نیز برای تعریف دستگاه دریافت صدا می باشد . در این مثال ما ان را null در نظر می گیریم چون می خواهیم فقط تصاویر را دریافت کنیم
capture.FrameRate = 15;
capture.FrameSize = new Size(320, 240);
به وسیله این دو property نیز به ترتیب فریم ریت و رزولوشن تصاویر را تعریف می کنیم
foreach (Filter ex in filters.VideoCompressors)
{
if (ex.Name == "Xvid MPEG-4 Codec")
{
capture.VideoCompressor = (ex);
}
}
به وسیله این شرط Codec مورد نظرمان را تعریف می کنیم (توضیحات مربوط به کدک و دلیل استفاده در بخش دوم بررسی خواهد شد )
برای متوقف کردن ضبط ویدئو از دستور زیر استفاده می کنیم
capture.Stop();
برای شروع ضبط از دستورات زیر استفاده می کنیم
capture.Cue();
Thread.Sleep(3000);
capture.Start();
عبارت Cue در خط اول برای اماده سازی فرایند ضبط و Start نیز برای شروع ضبط ویدئو می باشد
نکته : شما می توانید از Start به تنهایی استفاده کنید اما استفاده از Cue قبل از ان باعث میشود تا روند Start سریعتر شود
نکته : برای نمایش ویدئو شما باید از یک Picture Box در کنار یک Panel استفاده کنید
try
{
if (capture.PreviewWindow != p)
{
capture.PreviewWindow = p;
}
capture.FrameEvent2 += new Capture.HeFrame(CaptureDone);
capture.GrapImg();
isSending = true;
}
catch (Exception s)
{
MessageBox.Show(s.Message);
}
شروع نمایش و دریافت تصاویر با دستورات بالا امکان پذیر خواهد بود
دستور Grapimg برای دریافت تصاویر
event تعریف شده نیز برای عملیات در زمان کپچر تصاویر می باشد
private void CaptureDone(System.Drawing.Bitmap e)
{
try
{
picture.Image = e;
}
catch(Exception)
{
}
}
همانطور که مشاهده می کنید e به عنوان بافر دریافت شده به pictureBox ما نسبت داده شده است
پایان بخش اول