ورود

View Full Version : socket programming + voice chat



m2m_123
پنج شنبه 20 شهریور 1393, 16:59 عصر
سلااااااااااااااممممممممم مم
چرا اینجا کسی جواب نمیده؟؟:ناراحت::ناراحت::نار حت::ناراحت::ناراحت::ناراحت:: اراحت::ناراحت:

دوستان من میخوام به برنامه چت بنویسم که قابلیت چت صوتی و اگه بشه تصویری داشته باشه.
میشه اگه کسی از دوستان وارده کمک کنه؟ یا اگه کسی فیلم یا فایل آموزشی داره بذاره لطفا؟

تو رو خدا جوااااااااااببببببببببببب بب بدییییددد
:گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه:

ahmad.mo74
یک شنبه 23 شهریور 1393, 20:52 عصر
سلام، کار سختی نیست...
شما اول باید مشخص کنی میخوای تماس صوتی زنده باشه یا اینکه مثلا کاربر اول صداشو ضبط کنه و بعد بده سرور و سرور هم بده به کاربر مقابل (مثل وایبر مثلا)

اگر میخوای به صورت زنده بفرستی باید از پروتکل UPD استفاده کنی مثلا کلاس DataGramChannel از پروتکل UPD استفاده میکنه (اگر درباره پروتکل های TCP و UPD نمیدونی سرچ کن) به اینصورت که صدارو از سیستم کاربر کپچر میکنی و در عین حال استریم رو به سرور میدی تا اونم به کاربر مقابل بفرسته (با فرض اینکه SocketProgramming بلدی) تا اونم play کنه و اینطوری میشه تماس صوتی رو برقرار کرد... خیلیم راحته اگر خواستی خودم یه نمونه واست مینویسم ولی سعی کن خودت بنویسی

اما اگر میخوای اول ضبط بشه بعد فرستاده بشه با همون Socket یا SocketChannel بفرست ینی اول تو فایل ذخیره میکنی و بعد فایل رو میفرستی و تمام...

برای کپچر کردن صدا از میکروفون سیستم :


import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;


/**
* @author avb
*/
public class SoundRecorder {


private File wavFile = new File("C:\\RecordAudio.wav");
private AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
private TargetDataLine line;


public AudioFormat getAudioFormat() {
return new AudioFormat((float) 16000, 8, 2, true, true);
}


public void start() {
try {
AudioFormat format = getAudioFormat();
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
if (!AudioSystem.isLineSupported(info)) {
System.out.println("Line not supported");
System.exit(0);
}
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
line.start();
System.out.println("Start capturing...");
AudioInputStream ais = new AudioInputStream(line);
System.out.println("Start recording...");
AudioSystem.write(ais, fileType, wavFile /*inja bayad be server bedi stream ro*/);
} catch (LineUnavailableException | IOException ex) {
ex.printStackTrace();
}
}


public void finish() {
line.stop();
line.close();
System.out.println("Finished");
}


public static void main(String[] args) throws IOException {
SoundRecorder recorder = new SoundRecorder();
long recordTime = 30000;
Thread stopper = new Thread(() -> {
try {
Thread.sleep(recordTime);
} catch (InterruptedException ignored) {
}
recorder.finish();
});
stopper.start();
recorder.start();
}


}



برای play کردن صدا :


String source = "C:\\RecordAudio.wav";
InputStream in = new FileInputStream(source);
AudioStream audioStream = new AudioStream(in);
AudioPlayer.player.start(audioStream);


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

اگه بازم سوالی هست در خدمتیم :)

ahmad.mo74
پنج شنبه 27 شهریور 1393, 14:27 عصر
سلام، نه UPD به درد این کار میخوره نه TCP ... باید از (RTSP ( Real-time Streaming Protocol استفاده کنی یعنی همزمان با اینکه صدا ضبط میشه، به طور همزمان صدا فرستاده بشه...
من این برنامه رو با UPD نوشتم الان ولی خب خیلی مطلوب نیست دیگه چون هر 3 4 ثانیه قطع و وصل میشه (بستگی به سایز buffer داره)
ولی کنجکاو شدم با RTSP بنویسمش ببینم چجوری میشه و وقتی تموم شد اینجا قرار میدم :)

ahmad.mo74
پنج شنبه 27 شهریور 1393, 20:17 عصر
خب خدارو شکر درست شد (با همون UPD ولی با یه الگوریتم بهتر) یعنی تماس بدون قطع و وصل برقرار میشه و کیفیت صدا هم خوبه :)
فقط باید روی ui اش یکم دیگه کار کنم و تا یکی دو ساعت دیگه میزارم تو سایت...

