我从文件播放mp3/wav来创建推送效果.但是,在基于Atom CPU的平板电脑上,触摸按钮时会有延迟.
我会尝试从内存而不是文件系统播放wav/mp3.任何人都可以提供代码片段或线索吗?
System.Media.SoundPlayer player = new System.Media.SoundPlayer();
player.SoundLocation = System.Windows.Forms.Application.StartupPath + "\\beep-7.wav";
player.Play();
Run Code Online (Sandbox Code Playgroud) 我正在用C#编写一个基本的写作应用程序,我希望程序能够在输入时输出打字机声音.我已经将我的RichTextBox上的KeyPress事件挂钩到一个函数,该函数使用SoundPlayer每次按下一个键时播放一个简短的wav文件,但是我注意到一段时间后我的计算机慢慢爬行并检查我的进程,audiodlg .exe正在使用5 GIGABYTES的RAM.
我正在使用的代码如下:
我将SoundPlayer初始化为程序启动时的全局变量
SoundPlayer sp = new SoundPlayer("typewriter.wav")
Run Code Online (Sandbox Code Playgroud)
然后在KeyPress事件上我只是打电话
sp.Play();
Run Code Online (Sandbox Code Playgroud)
有谁知道导致大量内存使用的原因是什么?该文件不到一秒钟,所以它不应该堵塞太多东西.
我在相对路径和 wav 文件的复制方面遇到了一些问题。我有这个简单的代码,它完美地工作:
SoundPlayer player = new SoundPlayer();
player.SoundLocation = @"C:\Users\Admin\Documents\Visual Studio 2012\Projects\TestProject\TestProject\Data\Sounds\car.wav";
player.Play();
Run Code Online (Sandbox Code Playgroud)
我想以某种方式使用相对路径播放该文件,但我没有成功:
SoundPlayer player = new SoundPlayer();
player.SoundLocation = @"Data\Sounds\car.wav";
player.Play();
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在尝试使用“system.windows.media.mediaplayer”媒体播放器来播放声音文件列表,但是我无法让媒体播放器知道何时播放下一个声音文件。
我正在尝试使用“MediaEnded”事件句柄来确定声音文件何时结束,然后移至下一个声音文件。但我无法正确触发事件句柄,有人可以告诉我哪里出错了吗?这是我正在使用的代码:
Add-Type -AssemblyName presentationCore
$mediaplayer=New-Object system.windows.media.mediaplayer
Register-ObjectEvent -InputObject $mediaplayer -SourceIdentifier media -EventName BufferingStarted -Action {write-host "media stopped"}
$mediaPlayer.Open('C:\Windows\Media\chimes.wav')
$mediaplayer.Play()
sleep 3
$mediaPlayer.Open('C:\Windows\Media\chimes.wav')
$mediaplayer.Play()
Run Code Online (Sandbox Code Playgroud)
我现在只是播放任何声音文件来尝试触发事件句柄。
请帮我 !
我正在 C# 上编写一个控制台应用程序,我想在连续显示文本时播放声音。这就是我所做的:
static SoundPlayer typewriter = new SoundPlayer("typewriter");
static public void print(string str, int delay)
{
Thread skipThread = new Thread(skipText);
typewriter.PlayLooping();
textgap = delay;
foreach (char c in str)
{
Console.Write(c);
if (textgap != 0)
Thread.Sleep(textgap);
}
typewriter.Stop();
}
Run Code Online (Sandbox Code Playgroud)
typewriter.wav导入到我的项目旁边的.cs文件中,我选择了copy always. 当我运行此代码时,开始播放声音时会弹出一个错误,说Please be sure a sound file exists at the specified location.
这里有什么问题?
编辑:根据凯文 J 的回答将我的代码更改为以下内容。
static SoundPlayer typewritter;
public static void Load()
{
Assembly assembly;
assembly = Assembly.GetExecutingAssembly();
typewritter = new …Run Code Online (Sandbox Code Playgroud) 我正在尝试播放特定的声音.但是,我似乎无法访问我在解决方案资源管理器中添加的文件.(我有一个名为"Sounds /"的文件夹,里面有几个.wav-soundeffects)
当我将文件路径硬编码到我的硬盘上的随机固定位置时,它可以正常工作.此外,当我将我的资源放在我的"bin/debug /"文件夹中时,它工作正常(这是我最接近AppDomain.CurrentDomain.BaseDirectory函数的工作相对路径).
在使用我在解决方案资源管理器中添加的文件时,如何使SoundPlayer工作?
我使用以下代码在内存中动态创建频率音调并异步播放音调:
public static void PlayTone(UInt16 frequency, int msDuration, UInt16 volume = 16383)
{
using (var mStrm = new MemoryStream())
{
using (var writer = new BinaryWriter(mStrm))
{
const double tau = 2*Math.PI;
const int formatChunkSize = 16;
const int headerSize = 8;
const short formatType = 1;
const short tracks = 1;
const int samplesPerSecond = 44100;
const short bitsPerSample = 16;
const short frameSize = (short) (tracks*((bitsPerSample + 7)/8));
const int bytesPerSecond = samplesPerSecond*frameSize;
const int waveSize = 4; …Run Code Online (Sandbox Code Playgroud) 我有一个使用声音播放器播放 .wav 文件的应用程序,我查找了它,但找不到更改其播放音量的方法。我正在寻找的是通过独立更改文件的音量程序或有一个滑块来更改 Windows 音量混合器中窗口本身的音量。谢谢!
public void loadSound()
{
sp.Load();
sp.Play();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (BarTimer.Value < BarTimer.Maximum)
{
BarTimer.Value = BarTimer.Value + 1;
}
if(BarTimer.Value==BarTimer.Maximum)
{
loadSound();
timer1.Stop();
BarTimer.Value = BarTimer.Minimum;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在玩一些C#,我正在编写钢琴应用程序.
每当用户点击钢琴音符时,我将声音的位置(.wav)存储到列表中...以下是button1_MouseDown方法中的一些代码.
if (e.Button == MouseButtons.Left)
{
SoundPlayer sp = new SoundPlayer();
string musName = Convert.ToString(mk.pitch);
string loc = @"D:\OneDrive\Year 2 Semester 1\OOP\Notes-Sound files\Notes-Sound files\mapped\" + musName + ".wav";
sp.SoundLocation = loc;
sp.Play();
music.Add(loc);
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望遍历循环以一次性播放所有单击的键.我这样做如下(当用户点击播放按钮时)
int k = 0;
for (k = 1; k < music.Count; k++)
{
SoundPlayer sp = new SoundPlayer();
sp.SoundLocation = music[k];
sp.Play();
}
Run Code Online (Sandbox Code Playgroud)
问题是,每当点击播放按钮时,只播放按下的最后一个音符.但是,当我调试时,不知何故,所有音符都被播放.有任何想法吗?
我正在尝试使用以下方法加载和播放波形文件:
SoundPlayer simpleSound = new SoundPlayer(@"pack://application:,,,/MyAssembly;component/Sounds/10meters.wav");
simpleSound.Play();
Run Code Online (Sandbox Code Playgroud)
没有成功。我得到一个System.NotSupportedException:(见下文。
System.NotSupportedException: The URI prefix is not recognized.
at System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase)
at System.Net.WebRequest.Create(Uri requestUri)
at System.Media.SoundPlayer.LoadSync()
at System.Media.SoundPlayer.LoadAndPlay(Int32 flags)
at System.Media.SoundPlayer.Play()
Run Code Online (Sandbox Code Playgroud)
我查看了谷歌并试图找到解决方案,但没有任何效果。使用直接路径播放文件工作正常
SoundPlayer simpleSound = new SoundPlayer(@"D:\Projects\MyAssembly\Sounds\10meters.wav");
simpleSound.Play();
Run Code Online (Sandbox Code Playgroud)
我还检查了 MyAssembly 内容,资源在那里。难道SoundPlayer不支持包装或有什么我不这样做是否正确?
soundplayer ×10
c# ×9
audio ×3
wav ×2
winforms ×2
.net ×1
asynchronous ×1
console ×1
for-loop ×1
handle ×1
list ×1
memory ×1
memory-leaks ×1
piano ×1
powershell ×1
windows ×1
wpf ×1