PDA

View Full Version : سوالی در مورد پخش اهنگ با اجرای فرم



c#1200
یک شنبه 22 دی 1392, 17:33 عصر
سلام به اساتید.
ببخشید یک سوال داشتم:
من یه فرم دارم که یه دکمه گذاشتم با زدن اون اهنگی از ادرس اصلی فایل برنامه Debugپخش میشه حالا سوال من اینجاست:
اول اینکه اگر من فایل exe این برنامه رو روی سیستم دیگه ای اجرا کنم چون ادرس نداره اهنگ playنمیشه !!!
من برنامه های exe دیدم که با اجرای اونا اهنگ شروع به پخش میکنه این از کجا اهنگو میاره برای پخش؟فقط یه فایل exe بیشتر نیست!!
اگر روشی داره که به این صورت باشه بگین من حدس میزنم که فایل موسیقی رو یه جایی تو سیستم ذخیره میکنه و بعد اونو فراخوانی میکنه...درسته؟ولی چطور موسیقی رو تو خود exe کجا ذخیره میکنه و...
لطفا روشش رو بگید؟

وسوال دوم کد من اینه که تو رویداد کلیک یه برنامه گذاشتمش:

SoundPlayer player = new SoundPlayer("13702973932.wav");
player.Play();
حالا من میخوام با یه شرط if طوری بشه که اگر اهنگ پخش میشد با کلیک رو دکمه متوقف بشه یعنی stop اگر پخش نمیشه play بشه میشه کدشو بگید...

لطفا راهنمایی کنید تشکر فراوان

sagggad
یک شنبه 22 دی 1392, 17:51 عصر
با عرض سلام
برای سوال اولتون
برای این کار تنها کافی است فایل صوتی را در پوشه ی Bin>>Debug کپی کنید و سپس با دستور زیر اجرا نمایید:

SoundPlayer player = new SoundPlayer(".\\نام فایل صوتی.wav");
player.Play();

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

".\\نام فایل صوتی.wav"
با قرار دادن یک نقطه و پس از آن دو علامت بک اسلش خودبه خود برنامه به پوشه ی Bin>>Debug هدایت میشود
برای سوال دومتون هم من با منترل مدیاپلیر این کار رو بلد هستم اما این طوریش رو نمیدونم
موفق باشید:لبخندساده:

khokhan
یک شنبه 22 دی 1392, 17:56 عصر
اگر روشی داره که به این صورت باشه بگین من حدس میزنم که فایل موسیقی رو یه جایی تو سیستم ذخیره میکنه و بعد اونو فراخوانی میکنه...درسته؟ولی چطور موسیقی رو تو خود exe کجا ذخیره میکنه و...
لطفا روشش رو بگید؟
فایل رو توی resource پروژه قرار می دی و یه کلاس با این مقادیرایجاد می کنی:

using System;
using System.Runtime.InteropServices;
using System.Resources;
using System.IO;
namespace Win32
{
public class Winmm
{
public const UInt32 SND_ASYNC = 1;
public const UInt32 SND_MEMORY = 4;

[DllImport("Winmm.dll")]
public static extern bool PlaySound(byte[] data, IntPtr hMod, UInt32 dwFlags);
public Winmm()
{
}
public static void PlayWavResource(string wav)
{

string strNameSpace=
System.Reflection.Assembly.GetExecutingAssembly(). GetName().Name.ToString();


Stream str =
System.Reflection.Assembly.GetExecutingAssembly(). GetManifestResourceStream( strNameSpace +"."+ wav );
if ( str == null )
return;

byte[] bStr = new Byte[str.Length];
str.Read(bStr, 0, (int)str.Length);

PlaySound(bStr, IntPtr.Zero, SND_ASYNC | SND_MEMORY);
}
}
}
بعد در رویداد کلیک باتن فایل رو فراخوانی می کنی :

private void button2_Click(object sender, System.EventArgs e)
{
Win32.Winmm.PlayWavResource("chimes.wav");
}

sagggad
یک شنبه 22 دی 1392, 17:57 عصر
فایل رو توی resource پروژه قرار می دی و یه کلاس با این مقادیرایجاد می کنی:

