从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);
    }
}

这会是线程问题吗?我认为不会,因为这是创建音频播放器而不是控制台应用程序的形式,因此它不会立即终止。我也没有收到指示播放问题的错误。

从WMP获得任何声音

我从主程序中线程化了操作和音频播放器,它工作正常。我可以补充一下.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();