ahmad.mo74
جمعه 28 شهریور 1393, 01:24 صبح
VoiceChat (http://bit.ly/1uLjfMu)

اگر خواستید فرمت audio رو تغییر بدید این لینکارو نگاه کنید:

http://en.wikipedia.org/wiki/Sampling_(signal_processing)
http://wiki.audacityteam.org/wiki/Sample_Rates

ahmad.mo74
جمعه 28 شهریور 1393, 20:59 عصر
سلام، برنامه رو آپدیت کردم و دوباره از TCP استفاده کردم و نتیجه خیلی بهتر شد، چون با UPD هر بار بیشتر از 64kb نمیشه دیتا فرستاد مجبور بودم کیفیت صدا رو هم پایین تر بیارم ولی الان با TCP میشه با کیفیت بالاتری تماس برقرار کرد...خلاصه الان خیلی عالی شده

VoiceChat (http://bit.ly/1uLjfMu)

دوباره وقت کردم روش کار میکنم شما هم اگر پیشنهادی برای بهتر شدن برنامه داشتید بگید ، ممنون :)

ahmad.mo74
شنبه 29 شهریور 1393, 14:47 عصر
سلام، برنامه رو آپدیت کردم، فکر میکنم همه باگهاش برطرف شده...شما هم تست کنید اگر مشکلی داشت بگید اگر هم نه که خداروشکر :)

VoiceChat-Final (http://bit.ly/1pmAm1v)

dasssnj
شنبه 29 شهریور 1393, 17:18 عصر
سلام، برنامه رو آپدیت کردم، فکر میکنم همه باگهاش برطرف شده...شما هم تست کنید اگر مشکلی داشت بگید اگر هم نه که خداروشکر :)

