C# Winform 当音频播放完成后,播放下一个音频,怎么知道音频有没有播放完成

news/2025/2/12 13:04:49/文章来源:https://www.cnblogs.com/vipsoft/p/18711375

程序在预警时,会发出报警音,当报警音频播放时间,超过预警频率时,就会像我们打印文档一样,像打印机发送10次打印任务。当打出第1张纸的时候,这时候想取消打印。就不能在电脑端通过软件操作了。因此为了避免这种事情发生,就只有等打印机打完一张,再发下一个任务。这样的话,可以随时发起取消打印任务。

如果实现在报警音频结束前,不再给任务

SoundPlayer

在C#中,SoundPlayer 类本身没有直接提供事件或属性来检测音频是否播放完成。不过,你可以通过以下方法来实现这一功能:PlaySync 方法会阻塞当前线程,直到音频播放完成。你可以将播放操作放在一个单独的线程中,以避免阻塞主线程。
满足不了我想要的功能

using System;
using System.Media;
using System.Threading;class Program
{static void Main(){string[] audioFiles = { "audio1.wav", "audio2.wav", "audio3.wav" };SoundPlayer player = new SoundPlayer();foreach (string file in audioFiles){//TODO 如果任务取消,break 跳出循环player.SoundLocation = file;player.Load(); // 加载音频文件player.PlaySync(); // 阻塞播放,直到当前音频播放完成Console.WriteLine($"播放完成: {file}");}Console.WriteLine("所有音频播放完成");}
}

优点:

  • 实现简单,代码直观。
  • 不需要额外的事件处理。

缺点:

  • PlaySync会阻塞当前线程,可能导致UI线程卡住(如果是在UI线程中运行)。

NAudio

C# Winform 通过 NAudio 获取控制电脑操作系统音量
NAudio库提供了更强大的音频处理功能,可以通过PlaybackStopped事件来实现连续播放
NAudio 中,WaveOutEvent 是一个用于播放音频的类,它封装了底层的音频设备资源。如果在使用完毕后没有调用 Dispose() 方法,垃圾回收器(GC)会在对象被回收时调用其析构函数(Finalize),但此时可能已经无法正确释放资源,从而导致错误。

using System;
using System.Collections.Generic;
using NAudio.Wave;public class MyForm : Form
{private Label myLabel;public MyForm(){ }WaveOutEvent waveOut;List<string> audioFiles = new List<string> { "audio1.wav", "audio2.wav", "audio3.wav" };private void OnLineCustodyOrderFrm_Load(object sender, EventArgs e){waveOut = new WaveOutEvent();waveOut.PlaybackStopped += WaveOut_PlaybackStopped;PlayNextAudio();}   private void WaveOut_PlaybackStopped(object sender, StoppedEventArgs e){//播放结束,要释放资源if (waveOut != null && waveOut.PlaybackState == PlaybackState.Stopped){waveOut.Dispose();}Console.WriteLine($"播放完成: {audioFiles[currentIndex - 1]}");PlayNextAudio();}private void PlayNextAudio(){if (currentIndex < audioFiles.Count){var audioFile = new AudioFileReader(audioFiles[currentIndex]);waveOut = new WaveOutEvent(); //播放完成释放,所以这边需要 重新创建 WaveOutEventwaveOut.Init(audioFile);waveOut.Play();Console.WriteLine($"开始播放: {audioFiles[currentIndex]}");currentIndex++;}else{Console.WriteLine("所有音频播放完成");}}private void MyForm_FormClosing(object sender, FormClosingEventArgs e){//窗体关系,要释放资源if (waveOut != null){waveOut.Stop();waveOut.Dispose(); // 确保控件被释放waveOut = null; // 防止重复释放和内存泄漏问题}}
}

关键点
显式释放资源:

  • 在每次音频播放完成后,调用 waveOut.Dispose() 释放当前的 WaveOutEvent 对象。
  • 在程序退出前,确保释放所有资源。

重新创建 WaveOutEvent:

  • 每次播放新的音频文件时,重新创建一个新的 WaveOutEvent 对象,而不是复用之前的对象。

释放 AudioFileReader:

  • 如果使用了 AudioFileReader,也需要确保在播放完成后释放它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/882526.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows系统端口被占用解决方案

在 Windows 系统中,如果某个端口被占用,可能会导致应用程序无法正常启动或连接。以下是一些解决方案,可以帮助你查找和解决端口被占用的问题查找占用端口的进程打开命令提示符按 Win + R,输入 cmd,然后按 Enter查找占用端口的进程netstat -ano | findstr :"端口号&qu…

智能化员工工作状态管理:AI视频监控在大型商场的技术方案介绍(part4)

为提升商场或企业的运营效率,商家需要通过AI对员工的行为进行实时监测,不仅能提升运营效率,还能优化资源配置、加强安全管控、提高员工工作表现,从而推动企业持续、健康的发展。 具体需求包括 1、离岗监测:识别员工是否擅自离开工作岗位。 2、工作服及胸卡佩戴:检测员工是…

立体系统(Stereo Systems)总结

上一讲中我们介绍了对极几何的相关知识,在这一讲开头我们先回顾一下平行图像平面的对极几何。 平行图像平面的对极几何(Parallel image planes)在这种情况下,对应点的极线是水平的,光心连线与图像平面的交点(极点)在无穷远处,并且在这种平行配置下,同一个三维点在两个…

DeepSeek AI 满血版功能集成到WPS或Microsoft Office中

DeepSeek AI集成到 WPS或Microsoft Office中, 由于deepseek被攻击或者非常繁忙导致超时的服务器,所以可以用硅基流动部署的DeepSeek 。当然用官网的也可以。使用 OfficeAI 插件集成(wps为例): 下载并安装 OfficeAI 插件:从可靠的软件下载平台https://www.office-ai.cn/,获…

第二章:计算机的构成

复习第一章:需要一台计算机,在研究其组成的方向上进行努力TL;DR计算机由四大核心部分组成:输入设备、输出设备、存储器和运算器 计算机内部采用二进制表示所有信息,包括数字、文字和指令等等 冯诺依曼体系结构是现代计算机的基础框架正文在了解了计算机的诞生历史后,我们来…

第一课 泰坦尼克号预测

目录导入数据将训练数据与测试数据合并查看数据描述性统计查看是否有异常值查看特征与标签之间的关系查看标签是否有偏态数据预处理填充缺失值特征工程特征创造同组识别筛选子集建模 导入数据 将训练数据与测试数据合并 查看数据 描述性统计查看是否有异常值看看各个数据是否偏…

美团面试:手机扫描PC二维码登录,底层原理和完整流程是什么?

本文原文链接 文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 …

docker官网镜像无法下载问题解决

亲测可用,这个方法是由技术爬爬虾大佬提供,简单地说就是通过github上的docker_image_pusher项目,将国外docker镜像转存到阿里云私人仓库。 此方法需要你有一个github账号,有一个阿里云账号。注册方法这里就不赘述了。 1.1. 获取阿里云相关参数 登录阿里云容器镜像服务。地…

Uptime-kuba安装与使用

Github https://github.com/louislam/uptime-kuma环境查看 系统环境# cat /etc/redhat-release Rocky Linux release 9.3 (Blue Onyx) # uname -a Linux Rocky9Uptimekume003077 5.14.0-362.18.1.el9_3.0.1.x86_64 #1 SMP PREEMPT_DYNAMIC Sun Feb 11 13:49:23 UTC 2024 x86_6…

一文读懂本地部署DeepSeek-R1,如何选择

一文读懂本地部署DeepSeek-R1,如何选择! 想在本地服务器部署DeepSeek-R1?那可得先搞清楚不同版本的硬件需求。DeepSeek-R1是个超厉害的语言模型,有好几个版本,每个版本对计算资源和硬件的要求都不一样。这篇文章能帮你了解各版本的参数、所需硬件,以及怎么根据自身需求选…

LLaMa-Factory 本地微调 Deepseek R1 1.5B 大模型

LLaMA Factory 是一款开源低代码大模型微调框架,集成了业界最广泛使用的微调技术,支持通过 Web UI 界面零代码微调大模型,目前已经成为开源社区内最受欢迎的微调框架之一。项目提供了多个高层次抽象的调用接口,包含多阶段训练,推理测试,benchmark评测,API Server等,使开…