从WMP获得任何声音
本文关键字:任何 声音 WMP | 更新日期: 2023-09-27 18:32:15
我已经在我的类构造函数中尝试过这个来测试Windows 媒体播放器播放.exe资源文件夹中文件中的声音(特别是 mp3)。它将文件正确写入临时文件,如果从WMP和VLC中的文件夹启动,文件播放正常。
但是我仍然无法在应用程序中播放声音。
class AudioPlayer
{
private static string _tempFolder;
private static string _filename;
private string _musicPath;
public WindowsMediaPlayer _wmp;
public AudioPlayer()
{
_tempFolder = Path.GetTempPath();
_filename = "Music1.mp3";
_musicPath = Path.Combine(_tempFolder,_filename);
CopyResource(_musicPath, Resources.Music1);
_wmp = new WindowsMediaPlayer();
_wmp.URL = _musicPath;
_wmp.controls.play();
}
private void CopyResource(string resourceName, byte[] file)
{
File.WriteAllBytes(resourceName, file);
}
}
这会是线程问题吗?我认为不会,因为这是创建音频播放器而不是控制台应用程序的形式,因此它不会立即终止。我也没有收到指示播放问题的错误。
我从主程序中线程化了操作和音频播放器,它工作正常。我可以补充一下.Wav 对于文件大小效率非常低,但 WMP 加载.mp3文件的速度太慢。我想这主要与文件压缩有关,不会影响文件大小的速度。最终的解决方案是这样的。
class AudioPlayer
{
private static string _tempFolder;
private static string _filename;
private string _musicPath;
public WindowsMediaPlayer _wmp;
public AudioPlayer()
{
_tempFolder = Path.GetTempPath();
_filename = "Music1.mp3";
_musicPath = Path.Combine(_tempFolder,_filename);
CopyResource(_musicPath, Resources.Music1);
_wmp = new WindowsMediaPlayer();
_wmp.URL = _musicPath;
}
private void CopyResource(string resourceName, byte[] file)
{
File.WriteAllBytes(resourceName, file);
}
public void Play()
{
_wmp.controls.play();
}
public void Stop()
{
_wmp.controls.stop();
}
}
我像这样从程序 Main 中调用它。
_ap = new AudioPlayer();
_audioThread = new Thread(_ap.Play);
_audioThread.Start();
我打电话
_ap.Stop();
_audioThread.Join();
在程序保存和退出方法期间终止它。
使用 WMPLib 需要表单。如果你使用的是控制台应用程序,[STAThread] 和 Application.Run() 应该会修复它。
void playSong()
{
System.Threading.Thread musicThread = new System.Threading.Thread(() =>
{
WMPLib.WindowsMediaPlayer windowsMediaPlayer = new WMPLib.WindowsMediaPlayer();
windowsMediaPlayer.URL = "MySong.mp3";
windowsMediaPlayer.settings.setMode("loop", true); /* Play in a loop. Remove this line if you don't want to play the song in a loop. */
windowsMediaPlayer.controls.play();
System.Windows.Forms.Application.Run();
});
musicThread.IsBackground = true;
musicThread.Start();
Console.WriteLine("The song is playing. Press any key to exit...");
Console.ReadKey();
Environment.Exit(0);
}
[STAThread]
static void Main(string[] args) => new Program().playSong();