silsin
شنبه 10 مرداد 1394, 15:40 عصر
در مورد برنامه نویسی شبکه مخصوصا در این گونه قسمت ها به شخصه دیدم که منابع خیلی کمی وجود داره . البته به طبع منابع مربوط به ارسال و دریافت متن وجود داره اما در مورد ارسال و یا دریافت محتواهای دیگه مثل صوت یا تصویر و یا حتی ویدئو منبع مستقیم برای راهنمایی کردن متاسفانه وجود نداره و اغلب برنامه نویس های این بخش به صورت ابتکاری اقدام به انجام این کار می کنند.
در همین محتوا در این تاپیک یکی از روش های انجام این کار رو بررسی می کنیم که به نظر خیلی بهتر از روش های دیگه برای ارسال و دریافت صوت از طریق سوکته
سه بخش تشکیل دهنده این تاپیک عبارتند از :
- اشنایی با کتابخانه NAudio و انجام پروژه دریافت صوت از طریق میکروفون
- اماده سازی محیط ارسال و دریافت سوکت (اماده سازی برنامه های کلاینت و سرور)
- ارسال صوت و پخش ان پس از دریافت در سمت کلاینت
بخش اول :
از بین کامپوننت های مربوط به کار با صدا , NAudio یکی از محبوب ترین اونها به شمار میره . از اونجایی که این کامپوننت با در اختیار قرار دادن امکانات مختلف در زمینه کار با صدا می تونه بسیاری از نیازهای مربوط به این بخش رو برای سازنده گان برطرف کنه فکر می کنم مزیت اون رو نسبت به دیگر پلاگین ها نشون میده
برای دریافت این کتابخانه می تونید به ادرس زیر مراجعه کنید :
https://naudio.codeplex.com (https://naudio.codeplex.com/)
برای اشنایی با این کتابخانه , مثال کاربردی رو در زمینه ضبط صوت از طریق میکروفون انجام خواهیم داد
ابتدا کتابخانه NAudio و کلاس های مربوط به Wav را فراخوانی کنید
using NAudio;
using NAudio.Wave;
در قدم اول متغییر source را تعریف می کنیم
public WaveIn waveSource = null;
این متغییر تمامی اعمال مربوط به پخش و مدیریت صدا را انجام خواهد داد .
در مرحله بعد برای ذخیره در فایل باید متغییر stream متناسب با این را نیز تعریف کنیم . در اینجا کلاس ذخیره در فایل با نام WaveFileWriter شناخته می شود .
public WaveFileWriter waveFile = null;
این متغییر مسئول نگه داری فایل صوتی ما می باشد
پس از این کار اکنون نوبت به ان رسیده که عملکرد کلید شروع ضبط صدا را برنامه ریزی کنیم .
برای این کار در قسمت کد های مربوط به این کلید :
ابتدا :
waveSource = new WaveIn();
و سپس
waveSource.WaveFormat = new WaveFormat(14400, 1);
در اینجا مقدار اول waveFormat مربوط به مقدار بیت ریت صدا بوده و مقدار دومی نیز مربوط به کانال
Naudio برای دسترسی به مقادیر از سیستم EventHandler استفاده می کند بنابراین برای دریافت اطلاعت و حتی برای متوقف کردن فرایند دریافت اطلاعات یا همان متوقف کردن فرایند ضبط صدا از handler های زیر استفاده کنید
waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
قبل از اینکه کلاس های مربوط به این handler ها را برنامه ریزی کنیم ابتدا مقادیر زیر را به ادامه کدهای قبلی اضافه کنید
waveFile = new WaveFileWriter(@"C:\Temp\Test0001.wav", waveSource.WaveFormat);
مقدار فوق مکان ذخیره سازی و فرمت ذخیره سازی فایل
waveSource.StartRecording();
این کد نیز شروع فرایند ضبط صدا را اعلام می کند . پس ما بعد از فشردن کلیک ضبط صدا را شروع خواهیم کرد
همچنین به وسیله این دستور
waveSource.StopRecording();
متوقف کردن این فرایند را اعلام می کنیم
Handler مربوط به متوقف کردن ضبط صدا :
void waveSource_RecordingStopped(object sender, StoppedEventArgs e)
{
if (waveSource != null)
{
waveSource.Dispose();
waveSource = null;
}
if (waveFile != null)
{
waveFile.Dispose();
waveFile = null;
}
}
نکته کلیدی این بخش این است که زمانی که فرایند ضبط صدا تمامی شد تمامی stream ها و به قولی نگه دارنده ها باید خالی شده و یا null شود . بنابراین به وسیله دستور Dispose این کار را انجام خواهیم داد یعنی تمامی بافرهای موجود در متغییر را خالی می کنیم .
Handler مربوط به ضبط صدا
void waveSource_DataAvailable(object sender, WaveInEventArgs e)
{
if (waveFile != null)
{
waveFile.Write(e.Buffer, 0, e.BytesRecorded);
waveFile.Flush();
}
}
تنها نکته این بخش فقط فرایند BinaryWriter که به وسیله waveFile در بافر دریافتی انجام خواهد شد . این بافر دریافتی نیز به وسیله WaveInEventArg وارد این متد خواهد شد
اکنون می توانید با اجرا کردن پروژه نتیجه را به خوبی مشاهده کنید
پایان بخش اول
در همین محتوا در این تاپیک یکی از روش های انجام این کار رو بررسی می کنیم که به نظر خیلی بهتر از روش های دیگه برای ارسال و دریافت صوت از طریق سوکته
سه بخش تشکیل دهنده این تاپیک عبارتند از :
- اشنایی با کتابخانه NAudio و انجام پروژه دریافت صوت از طریق میکروفون
- اماده سازی محیط ارسال و دریافت سوکت (اماده سازی برنامه های کلاینت و سرور)
- ارسال صوت و پخش ان پس از دریافت در سمت کلاینت
بخش اول :
از بین کامپوننت های مربوط به کار با صدا , NAudio یکی از محبوب ترین اونها به شمار میره . از اونجایی که این کامپوننت با در اختیار قرار دادن امکانات مختلف در زمینه کار با صدا می تونه بسیاری از نیازهای مربوط به این بخش رو برای سازنده گان برطرف کنه فکر می کنم مزیت اون رو نسبت به دیگر پلاگین ها نشون میده
برای دریافت این کتابخانه می تونید به ادرس زیر مراجعه کنید :
https://naudio.codeplex.com (https://naudio.codeplex.com/)
برای اشنایی با این کتابخانه , مثال کاربردی رو در زمینه ضبط صوت از طریق میکروفون انجام خواهیم داد
ابتدا کتابخانه NAudio و کلاس های مربوط به Wav را فراخوانی کنید
using NAudio;
using NAudio.Wave;
در قدم اول متغییر source را تعریف می کنیم
public WaveIn waveSource = null;
این متغییر تمامی اعمال مربوط به پخش و مدیریت صدا را انجام خواهد داد .
در مرحله بعد برای ذخیره در فایل باید متغییر stream متناسب با این را نیز تعریف کنیم . در اینجا کلاس ذخیره در فایل با نام WaveFileWriter شناخته می شود .
public WaveFileWriter waveFile = null;
این متغییر مسئول نگه داری فایل صوتی ما می باشد
پس از این کار اکنون نوبت به ان رسیده که عملکرد کلید شروع ضبط صدا را برنامه ریزی کنیم .
برای این کار در قسمت کد های مربوط به این کلید :
ابتدا :
waveSource = new WaveIn();
و سپس
waveSource.WaveFormat = new WaveFormat(14400, 1);
در اینجا مقدار اول waveFormat مربوط به مقدار بیت ریت صدا بوده و مقدار دومی نیز مربوط به کانال
Naudio برای دسترسی به مقادیر از سیستم EventHandler استفاده می کند بنابراین برای دریافت اطلاعت و حتی برای متوقف کردن فرایند دریافت اطلاعات یا همان متوقف کردن فرایند ضبط صدا از handler های زیر استفاده کنید
waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
قبل از اینکه کلاس های مربوط به این handler ها را برنامه ریزی کنیم ابتدا مقادیر زیر را به ادامه کدهای قبلی اضافه کنید
waveFile = new WaveFileWriter(@"C:\Temp\Test0001.wav", waveSource.WaveFormat);
مقدار فوق مکان ذخیره سازی و فرمت ذخیره سازی فایل
waveSource.StartRecording();
این کد نیز شروع فرایند ضبط صدا را اعلام می کند . پس ما بعد از فشردن کلیک ضبط صدا را شروع خواهیم کرد
همچنین به وسیله این دستور
waveSource.StopRecording();
متوقف کردن این فرایند را اعلام می کنیم
Handler مربوط به متوقف کردن ضبط صدا :
void waveSource_RecordingStopped(object sender, StoppedEventArgs e)
{
if (waveSource != null)
{
waveSource.Dispose();
waveSource = null;
}
if (waveFile != null)
{
waveFile.Dispose();
waveFile = null;
}
}
نکته کلیدی این بخش این است که زمانی که فرایند ضبط صدا تمامی شد تمامی stream ها و به قولی نگه دارنده ها باید خالی شده و یا null شود . بنابراین به وسیله دستور Dispose این کار را انجام خواهیم داد یعنی تمامی بافرهای موجود در متغییر را خالی می کنیم .
Handler مربوط به ضبط صدا
void waveSource_DataAvailable(object sender, WaveInEventArgs e)
{
if (waveFile != null)
{
waveFile.Write(e.Buffer, 0, e.BytesRecorded);
waveFile.Flush();
}
}
تنها نکته این بخش فقط فرایند BinaryWriter که به وسیله waveFile در بافر دریافتی انجام خواهد شد . این بافر دریافتی نیز به وسیله WaveInEventArg وارد این متد خواهد شد
اکنون می توانید با اجرا کردن پروژه نتیجه را به خوبی مشاهده کنید
پایان بخش اول