PDA

View Full Version : ذخیره یک فایل mp3 از نوع MemoryStream در disk یا پخش آن مستقیم در WindowsMediaPLayer



pouyansaraf
دوشنبه 14 فروردین 1391, 11:27 صبح
با سلام و تبریک سال نو

من یک سری فایل MP3 را در Database ذخیره کرده ام
حال برای خواندنشان اول آن ها را در یک متغیر از نوع MemoryStream ذخیره میکنم
حال دو روش به ذهنم میرسد
اول خواندن مستقیم آنها توسط WindowsMediaPlayer دات نت است که بلد نیستم
دوم ذخیره آن در دیسک و پخش آن توسط دستور زیر است
AxWindowsMediaPlayer1.URL =

در روش دوم مشکل در ذخیره کردن برای بار دوم است که میگوید فایل شما در حال استفاده است و نمیتواند دوباره روی آن فایل موقت ذخیره کند


Dim mem As New MemoryStream
OleDbCommand1.CommandText = "select ItemSound1 from Table13 where ID=" & TextBox1.Text & ""
OleDbConnection1.Open()
Dim voice As Byte() = OleDbCommand1.ExecuteScalar
OleDbConnection1.Close()
mem.Write(voice, 0, voice.Length)
AxWindowsMediaPlayer1.Ctlcontrols.stop()

Dim VoiceTemp As New StreamWriter(Application.StartupPath & "\VT1.mp3", FileMode.CreateNew)
mem.WriteTo(VoiceTemp.BaseStream)
AxWindowsMediaPlayer1.URL = Application.StartupPath & "\VT1.mp3"
VoiceTemp.Close()



این خطا به خاطر استفاده WindowsMediaPlayer از فایل موقت ساخته شده است که قادر به پاک کردن آن برای بار دوم نیست
85074
ممنون میشم راهنماییم کنید

milad.biroonvand
دوشنبه 14 فروردین 1391, 12:53 عصر
سلام تو مستقیما نمی تونی از یور آل استفاده کنی ، باید از هر کامپونتی استفاده کنی ، از خصیصه readmemorystream استفاده کنی

اکثر اشیا این خصوصت رو دارن ، چی پی دی اف ریدر ها ، چه اشیا کار با تصاویر و ...

pouyansaraf
دوشنبه 14 فروردین 1391, 14:54 عصر
AxWindowsMediaPlayer همچین چیزی را ندارد

مشکل اصلی من این است که فایل جدیدی که از دیتا بیس خونده میشه را نمیتواند روی فایل قبلی بریزد
چون فایل صوتی قبلی هنوز دز AxWindowsMediaPlayer هست.
یه مثال بزنم
شما وقتی در حال استفاده از Windows Media Player خود ویندوز هستید میتونید فایل مورد نظر را پاک یا تغییر نام دهید
ولی من نمیتوانم این کار را بکنم
اگر مستقیما نتوانم از حافطه بخوانم مجبورم اول آنرا ذخیره کنم و سپس بخوانم که مشکل عکس که گذاشته ام پیش می آید

milad.biroonvand
دوشنبه 14 فروردین 1391, 16:15 عصر
سلام،این کاری رو که میخوای انجام بدی رو من قبلا انجام دادم،تمام این کارها رو میشه انجام داد ، حالا بزار پیدا بکنم برات می فرستم . حالا دقیق نمی دونم مدیا پلیر اینکارو انجام دادم یا نه ، می تونی از هم یه کامپونت دیگه استفاده کنی .

pouyansaraf
دوشنبه 14 فروردین 1391, 17:24 عصر
دوستان ما که نفهمیدیم چی شد

کسی هست یه کمکی کنه

pouyansaraf
دوشنبه 14 فروردین 1391, 22:38 عصر
یعنی کسی نیست که به ما بگه چجوری میشه یک فایلی رو که تو دیتا بیس ذخیره کرده ایم و از نوع mp3 هست و اون رو به صورت باینری از دیتا بیس خونده ایم و در یک متغیر MemoryStream ریخته ایم رو در کامپوننت WindowsMediaPlayer باز کرد

یعنی اینقدر سخته

