当前位置: 首页 > article >正文

用C语言和mciSendString函数,在VS2019里写一个带进度条的音乐播放器(附完整源码)

用C语言打造可视化音乐播放器从零实现带进度条的音频控制工具在枯燥的控制台程序与炫酷的图形界面之间存在一个被许多C语言学习者忽视的中间地带——通过Windows API实现简单而实用的可视化反馈。本文将带你用mciSendString函数构建一个带有实时进度条的音乐播放器这个项目不仅能巩固你的C语言基础还能让你掌握Windows平台多媒体开发的精髓。1. 环境准备与项目创建首先启动Visual Studio 2019选择创建新项目在搜索框中输入Windows Desktop Wizard模板。这个模板为我们预设了Windows桌面应用程序的基本结构避免了从零开始配置的麻烦。关键配置步骤项目类型选择桌面应用程序(.exe)勾选空项目选项取消预编译头的勾选简化项目结构安装完成后在解决方案资源管理器中右键点击源文件添加一个新建项main.c。这是我们的主战场所有代码都将在这里实现。提示如果找不到Windows Desktop Wizard模板可能需要安装使用C的桌面开发工作负载它包含了Windows API开发所需的所有组件。2. 理解mciSendString的核心机制mciSendString是Windows多媒体API中的瑞士军刀它通过发送字符串命令来控制各种多媒体设备。与复杂的函数调用不同它采用了一种接近自然语言的指令方式MCIERROR mciSendString( LPCTSTR lpszCommand, // 命令字符串如open mysong.mp3 alias song1 LPTSTR lpszReturnString, // 返回信息缓冲区 UINT cchReturn, // 缓冲区大小 HANDLE hwndCallback // 回调窗口句柄通常为NULL );这个函数的神奇之处在于它的命令体系。比如open mysong.mp3 alias mytrack打开音频文件并赋予别名play mytrack from 5000 to 15000播放指定时间段的音频status mytrack length获取音频总长度常见问题排查如果返回错误可以用mciGetErrorString获取错误描述路径中包含空格时需要用双引号包裹完整路径命令字符串不区分大小写但参数区分3. 构建播放器核心功能模块3.1 音频文件加载与播放控制我们先实现最基本的播放控制功能。创建一个结构体来管理播放器状态typedef struct { char filePath[MAX_PATH]; BOOL isPlaying; DWORD totalLength; // 毫秒 DWORD currentPosition; } PlayerState;关键功能函数实现void playAudio(PlayerState* player) { char cmd[256]; sprintf(cmd, play \%s\, player-filePath); mciSendString(cmd, NULL, 0, NULL); player-isPlaying TRUE; } void pauseAudio(PlayerState* player) { mciSendString(pause, NULL, 0, NULL); player-isPlaying FALSE; }3.2 实时进度显示与交互控制台下的进度条看似简单实则包含几个关键技术点获取控制台窗口句柄以设置光标位置计算当前播放进度百分比实现动态刷新而不产生闪烁以下是进度条的核心代码void drawProgressBar(PlayerState* player) { HANDLE hConsole GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(hConsole, csbi); // 计算进度百分比 float progress (float)player-currentPosition / player-totalLength; int barWidth 50; int pos (int)(progress * barWidth); // 设置光标到进度条起始位置 COORD pos {0, csbi.dwCursorPosition.Y}; SetConsoleCursorPosition(hConsole, pos); // 绘制进度条 printf([); for (int i 0; i barWidth; i) { if (i pos) printf(); else if (i pos) printf(); else printf( ); } printf(] %.1f%%, progress * 100); }4. 完整项目集成与优化4.1 主循环架构设计一个健壮的音乐播放器需要处理多种用户输入和状态更新int main() { PlayerState player {0}; printf(请输入音频文件路径: ); scanf(%255s, player.filePath); // 初始化音频 char cmd[512]; sprintf(cmd, open \%s\ type mpegvideo alias myaudio, player.filePath); if (mciSendString(cmd, NULL, 0, NULL) ! 0) { printf(无法打开音频文件\n); return 1; } // 获取总时长 char lengthStr[32]; mciSendString(status myaudio length, lengthStr, 32, NULL); player.totalLength atoi(lengthStr); // 主控制循环 while (1) { system(cls); // 清屏 // 更新当前播放位置 char posStr[32]; mciSendString(status myaudio position, posStr, 32, NULL); player.currentPosition atoi(posStr); // 显示UI drawProgressBar(player); printf(\n\n控制命令: (P)播放 (S)停止 (Q)退出\n); // 处理输入 if (_kbhit()) { char c _getch(); switch (tolower(c)) { case p: if (player.isPlaying) pauseAudio(player); else playAudio(player); break; case s: stopAudio(player); break; case q: mciSendString(close myaudio, NULL, 0, NULL); return 0; } } Sleep(100); // 控制刷新频率 } }4.2 用户体验优化技巧异步输入处理使用_kbhit()和_getch()实现不阻塞主循环的输入检测智能刷新只在状态变化时重绘界面减少闪烁错误恢复添加对非法操作的容错处理格式支持扩展通过修改open命令中的类型支持更多音频格式// 支持多种音频格式的打开方式 const char* getMediaType(const char* fileExt) { if (strcmp(fileExt, .mp3) 0) return mpegvideo; if (strcmp(fileExt, .wav) 0) return waveaudio; return NULL; }5. 进阶功能扩展思路当基础播放器完成后可以考虑添加以下增强功能播放列表管理系统使用链表结构管理多个音频文件实现顺序播放/随机播放模式保存和加载播放列表配置typedef struct PlaylistItem { char path[MAX_PATH]; struct PlaylistItem* next; } PlaylistItem; void addToPlaylist(PlaylistItem** head, const char* path) { PlaylistItem* newItem malloc(sizeof(PlaylistItem)); strcpy(newItem-path, path); newItem-next *head; *head newItem; }音频可视化效果通过FFT分析实现频谱显示控制台图形化均衡器响度计和峰值指示跨平台兼容性使用条件编译区分Windows和其他平台为Linux/macOS实现基于PortAudio的替代方案抽象音频接口层实现核心逻辑复用在实现这个项目的过程中最让我惊喜的是发现控制台程序也能有如此丰富的交互体验。通过合理运用Windows API和控制台特性我们完全可以在不依赖任何图形库的情况下打造出既实用又有成就感的工具程序。

相关文章:

用C语言和mciSendString函数,在VS2019里写一个带进度条的音乐播放器(附完整源码)

用C语言打造可视化音乐播放器:从零实现带进度条的音频控制工具 在枯燥的控制台程序与炫酷的图形界面之间,存在一个被许多C语言学习者忽视的中间地带——通过Windows API实现简单而实用的可视化反馈。本文将带你用mciSendString函数构建一个带有实时进度条…...

基于STM32F103C8T6标准库驱动2.4寸SPI TFT触摸屏:从零搭建嵌入式GUI交互系统

1. 项目概述与硬件准备 最近在做一个智能家居控制面板的项目,选用了STM32F103C8T6这块性价比超高的开发板作为主控,搭配2.4寸SPI接口的TFT触摸屏作为人机交互界面。说实话,刚开始接触这个组合时踩了不少坑,特别是用标准库开发的时…...

RJ45连接器工程实战:从PoE热故障到户外防水的12个设计禁区

一句话核心:RJ45连接器选型失败,往往不是速率不达标,而是热、水、地、工艺四个字中的一个出了问题。本文从电源供电发热、户外环境腐蚀、屏蔽接地错误、现场压接失控四个维度,梳理12个容易被忽视的设计禁区,并提供可复…...

Guava Ratelimiter实现单机接口限流

废话不多说直接上代码&#xff1a;1.依赖&#xff1a;<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version></dependency>2.配置类注册bean&#xff1a;package com.h…...

通过 Taotoken CLI 工具一键配置开发环境中的多工具 API 端点

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过 Taotoken CLI 工具一键配置开发环境中的多工具 API 端点 在接入多个大模型服务时&#xff0c;开发者常常需要为不同的工具和 …...

大模型产品经理进阶指南:从零基础到行业精英的完整学习路线图!

随着人工智能技术的发展&#xff0c;尤其是大模型&#xff08;Large Model&#xff09;的兴起&#xff0c;越来越多的企业开始重视这一领域的投入。作为大模型产品经理&#xff0c;你需要具备一系列跨学科的知识和技能&#xff0c;以便有效地推动产品的开发、优化和市场化。以下…...

八大网盘直链解析工具:告别限速,实现高速下载自由

八大网盘直链解析工具&#xff1a;告别限速&#xff0c;实现高速下载自由 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘…...

AI产品经理的进阶路线图

本文深入探讨了AI产品经理的核心特质&#xff0c;强调AI思维的重要性远超单纯的技术知识。文章解析了AI产品设计以极度简单为标准背后的复杂系统&#xff0c;以及AI产业链的三大结构层——基础层、技术层与应用层。此外&#xff0c;文章还详细阐述了AI产品经理的四象限分类&…...

大模型“开源”到底开了什么?不同协议有什么区别?

大模型发布常以“开源”为噱头&#xff0c;但与传统软件开源不同&#xff0c;大模型开源可能仅开放代码、权重、训练方法或数据说明&#xff0c;且协议复杂多样。企业需关注开放深度&#xff0c;区分开放权重、开放代码、开放训练过程三个层次&#xff0c;警惕GPL、AGPL、CC-BY…...

ESP32-S3物联网开发实战:从ADC采样到MQTT云端通信

1. 项目概述&#xff1a;从传感器到云端的数据之旅在物联网项目的开发中&#xff0c;我们常常需要解决一个核心问题&#xff1a;如何让物理世界的信息被数字系统感知、处理&#xff0c;并最终在云端呈现或接受远程控制&#xff1f;这背后涉及三个关键环节&#xff1a;感知、处理…...

柔性构建板原理与实战:从材料科学到3D打印取模难题的工程解法

1. 项目概述&#xff1a;为什么你需要一块柔性构建板&#xff1f;如果你玩3D打印有一段时间了&#xff0c;大概率经历过这样的抓狂时刻&#xff1a;打印完成&#xff0c;模型牢牢地“焊”在玻璃板或者美纹纸胶带上&#xff0c;你用铲刀、刮片又撬又掰&#xff0c;结果要么是模型…...

2230固态硬盘延长安装技巧指南!

2230规格的M.2固态硬盘因体积小巧&#xff0c;广泛应用于掌机、轻薄笔记本和微型PC&#xff0c;但许多主板的M.2插槽默认为2280规格&#xff0c;导致2230硬盘“装不稳”。本文详细讲解2230与2280的尺寸差异、延长安装的核心方法&#xff08;转接支架、螺丝柱调整、散热适配&…...

【ITIL4】32服务实践 - 问题管理(Problem Management)

【ITIL4】32服务实践 - 问题管理&#xff08;Problem Management&#xff09; 文章目录【ITIL4】32服务实践 - 问题管理&#xff08;Problem Management&#xff09;一、核心定义1. 问题&#xff08;Problem&#xff09;2. 已知错误&#xff08;Known Error&#xff09;3. 变通…...

别再死记硬背MPNN公式了!用“邻居传纸条”的比喻彻底搞懂消息传递神经网络

用"班级传纸条"游戏理解消息传递神经网络 想象一下&#xff0c;你正坐在教室里&#xff0c;老师突然宣布要进行一个特殊的游戏——每个同学可以给任意一位朋友传递一张写有秘密信息的纸条。这个看似简单的游戏&#xff0c;恰恰揭示了人工智能领域最前沿的图神经网络(…...

深度学习优化算法(二)—— SGD + Momentum + Nesterov(三十四)

1. 定位导航 第 33 篇讲了为什么训练困难(病态、鞍点、梯度爆炸)。本篇正式介绍解决方案的第一波——三个经典优化算法: 算法 关键思想 年代 SGD 随机梯度估计 + 学习率衰减 1951(Robbins-Monro) Momentum 累积梯度方向加速 1964(Polyak) Nesterov 先"前瞻"再…...

深度学习优化算法(一)—— 学习 vs 纯优化 + 优化挑战(三十三)

1. 定位导航 第 7 章我们解决了"怎么防过拟合"。第 8 章正式进入深度学习的另一个核心——怎么训练得快、稳、好。 第 8 章规划(5 篇): 篇号 主题 33(本篇) 学习 vs 纯优化 + 优化挑战 34 基本优化算法(SGD + Momentum + Nesterov) 35 自适应学习率(AdaGra…...

新手入门,用外卖系统吃透Tomcat与Java Web全流程

对于刚接触Java Web的小伙伴来说&#xff0c;Tomcat、Servlet、端口号、网络请求这些概念&#xff0c;很容易越学越懵。今天全程用外卖系统做统一比喻&#xff0c;把复杂技术名词全部转化为生活场景&#xff0c;从零梳理Java Web核心流程&#xff0c;看完彻底理清浏览器、服务器…...

【CLIP论文阅读】:基于自然语言监督的通用视觉预训练范式

论文信息 标题&#xff1a;Learning Transferable Visual Models From Natural Language Supervision会议&#xff1a;ICML 2021单位&#xff1a;OpenAI代码&#xff1a;https://github.com/OpenAI/CLIP论文&#xff1a;https://arxiv.org/pdf/2103.00020.pdf 一、引言&#x…...

Python Django REST Framework实战:构建RESTful API

Python Django REST Framework实战&#xff1a;构建RESTful API 引言 在Python Web开发中&#xff0c;Django REST Framework&#xff08;DRF&#xff09;是构建RESTful API的首选框架。作为一名从Rust转向Python的后端开发者&#xff0c;我深刻体会到DRF在快速构建高质量API方…...

上位机知识篇---提高Linux下载速度

提升 wget、pip 和 conda 的下载速度&#xff0c;核心方法可以归结为两类&#xff1a;一是使用更快的下载工具&#xff0c;二是连接到更近的镜像站点。下面的表格总结了几种主流的加速方案&#xff0c;方便你快速查阅&#xff1a;提速方法wgetpipconda&#x1f680; 换用更快的…...

观察使用Taotoken Token Plan后月度API成本的变化趋势

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察使用Taotoken Token Plan后月度API成本的变化趋势 对于依赖大模型API进行开发的中小型团队而言&#xff0c;月度API成本的可预…...

供水泵恒压变频控制系统:备用泵自动投切,保障供水不间断

供水泵恒压变频控制系统是一套融合变频调速、PID闭环控制与智能多泵管理的自动化节能供水解决方案&#xff0c;核心是按需供水、稳压节能、无人值守。 一、核心原理压力采集&#xff1a;管网压力传感器实时采集水压(0~1.6MPa)。偏差计算&#xff1a;PLC/专用控制器将实测值与设…...

终极窗口尺寸调整工具:WindowResizer完整使用指南

终极窗口尺寸调整工具&#xff1a;WindowResizer完整使用指南 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法拖拽大小的顽固应用程序窗口而烦恼吗&#xff1f;Wind…...

Nrfr终极指南:5步轻松修改SIM卡国家码,免Root突破区域限制

Nrfr终极指南&#xff1a;5步轻松修改SIM卡国家码&#xff0c;免Root突破区域限制 【免费下载链接】Nrfr &#x1f30d; 免 Root 的 SIM 卡国家码修改工具 | 解决国际漫游时的兼容性问题&#xff0c;帮助使用海外 SIM 卡获得更好的本地化体验&#xff0c;解锁运营商限制&#x…...

为什么需要图像篡改检测?5个简单步骤守护数字世界的真实性

为什么需要图像篡改检测&#xff1f;5个简单步骤守护数字世界的真实性 【免费下载链接】image_tampering_detection_references A list of papers, codes and other interesting collections pertaining to image tampering detection and localization. 项目地址: https://g…...

别再只会轮询了!STM32CubeMX配置USART中断,从原理到调试一条龙指南

STM32串口中断实战&#xff1a;从轮询到事件驱动的效率跃迁 在嵌入式开发中&#xff0c;串口通信就像系统的神经末梢&#xff0c;负责与外界交换关键信息。传统轮询方式如同不断拨打电话确认消息&#xff0c;而中断机制则像设置来电提醒——只有当数据真正到达时才会唤醒CPU。这…...

ETS2LA:让《欧洲卡车模拟2》自动驾驶的终极解决方案

ETS2LA&#xff1a;让《欧洲卡车模拟2》自动驾驶的终极解决方案 【免费下载链接】Euro-Truck-Simulator-2-Lane-Assist Plugin based interface program for ETS2/ATS. 项目地址: https://gitcode.com/gh_mirrors/eur/Euro-Truck-Simulator-2-Lane-Assist 你是否曾梦想在…...

Photoshop图层批量导出效率革命:10倍速免费脚本完全指南

Photoshop图层批量导出效率革命&#xff1a;10倍速免费脚本完全指南 【免费下载链接】Photoshop-Export-Layers-to-Files-Fast This script allows you to export your layers as individual files at a speed much faster than the built-in script from Adobe. 项目地址: h…...

用STM32F103和RC522模块DIY一个智能门禁,附完整代码和PCB文件

用STM32F103和RC522模块打造高性价比智能门禁系统 在创客圈子里&#xff0c;智能门禁系统一直是极受欢迎的DIY项目。它不仅融合了嵌入式开发、射频识别和物联网技术&#xff0c;还能解决生活中的实际问题。相比动辄上千元的商业门禁设备&#xff0c;用STM32F103C8T6&#xff0…...

OpenCV颜色操作避坑指南:cv::Scalar里BGR和RGB顺序别再搞混了

OpenCV颜色操作避坑指南&#xff1a;cv::Scalar里BGR和RGB顺序别再搞混了 第一次用OpenCV画红色矩形时&#xff0c;我信心满满地写下cv::Scalar(255, 0, 0)&#xff0c;结果屏幕上却出现了一个蓝色方块——这个场景恐怕每个OpenCV初学者都遇到过。颜色通道顺序这个看似简单的细…...