如何在 C# 中暂停和恢复音频

Posted

技术标签:

【中文标题】如何在 C# 中暂停和恢复音频【英文标题】:how to pause and resume audio in c# 【发布时间】:2015-08-11 14:27:32 【问题描述】:

我正在开发 wpf 应用程序。我想暂停和恢复音频,但歌曲从头开始播放。

//c# code

System.Media.SoundPlayer sp = new System.Media.SoundPlayer(@"D:\Intro.wav");
private void play_Click(object sender, EventArgs e)  

    sp.Play();
    play_btn.Enabled = false;
    stop_btn.Enabled = true; 


private void stop_Click(object sender, EventArgs e) 

    sp.Stop();
    stop_btn.Enabled = false;
    play_btn.Enabled = true;

【问题讨论】:

被问到before。 但是没有得到满意的回答,所以还需要回答。 @goobering,已回答,但回答根本不被接受(经常发生)。我的评论是说“使用搜索”的一种外交方式。 SoundPlayer API 不支持暂停。您是否尝试过操作 Stream 对象?如果您不能选择使用 MediaElement,请将其添加到问题中。现在问题的格式是重复的,因为链接的问题确实有一个使用不同 API 的答案。 【参考方案1】:

使用System.Windows.Controls.MediaElement 而不是System.Media.SoundPlayer。它有一个Pause 函数。

<Grid> 
    <Grid.RowDefinitions> 
        <RowDefinition Height="320*"/> 
        <RowDefinition Height="50*"/> 
    </Grid.RowDefinitions> 
    <MediaElement x:Name="MediaPlayer" Grid.RowSpan="1" LoadedBehavior="Manual"/> 
    <StackPanel Orientation="Horizontal" Grid.Row="1" HorizontalAlignment="Center"> 
        <Button x:Name="btnPlay" Content="Play" Click="btnPlay_Click" Width="50" Height="25" Margin="5"/> 
        <Button x:Name="btnStop" Content="Stop" Click="btnStop_Click" Width="50" Height="25" Margin="5"/> 
        <Button x:Name="btnMoveBack" Content="Back" Click="btnMoveBack_Click" Width="50" Height="25" Margin="5"/> 
        <Button x:Name="btnMoveForward" Content="Forward" Click="btnMoveForward_Click" Width="50" Height="25" Margin="5"/> 
    </StackPanel> 
</Grid>

private void IsPlaying(bool flag) 
 
    btnPlay.IsEnabled = flag; 
    btnStop.IsEnabled = flag; 
    btnMoveBack.IsEnabled = flag; 
    btnMoveForward.IsEnabled = flag; 
 

private void btnPlay_Click(object sender, RoutedEventArgs e) 
 
    IsPlaying(true); 
    if (btnPlay.Content.ToString() == "Play") 
     
        MediaPlayer.Play(); 
        btnPlay.Content = "Pause"; 
     
    else 
     
        MediaPlayer.Pause(); 
        btnPlay.Content = "Play"; 
     
 

private void btnStop_Click(object sender, RoutedEventArgs e) 
 
    MediaPlayer.Pause(); 
    btnPlay.Content = "Play"; 
    IsPlaying(false); 
    btnPlay.IsEnabled = true; 
 

private void btnMoveBack_Click(object sender, RoutedEventArgs e) 
 
    MediaPlayer.Position -= TimeSpan.FromSeconds(10); 
 

private void btnMoveForward_Click(object sender, RoutedEventArgs e) 
 
    MediaPlayer.Position += TimeSpan.FromSeconds(10); 

【讨论】:

代码更可能取自here。【参考方案2】:

Soundplayer 不支持暂停和恢复。您可以改用 WPF MediaElement。

如果您必须使用 Soundplayer,您可以每秒使用静音歌曲启动一个新线程。之后,您必须在暂停方法中将响亮的静音。在 Resume Method 中,您必须检查哪个线程处于最佳时间。

但我认为这将是最可怕的解决方案。

干杯

【讨论】:

那将是一个可怕的解决方案。如果音轨是 10 分钟长,你最终会得到 36000 个线程!

以上是关于如何在 C# 中暂停和恢复音频的主要内容,如果未能解决你的问题,请参考以下文章

如何使用暂停和恢复创建 ProgressDialog

当另一个应用开始播放音频时,如何自动暂停我的应用中的音频播放器?

UnityWwise具体某一音频的暂停恢复和终止播放

如何在谷歌圣诞老人跟踪器等背景中添加音频

在 C# 中暂停/恢复线程

如何在 WKWebview 中添加观察者以播放和暂停音频文件的操作?