milad.biroonvand
سه شنبه 15 فروردین 1391, 00:17 صبح
سلام

این چطوره ؟



Dim bytes = File.ReadAllBytes("C:\WINDOWS\Media\ding.wav") ' as sample Using s As Stream = New MemoryStream(bytes) ' http://msdn.microsoft.com/en-us/library/ms143770%28v=VS.100%29.aspx Dim myPlayer As New System.Media.SoundPlayer(s) myPlayer.Play() End Using



Dim bytes = File.ReadAllBytes("C:\WINDOWS\Media\ding.wav") ' as sample Using s As Stream = New MemoryStream(bytes) ' http://msdn.microsoft.com/en-us/library/ms143770%28v=VS.100%29.aspx Dim myPlayer As New System.Media.SoundPlayer(s) myPlayer.Play() End Using

milad.biroonvand
سه شنبه 15 فروردین 1391, 00:21 صبح
یا از این کد




Public Class MediaPlayer Private soundPlayer As System.Media.SoundPlayer Public Sub New(buffer As Byte()) Dim memoryStream = New MemoryStream(buffer, True) soundPlayer = New System.Media.SoundPlayer(memoryStream) End Sub Public Sub Play() soundPlayer.Play() End Sub Public Sub Play(buffer As Byte()) soundPlayer.Stream.Seek(0, SeekOrigin.Begin) soundPlayer.Stream.Write(buffer, 0, buffer.Length) soundPlayer.Play() End Sub End Class

pouyansaraf
سه شنبه 15 فروردین 1391, 11:42 صبح
با تشکر از پیگیری شما
دوست عزیز فکر کنم نتونستم منظورمو بهتون بگم در متن عنوان هم هست پخش در WindowsMediaPLayer

پخش یک فایل صوتی که به صورت MemoryStream هست در کامپوننت WindowsMediaPLayer
نه SoundPlayer

من اول اون رو به صورت یک فایل موقت ذخیره میکنم و بعد پخشش میکنم
ولی در برای بار دوم میخواد ذخیره کنه نمیتونه روی اون فایل موقت ذخیره کنه . اول باید پاکش کرد
میگه اون فایل در حال استفاده هست

میشه با دستور

AxWindowsMediaPlayer1.URL = ""

ارتباط رو قطع کرد و با

File.Delet("Temp file")


اون رو پاک کرد ولی وقتی تو یه PlayList داره پخش میشه و تکرار هم داره دوباره نیاز به اون فایل هست
به خاطر همون باید مستقیم همون فایل باینری در WindowsMediaPLayer لود بشه

من یاز به تغییر سرعت پخش سیستم دارم بخاطر همون باید با WindowsMediaPLayer پخش کنم وگرنه راحت با دستورات زیر میشه پخش بشه
روش اول:

My.Computer.Audio.Play("C:\recsound.wav", AudioPlayMode.Background)

روش دوم: همونی که شما گفتید

با SoundPlayer

armitakarimi
سه شنبه 15 فروردین 1391, 16:42 عصر
شما می بایست فایل رو kill کنید نه delete ، مشکل شما از اینجا به وجود میاد، درگوگل بدنبال kill کردن یک فایل بگردین مشکلتون حل میشه . موفق باشید

pouyansaraf
سه شنبه 15 فروردین 1391, 21:10 عصر
Dim KillFile As String
KillFile = Path.GetTempPath() & "VT.mp3"
If File.Exists(Path.GetTempPath() & "VT.mp3") Then
If Len(Dir$(KillFile)) > 0 Then
'First remove readonly attribute, if set
SetAttr(KillFile, vbNormal)
'Then delete the file
Kill(KillFile)
End If
End If

نه مشکل کامپوننتWindowsMediaPLayer هست یا اینکه سرعت هارد نسبت به رم پایین
که دیر قطع ارتباط میکنه
مثل اینکه کامپوننتWindowsMediaPLayer از مموری نمیتونه بخونه
ولی چرا رادیو اینترنتی با WindowsMediaPLayer کار میکنه ؟
من کل اینترنت و اونترنت را گشتم پیدا نکردم

آیا میشود کامپوننتWindowsMediaPLayer از متغیر MemoryStream بخونه که از دیتابیس پرشده