PDA

View Full Version : چه طور میشه دو فایل صوتی رو با هم اجرا کرد و....



mrtzxxx
پنج شنبه 14 فروردین 1393, 22:13 عصر
با سلام به اساتید . من میخوام دو فایل صوتی رو با هم پخش کنم با زمانهای متفاوت . و میخوام وقتی هر کدوم که تموم شد یه آهنگ دیگه رو پخش کنه . به نظرتون چطور میشه اینکارو کرد ؟؟
(میدونم که برای وقتی که بفهمیم یک آهنگ کی متوقف شده از تابع onCompletion استفاده میکنیم ولی برای دو تا آهنگ چی کار کنیم؟ چون این تابع فقط از یکی از پلیر ها آرگومان میگیره)

shahin bahari
جمعه 15 فروردین 1393, 00:29 صبح
سلام
برای هر کدوم از پلیر ها جداگانه callBack تعریف کنید مشکلتون حل میشه.
MediaPlayer mp1,mp2;
mp1.setOnCompletionListener(new OnCompletionListener() {

@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub

}
});
mp2.setOnCompletionListener(new OnCompletionListener() {

@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub

}
});
اگه صدا ها کوتاه هست ومثل صدا هایی که توی بازی ها هست (مثلا صدای موزیک و متن و ماشین و.... که همزمان پخش میشن) بهتره از soundPool استفاده کنید.

mrtzxxx
جمعه 15 فروردین 1393, 01:48 صبح
سلام

اگه صدا ها کوتاه هست ومثل صدا هایی که توی بازی ها هست (مثلا صدای موزیک و متن و ماشین و.... که همزمان پخش میشن) بهتره از soundPool استفاده کنید.

راجب به soundpool نشنیدم میشه یکم توضیح بدین یا نمونه ای برام بزارین . چون موزیکها همه کوتاهه و میخوان سرعت برنامه بالا باشه تا بینشون وقفه ای پیش نیاد. ممنون

mrtzxxx
جمعه 15 فروردین 1393, 13:24 عصر
سلام
برای هر کدوم از پلیر ها جداگانه callBack تعریف کنید مشکلتون حل میشه.
MediaPlayer mp1,mp2;
mp1.setOnCompletionListener(new OnCompletionListener() {

@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub

}
});
mp2.setOnCompletionListener(new OnCompletionListener() {

@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub

}
});
اگه صدا ها کوتاه هست ومثل صدا هایی که توی بازی ها هست (مثلا صدای موزیک و متن و ماشین و.... که همزمان پخش میشن) بهتره از soundPool استفاده کنید.


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

abbasalim
جمعه 15 فروردین 1393, 14:15 عصر
راجب به soundpool نشنیدم میشه یکم توضیح بدین یا نمونه ای برام بزارین . چون موزیکها همه کوتاهه و میخوان سرعت برنامه بالا باشه تا بینشون وقفه ای پیش نیاد. ممنون

http://www.edumobile.org/android/android-programming-tutorials/sound-pool-example-in-android-development/

shahin bahari
جمعه 15 فروردین 1393, 18:06 عصر
من این کدو تو برنامه گذاشتم ولی عمل نمیکنه وقتی آهنگ تموم میشه دیگه نمیره به آهنگ بعدی .
خوب توی event تموم شدن نوشتید که mp رو دوباره با یه آهنگ جدید بار گزاری کنه. آماده کنه و شروع به پخش کنه؟! اگر هر 3 این ها رو نوشته باشید باشید باید کار کنه.اگر نکرد کد رو بزارید یه نگاه بندازم.


راجب به soundpool نشنیدم میشه یکم توضیح بدین یا نمونه ای برام بزارین . چون موزیکها همه کوتاهه و میخوان سرعت برنامه بالا باشه تا بینشون وقفه ای پیش نیاد. ممنون
بیشتر کاربردش تو جاهایی هست که همزمان چند صدا باهم پخش میشه مثلا بازی که موزیک متن داره پخش میشه, کاراکتر بازی وسطش حرف میزنه یا یه صدای انفجار با این صدا ها پخش میشه. فلسفه ایجاد این کلاس هندل کردن این حالت هاست.
میتونید براش محدودیت تعریف کنید که مثلا 2 تا صدا فقط همزمان پخش بشه. حالا اگه بیشتر صدا بهش بدیم یه حالت صف به وجود میاره. خود من تاحالا این کلاس به کارم نیومده که مثال بزارم براش ولی این لینک ها مثال دارند.
http://java.dzone.com/articles/playing-sounds-android
http://www.vogella.com/tutorials/AndroidMedia/article.html

mrtzxxx
جمعه 15 فروردین 1393, 19:11 عصر
ممنون بابت توضیحات کد رو میزارم.

mrtzxxx
جمعه 15 فروردین 1393, 19:19 عصر
خوب توی event تموم شدن نوشتید که mp رو دوباره با یه آهنگ جدید بار گزاری کنه. آماده کنه و شروع به پخش کنه؟! اگر هر 3 این ها رو نوشته باشید باشید باید کار کنه.اگر نکرد کد رو بزارید یه نگاه بندازم.




public class MainActivity extends Activity{
int[] tracks = new int[2];
int[] tracks1 = new int[2];
int currentTrack = 0,currentTrack1 = 0,ii=0,pp=0;
private MediaPlayer mediaPlayer,mediaPlayer1;
Button start;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

start=(Button) findViewById(R.id.start);

tracks[0] = R.raw.nce1;
tracks1[1] = R.raw.nce2;
tracks[0] = R.raw.nce3;
tracks1[1] = R.raw.nce4;

mediaPlayer = MediaPlayer.create(getApplicationContext(), tracks[currentTrack]);
mediaPlayer1 = MediaPlayer.create(getApplicationContext(), tracks1[currentTrack1]);

start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
start();
}
});

mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
currentTrack++;
if (currentTrack < tracks.length) {
mp= MediaPlayer.create(getApplicationContext(), tracks[currentTrack]);
mp.start();

}
}
});

mediaPlayer1.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub

currentTrack1++;
if (currentTrack1 < tracks1.length) {
mp= MediaPlayer1.create(getApplicationContext(), tracks[currentTrack1]);
mp.start();
}
}
});

}
private void start() {
// TODO Auto-generated method stub
currentTrack = 0;
mediaPlayer = MediaPlayer.create(getApplicationContext(), tracks[currentTrack]);
//mediaPlayer.setOnCompletionListener(this);
mediaPlayer1 = MediaPlayer.create(getApplicationContext(), tracks[currentTrack1]);
mediaPlayer.start();
mediaPlayer1.start();

}
}

shahin bahari
جمعه 15 فروردین 1393, 20:52 عصر
به جای استفاده از mp از mediaplayer و mediaplayer1 استفاده کنید.
یه فرق دیگه هم که به چشمم اومد ( البته نمی دونم مهم هست یا نه. من این روش رو امتحان نکردم) وقتی موزیک تموم میشد mp.stop و بعد mp.reset رو هم صدا می کردم و بعد mp.setDataSource و mp.prepare .بعد از همه این ها استارت رو صدا میکردم. البته منظورم از mp همون mediaPlayer هست که خودم تعریف کردم نه اون که event بر میگردونه......