using System;
using System.Runtime.InteropServices;
using System.Resources;
using System.IO;
namespace Win32
{
public class Winmm
{
public const UInt32 SND_ASYNC = 1;
public const UInt32 SND_MEMORY = 4;

[DllImport("Winmm.dll")]
public static extern bool PlaySound(byte[] data, IntPtr hMod, UInt32 dwFlags);
public Winmm()
{
}
public static void PlayWavResource(string wav)
{

string strNameSpace=
System.Reflection.Assembly.GetExecutingAssembly(). GetName().Name.ToString();


Stream str =
System.Reflection.Assembly.GetExecutingAssembly(). GetManifestResourceStream( strNameSpace +"."+ wav );
if ( str == null )
return;

byte[] bStr = new Byte[str.Length];
str.Read(bStr, 0, (int)str.Length);

PlaySound(bStr, IntPtr.Zero, SND_ASYNC | SND_MEMORY);
}
}
}
بعد در رویداد کلیک باتن فایل رو فراخوانی می کنی :

private void button2_Click(object sender, System.EventArgs e)
{
Win32.Winmm.PlayWavResource("chimes.wav");
}
جناب khokhan (http://barnamenevis.org/member.php?131732-khokhan) فکر نمیکنید کدی که من دادم آسون تر باشه؟؟
البته قصد جسارت ندارم ولی اون هم همینکار رو میکنه...

khokhan
یک شنبه 22 دی 1392, 18:01 عصر
جناب khokhan (http://barnamenevis.org/member.php?131732-khokhan) فکر نمیکنید کدی که من دادم آسون تر باشه؟؟
البته قصد جسارت ندارم ولی اون هم همینکار رو میکنه...
اگه دقت کرده باشین این دوستتون قصد دارند فایل صوتی ضمیمه فایل اجرایی باشه به قول نامسلمونای اون ور آب embedded بشه:لبخند:

sagggad
یک شنبه 22 دی 1392, 18:02 عصر
آها یعنی میخواد اون فایل دیده نشه؟؟
خوب این کار چه دلیلی داره؟؟

khokhan
یک شنبه 22 دی 1392, 18:05 عصر
آها یعنی میخواد اون فایل دیده نشه؟؟
خوب این کار چه دلیلی داره؟؟
یه جور حمایت از قانون کپی رایت و مبارزه با سودجویان می باشد:چشمک:

sagggad
یک شنبه 22 دی 1392, 18:07 عصر
آو مای گاد...
حالا برا یک فایل صوتی؟؟
یعنی راه دیگه ای جز یکی شدن با فایل exe نداره؟؟
نکنه قضیه سیاسیه؟؟:گیج:

m.ghorbani2000
یک شنبه 22 دی 1392, 18:08 عصر
با سلام
در مورد سوال دومت باید بگم که تو میتونی یه Label بزاری که اگر کلیک شد متنش بشه Play و از کد زیر استفاده کنی
SoundPlayer player = new SoundPlayer("c:\\sound.wav");
private void Play_Click(object sender, EventArgs e)
{

player.Play();
label1.Text = "Play";

}

private void Stop_Click(object sender, EventArgs e)
{
if (label1.Text == "Play")
{
player.Stop();
label1.Text = "Stop";
}
else
{
player.Play();
label1.Text = "Play";
}
}

c#1200
یک شنبه 22 دی 1392, 18:15 عصر
فایل رو توی resource پروژه قرار می دی و یه کلاس با این مقادیرایجاد می کنی:

using System;
using System.Runtime.InteropServices;
using System.Resources;
using System.IO;
namespace Win32
{
public class Winmm
{
public const UInt32 SND_ASYNC = 1;
public const UInt32 SND_MEMORY = 4;

[DllImport("Winmm.dll")]
public static extern bool PlaySound(byte[] data, IntPtr hMod, UInt32 dwFlags);
public Winmm()
{
}
public static void PlayWavResource(string wav)
{

string strNameSpace=
System.Reflection.Assembly.GetExecutingAssembly(). GetName().Name.ToString();


Stream str =
System.Reflection.Assembly.GetExecutingAssembly(). GetManifestResourceStream( strNameSpace +"."+ wav );
if ( str == null )
return;

byte[] bStr = new Byte[str.Length];
str.Read(bStr, 0, (int)str.Length);

PlaySound(bStr, IntPtr.Zero, SND_ASYNC | SND_MEMORY);
}
}
}
بعد در رویداد کلیک باتن فایل رو فراخوانی می کنی :

private void button2_Click(object sender, System.EventArgs e)
{
Win32.Winmm.PlayWavResource("chimes.wav");
}

داداش اینه کلاسش دیگه درسته؟


public class Winmm
{
public const UInt32 SND_ASYNC = 1;
public const UInt32 SND_MEMORY = 4;

[DllImport("Winmm.dll")]
public static extern bool PlaySound(byte[] data, IntPtr hMod, UInt32 dwFlags);
public Winmm()
{
}
public static void PlayWavResource(string wav)
{
string strNameSpace=System.Reflection.Assembly.GetExecuti ngAssembly(). GetName().Name.ToString();
Stream str =System.Reflection.Assembly.GetExecutingAssembly() . GetManifestResourceStream( strNameSpace +"."+ wav );
if ( str == null )
return;
byte[] bStr = new Byte[str.Length];
str.Read(bStr, 0, (int)str.Length);
PlaySound(bStr, IntPtr.Zero, SND_ASYNC | SND_MEMORY);
}
}

به این قسمت از کد گیر میده:
[DllImport("Winmm.dll")]
و همچنین به Stream

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

c#1200
یک شنبه 22 دی 1392, 18:17 عصر
با سلام
در مورد سوال دومت باید بگم که تو میتونی یه Label بزاری که اگر کلیک شد متنش بشه Play و از کد زیر استفاده کنی
SoundPlayer player = new SoundPlayer("c:\\sound.wav");
private void Play_Click(object sender, EventArgs e)
{

player.Play();
label1.Text = "Play";

}

private void Stop_Click(object sender, EventArgs e)
{
if (label1.Text == "Play")
{
player.Stop();
label1.Text = "Stop";
}
else
{
player.Play();
label1.Text = "Play";
}
}

ممنون این که اره میشه شرط روی چیز دیگه منظورم اینه که با خود player شرط باشه وگرنه رو تصویر خود دکمه هم میشه شرط قرار داد مچکر...

sagggad
یک شنبه 22 دی 1392, 18:24 عصر
در مورد مخفی بودن اهنگ هم اصلا قضیه این چیزا نیست:لبخند:
مشکل اینه اگر از روش اول برم برنامه رو یه کامپیوتر دیگه اجرا بشه دیگه اون اهنگ روی اون ادرس نیست و پخش نمیشه...
یعنی چی؟؟
شما دقیقا میخوای برای موسیقی چه کار کنی؟؟
ببین اگه میتونی فایل رو کنار برنامه در پوشه ی Debug قرار بدی که با اون کد من در هرکامپیوتری اجرا میشه...

khokhan
یک شنبه 22 دی 1392, 18:25 عصر
به این قسمت از کد گیر میده:
اینو امتحان کن :

private void button1_Click(object sender, EventArgs e)
{
SoundPlayer player = new SoundPlayer();
Stream audioStream = new MemoryStream(Properties.Resources.yourSoundfile);

player = new SoundPlayer(audioStream);

player.Play();
}
این هم برای دکمه play

private void Button1_Click(object sender, System.EventArgs e)
{
if (Timer1.Enabled == false)
{
Counter = 0;
Timer1.Enabled = true;
Button1.Text = "Stop";
}
else
{
Timer1.Enabled = false;
Button1.Text = "Start";
}
}

c#1200
یک شنبه 22 دی 1392, 18:35 عصر
آهاااااااااااااااااان sagggad داداش تازه گرفتم چی شد مشکل من هم همین بود هیچ حواسم به اون دوتا بک اسلش نبود اوکی شد دمت گرم............
khokhan عزیز از تو هم کمال تشکر رو دارم واقعا مچکر از کمکت.........
دوستان میتونید اینجا هم یه کمکی کنید:کلیک (http://barnamenevis.org/showthread.php?436278-%D8%B3%D9%88%D8%A7%D9%84-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-%D9%81%D8%B1%D8%A7%D8%AE%D9%88%D8%A7%D9%86%DB%8C-%D9%81%D8%A7%DB%8C%D9%84-%D8%AF%D8%B1-sal&p=1952160&viewfull=1#post1952160)
تشکر این مشکل حل شد

armeshi
شنبه 13 آذر 1395, 17:07 عصر
سلام
مدیا پلیری که تو برنامم میاد فقط دکمه های پخش و استپ داره
چطور میتونم دکمه های " پخش چرخه ای یا دوباره " و " پخش ادامه دار" براش بذارم؟
یا اصلا مدیاپلیر پیشرفته تری نمیشه گذاشت؟

143661