VoiceChat-Final (http://bit.ly/1pmAm1v)

ui این برنامه را با چه IDE ساختی ؟

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

ahmad.mo74
شنبه 29 شهریور 1393, 19:53 عصر
ui رو با netbeans

برای پکیج concurrent بهترین توضیحات رو خود اوراکل داده:

http://docs.oracle.com/javase/tutorial/essential/concurrency/

قسمت Executors رو هم ببین.

dasssnj
یک شنبه 30 شهریور 1393, 04:49 صبح
ui رو با netbeans

برای پکیج concurrent بهترین توضیحات رو خود اوراکل داده:

http://docs.oracle.com/javase/tutorial/essential/concurrency/

قسمت Executors رو هم ببین.

خیلی ممنون.

123718


فقط خودت هم یه توضیحی بدی به فارسی بد نیست ! :لبخند::لبخند:

ahmad.mo74
یک شنبه 30 شهریور 1393, 13:54 عصر
سلام، خب من نمیدونم درباره چیش توضیح بدم؟ اسمش روشه دیگه، یه پکیجیه که برای ساختن برنامه هایی که باید مالتی ترد باشن از کلاس هاش استفاده میکنن به جای thread های معمولی... درباره چه قسمتیش توضیح بدم؟ Executor ها؟ ThreadPool؟ ForkJoinPool ؟ یا ...؟

dasssnj
یک شنبه 30 شهریور 1393, 14:07 عصر
سلام، خب من نمیدونم درباره چیش توضیح بدم؟ اسمش روشه دیگه، یه پکیجیه که برای ساختن برنامه هایی که باید مالتی ترد باشن از کلاس هاش استفاده میکنن به جای thread های معمولی... درباره چه قسمتیش توضیح بدم؟ Executor ها؟ ThreadPool؟ ForkJoinPool ؟ یا ...؟

خب فرقشون با ترد چیه ؟

آره هر سه را توضیح بده .:لبخند: (اگه زحمتی نیست)
:قهقهه::قهقهه:

ahmad.mo74
یک شنبه 30 شهریور 1393, 15:05 عصر
ما تو برنامه هامون میتونیم هر وقت بخوایم یه ترد بسازیم و یک تسک خاصی رو توش اجرا کنیم (Runnable) ولی اینطوری هیچ کنترلی روی تردها نداریم و نمیتونیم با اطمینان کامل ازشون استفاده کنیم و زمان اجرا و پایانشونم نمیتونیم به درستی مدیریت کنیم و از همه مهمتر اینکه این تردها پراکنده هستن و دسته بندی نشده هستن اما Executor ها اینکارو به خوبی برای ما انجام میدن یعنی ما هروقت بخوایم یه تسکی رو به اونها میدیم تا اجرا کنن به جای اینکه هر دفعه ترد جدید ایجاد کنیم و این قابلیت رو به ما میدن تا کنترل بیشتری روی تردها داشته باشیم. در واقع Executor ها یه جور کار encapsulation روی تردهامون انجام میدن تا هم بتوتیم اونارو دسته بندی کنیم و هر که وقت لازم بود ترد جدید ایجاد کنیم و یا حذف کنیم.

ThreadPool و ExecutorService هم تقریبا شبیه هم هستن.
وقتی ما از یه ExecutorService استفاده میکنیم در واقع یه مخرنی یا یه استخری از ترد درست کردیم که ظرفیت این مخزن میتونه محدود باشه یعنی مثلا فقط 10 تا ترد بتونن به طور همزمان توش اجرا بشن و یا اینکه برحسب نیازمون باشه یعنی هروقت خواستیم ترد بهش اضافه کنیم و هر وقت خواستیم حذف کنیم.
قابلیت دیگشم اینه که میتونیم اونو shutdown کنیم یعنی از اضافه شدن ترد جدید جلوگیری کنیم و صبر کنیم تا بقیه تردهام کارشون تموم بشه...
یا اینکه shutdownNow کنیم تا هم از اضافه شدن ترد جدید جلوگیری بشه و هم تمام تردهایی که توی اون مخزن درحال اجرا هستن interrupt بشن.
حالا اینو مقایسه کن با زمانی که به شیوه ی قدیمی همینطور ترد جدید ساختیم حالا تعدادشونم رفته بالا مثلا 100 تا، حالا میخوایم همه رو یا بخش خاصیشو از اجرا شدنشون جلوگیری کنیم، چیکار کنیم؟

ForkJoinPool هم یه implement برای ExecutorService هست یا بهتر بگم، ForkJoinPool روی ExecutorService پیاده سازی شده. ExecutorService خودش یه اینترفسه...تو کلاس Executors واسش انواع و اقسام implement هاشو نوشتن و آمادس مثل fixedThreadPool یا cachedThreadPool یا ...
ForkJoinPool به این منظور ساخته شده تا بتونیم از تمام هسته های cpu بیشترین بهره رو ببریم و تا جایی که میشه تسک ها رو به قسمت های کوچیک تر تقسیم کنیم و سرعت اجرا شدنشونو بالا ببریم...

dasssnj
یک شنبه 30 شهریور 1393, 15:58 عصر
خیلی خیلی زیاد ممنون.
شما کتاب effective java را خوندی . درسته ؟

ahmad.mo74
یک شنبه 30 شهریور 1393, 16:49 عصر
خواهش میکنم
نه یادم نیست، فکر نکنم خونده باشم...

febadi
دوشنبه 21 تیر 1395, 12:41 عصر
سلام، برنامه رو آپدیت کردم، فکر میکنم همه باگهاش برطرف شده...شما هم تست کنید اگر مشکلی داشت بگید اگر هم نه که خداروشکر :)

VoiceChat-Final (http://bit.ly/1pmAm1v)
ببخشید من هر کاری میکنم نمیتونم فایل اتچ شده رو دانلو د کنم:ناراحت:میشه کمک کنید:افسرده: