【问题标题】:how to pause and resume audio in c#如何在 C# 中暂停和恢复音频
【发布时间】:2023-04-07 22:40:02
【问题描述】:

我正在开发 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 的答案。

标签: c# .net wpf audio


【解决方案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 个线程!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2012-08-26
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2012-07-24
相关资源
最近更新 更多