-
Sounds
سلام
من یک ارایه بایتی دارم که حاوی اطلاعات زیادی sound می باشد
چیزی حدود 10 یا 11 مگ
می خوام این آرایه بایتی و رو پخش کنم....
ارایه ها بر مبنای سیستم صوت mp3 ذخیره شده اند...
چجوری می شه این ارایه بایتی رو پخش کرد...؟؟؟
با
کد:
my.computer.audio.play(x.data)
هر کار می کنم اطلاعات حاوی ارایه های بایتی رو نمی خونه ولی همین که اون ها رو در قالب یک فایل باز می کنم و در فایلی به صورت باینری می ریزم...
fileput(1,x.dada)
بعد میرم سراغ فایله می بینم فایل به درستی ضبط شده و روش که کلیک می کنم برام فایل و پخش می کنه
به نظرتون چجوری باید فایل های mp3 رو با دات نت ، پخش کنم....
بدون استفاده از مدیا پلیر.....
-
من معمولا برای کارهای صوتی خودم از Naudio استفاده می کنم. حتی تبدیل پسوند نیز با آن انجام داده ام. ضبط و پخش صدا و...
بارها با استفاده از NAudio یک فایل mp3 را به wav تبدیل کرده ام تا بتوانم بایت های آن را بخوانم و به عبارتی با آن بازی کنم !!!!!!!!
من Naudio را فوق العاده کاربردی در زمینه های صوتی می دانم.
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
موفق باشید.
-
سلام
داداش این لینکی که دادی برای من باز نمی کنه یعنی مشکل داره:(
می شه من و با naudio اشنا کنی؟؟؟؟
چجوری باید ازش استفاده کنم؟؟؟
همراه با ذکر چند مثال
با تشکر
-
فضای نام های مورد نیاز:
کد:
using NAudio.Wave;
using NAudio;
پخش صدا:
برای پخش و قطع صوت می توانید از چنین کدی استفاده کنید:
کد:
WaveOut outD = new WaveOut();
WaveStream mp3Reader;
//Play
private void button1_Click(object sender, EventArgs e)
{
mp3Reader = new Mp3FileReader("I:\\0.mp3");
WaveChannel32 inputStream = new WaveChannel32(mp3Reader);
outD.Init(mp3Reader);
outD.Play();
}
//Stop
private void button2_Click(object sender, EventArgs e)
{
outD.Dispose();
mp3Reader.Dispose();
}
اگر کلاس MP3FileReader را به کلاسی مثلا WMAFileReader تبدیل کنید و یا WAVEFileReader تبدیل کنید می توانید این دو پسند را نیز پخش کنید.
در توضیحات کد نیز باید این طور بررسی کرد:
1- ابتدا کلاس MP3FileReader را به فایل مورد نظر متصل می کنیم. این کار مانند اتصال StreamReader به یک فایل متنی است.
2- با استفاده از WavChannel32 اطلاعات فایل را تبدیل به Wav 32bit می کنیم. چرا؟ چون کارت صدا فقط ساختار Wav را می شناسد. (در این باره می توانید درباره مدولاسیون PCM صوتی و مبدل های D/A مطالعه کنید.)
3- با استفاده از WavOut یک کانال صوتی برای پخش این Wav در اختیار می گیریم. که می تواند اطلاعات WavChannel را پخش کند.
4- برای STOP کردن ابتدا باید خروجی کانال صوتی که از سیستم عامل گرفته شده است آزاد کرد. یعنی STOP نیست. چرا که STOP تنها توقف خواندن از فایل و پخش است و ما نیاز داریم تا کل کانال گرفته شده آزاد شود. پس Dispose می کنیم.
5- در نهایت فایل خود را نیز که به صورت یک منبع تعریف شده است را نیز Dispose کرده تا کاربری آن آزاد شود.
تبدیل به بایت wav یا همان بایت های PCM:
کد:
public static byte[] ConvertWaveToByte(string sADR, int sampleRate, bool channel)
{
NAudio.Wave.WaveStream wavW;
string fileType = sADR.ToLower();
if (fileType.EndsWith(".wav") || fileType.EndsWith(".wave"))
wavW = new NAudio.Wave.WaveFileReader(sADR);
else if (fileType.EndsWith(".mp3"))
wavW = new NAudio.Wave.Mp3FileReader(sADR);
else if (fileType.EndsWith(".wma"))
wavW = new NAudio.WindowsMediaFormat.WMAFileReader(sADR);
else
return null;
NAudio.Wave.WaveFormatConversionStream conv = null;
try
{
using (wavW)
{
using (conv = new NAudio.Wave.WaveFormatConversionStream(new NAudio.Wave.WaveFormat(sampleRate, 8, channel ? 2 : 1), wavW))
{
byte[] readedByte = new byte[conv.Length];
conv.Read(readedByte, 0, readedByte.Length);
return readedByte;
}
}
}
catch {
if (wavW != null)
wavW.Dispose();
if(conv!=null)
conv.Dispose();
return null;
}
}
1- در این کد ابتدا بررسی می شود که پسوند فایل ورودی قابل قبول است یا خیر.
2- ConvertionStream برای تبدیل ساختار فایل ها به کار می رود. مثلا تبدیل wave با نرخ نمونه برداری 128K به 8K و یا تبدیل استریو به مونو و یا تبدیل واحد نمونه برداری مثلا از 32بیت به 8 بیت. معکوس هم می شود یعنی افزایشی این مواردی که گفتم. ولی تاثیری در کیفیت ندارد و کلا کار پوچی است! در آرگومان های Constructor های این کلاس این پارامتر ها وارد می شوند.
3- زمانی که instance کلاس ConvertionStream خوانده می شود(Read) عمل تبدیل صورت می گیرد و اینجا بایت های تبدیلی را برمی داریم و برمی گردانیم. به همین راحتی.
نکته: اکثر کلاس های Naudio باید Dispose شوند برای همین باید به این نکته دقت کرد و با استفاده از using و یا وراثت IDisposable برای اجبار وجود Dispose و یا نوشتن Dispose پس از اتمام کار و..... این عمل را انجام داد.
تبدیل بایت به Wav (معکوس بالا، تولید فایلwav)
دو راه وجود دارد (تا اینجایی که من می دانم!):
1- استفاده از خود بایت های تبدیلی. یعنی خروجی کلاسی مثل ConvertionStream . در واقع وراثت IWaveProvider را داشته باشد.
2- استفاده از آرایه ی بایتی.
در راه اول:
کد:
NAudio.Wave.WaveFileWriter.CreateWaveFile(dADR, conv);
dADR آدرس مقصد است. و conv نمونه کلاس ConvertionStream .
در راه دوم شیوه کاملا مشابه ساخت یک فایل متنی است با این تفاوت که کلاس مورد استفاده به جای مثلا StreamWriter کلاس WafeFileWriter است:
ابتدا format فایل خود را تعیین می کنیم، مثلا:
کد:
NAudio.Wave.WaveFileWriter wfr = new NAudio.Wave.WaveFileWriter(dADR, new NAudio.Wave.WaveFormat(sampleRate, 8, channel ? 2 : 1));
سپس بایت های خود را درونش می نویسیم و فایل را می بندیم. کاملا مشابه یک فایل متنی کد می نویسیم.
کد:
wfr.Write(readedByte, 0, readedByte.Length);
wfr.Close();
موفق باشید.