网站建设费用北京艺术字体logo设计生成器

张小明 2025/12/31 20:41:47
网站建设费用北京,艺术字体logo设计生成器,北京网站优化策略,中国六冶的网站谁做的MPlayer 媒体播放器系统代码详解一、程序概览1.1 程序功能这是一个基于C语言的命令行媒体播放器控制系统#xff0c;通过管道#xff08;FIFO#xff09;与MPlayer进程通信#xff0c;实现对音频/视频文件的播放控制。1.2 核心技术进程间通信#xff08;IPC#xff09;通过管道FIFO与MPlayer进程通信实现对音频/视频文件的播放控制。1.2 核心技术进程间通信IPC使用命名管道FIFO多进程编程fork()创建子进程运行MPlayer信号处理处理程序退出信号文件系统操作目录扫描、文件过滤二、代码结构详解2.1 头文件包含#include stdio.h // 标准输入输出 #include stdlib.h // 标准库函数exit, atoi等 #include unistd.h // UNIX标准函数fork, execlp等 #include string.h // 字符串处理函数 #include fcntl.h // 文件控制open等 #include sys/types.h // 系统数据类型 #include sys/stat.h // 文件状态mkfifo等 #include sys/wait.h // 进程等待waitpid #include signal.h // 信号处理 #include time.h // 时间函数 #include dirent.h // 目录操作 #include errno.h // 错误号定义2.2 数据结构和全局变量2.2.1 播放列表结构typedef struct { char name[10][512]; // 二维数组最多10个文件每个路径最长511字符 int total; // 实际找到的文件数量 int current; // 当前播放的索引0-based } LIST;设计说明使用静态数组简化内存管理name[10][512]限制最大文件数为10路径长度不超过512字节current用于循环播放时的索引控制2.2.2 全局变量#define MEDIA_PATH /home/linux/Music // 媒体文件搜索路径 LIST list {0}; // 播放列表实例初始化为0 pid_t mplayer_pid 0; // MPlayer进程ID0表示无进程运行 int fifo_fd -1; // 管道文件描述符-1表示未打开三、核心函数详解3.1 初始化函数do_init()void do_init() { // 1. 打开媒体目录 DIR *dir opendir(MEDIA_PATH); if (NULL dir) { perror(打开目录失败); exit(1); // 致命错误直接退出 } // 2. 初始化列表 list.total 0; list.current 0; // 3. 遍历目录筛选媒体文件 while (1) { struct dirent *info readdir(dir); if (NULL info) { break; // 遍历结束 } // 提取文件扩展名最后3个字符 char *ext info-d_name[strlen(info-d_name) - 3]; // 检查是否为目标格式 if (strcmp(ext, mp4) 0 || strcmp(ext, mp3) 0 || strcmp(ext, flv) 0) { // 构建完整路径并保存 sprintf(list.name[list.total], %s/%s, MEDIA_PATH, info-d_name); } } // 4. 关闭目录 closedir(dir); // 5. 创建命名管道先删除旧的 unlink(/tmp/fifo); // 删除可能存在的旧管道 int ret mkfifo(/tmp/fifo, 0666); // 创建新管道权限rw-rw-rw- if (ret -1 errno ! EEXIST) { // 创建失败且不是已存在 perror(mkfifo); exit(1); } }关键点简单的扩展名检查仅检查最后3个字符假设文件都有正确扩展名管道创建使用/tmp/fifo作为通信管道错误处理目录打开失败和管道创建失败是致命错误3.2 命令发送函数send_cmd()void send_cmd(char *cmd) { // 1. 检查管道是否已打开 if (fifo_fd 0) { fifo_fd open(/tmp/fifo, O_WRONLY); // 只写方式打开 if (fifo_fd 0) { perror(打开管道失败); return; // 非致命错误只输出信息 } } // 2. 格式化命令添加换行符 char buf[256] {0}; sprintf(buf, %s\n, cmd); // MPlayer要求命令以换行结束 // 3. 发送命令 int ret write(fifo_fd, buf, strlen(buf)); // 4. 错误处理 if (ret 0) { perror(发送命令失败); close(fifo_fd); // 关闭失败的连接 fifo_fd -1; // 标记为需要重新打开 } else { printf(发送命令: %s\n, cmd); // 成功反馈 } }通信协议命令格式命令字符串 \n管道位置/tmp/fifo连接策略保持连接失败时重连3.3 播放函数do_play()void do_play(char *file) { // 1. 停止当前运行的MPlayer如果存在 if (mplayer_pid 0) { send_cmd(quit); // 优雅退出命令 usleep(100000); // 等待100ms让MPlayer退出 kill(mplayer_pid, SIGTERM); // 发送终止信号 waitpid(mplayer_pid, NULL, 0); // 等待进程结束 mplayer_pid 0; // 清除进程ID记录 } // 2. 关闭旧管道连接 if (fifo_fd 0) { close(fifo_fd); fifo_fd -1; } // 3. 创建新进程播放 mplayer_pid fork(); // 创建子进程 if (mplayer_pid 0) { // 子进程 // 执行MPlayer命令 execlp(mplayer, // 使用PATH查找 mplayer, // 程序名 -slave, // 启用从模式接受命令 -input, // 指定输入方式 file/tmp/fifo, // 从管道读取命令 file, // 要播放的文件 -quiet, // 减少输出 NULL); // 参数结束 // 如果execlp返回说明执行失败 perror(启动 mplayer 失败); exit(1); // 子进程退出 } // 父进程继续执行 printf(开始播放: %s\n, strrchr(file, /) 1); // 显示文件名 }进程管理策略先停止再启动避免多个MPlayer同时运行双重退出机制先发送quit命令再发送SIGTERM信号进程回收使用waitpid避免僵尸进程3.4 列表管理函数do_list()显示并选择歌曲int do_list() { // 1. 检查列表是否为空 if (list.total 0) { printf(播放列表为空\n); return -1; } // 2. 显示列表只显示文件名不显示完整路径 printf(\n 歌曲列表 \n); for (int i 0; i list.total; i) { printf(%d. %s\n, i, strrchr(list.name[i], /) 1); // strrchr找到最后一个/1得到文件名 } // 3. 获取用户选择 printf(输入编号选择歌曲 (0-%d): , list.total - 1); char choose[10] {0}; fgets(choose, sizeof(choose), stdin); int num atoi(choose); // 字符串转整数 // 4. 验证并播放 if (num 0 num list.total) { list.current num; // 更新当前索引 do_play(list.name[num]); // 播放选中的文件 return 0; // 成功 } else { printf(无效的选择\n); return -1; // 失败 } }do_prev()和do_next()歌曲切换// 上一首循环算法 list.current (list.current - 1 list.total) % list.total; // 下一首循环算法 list.current (list.current 1) % list.total;循环算法原理% list.total确保索引在0到total-1范围内 list.total处理负索引情况3.5 高级控制函数do_speed()速度控制int do_speed() { // 显示子菜单 printf(\n 播放速度控制 \n); printf(1. 加速 1.5x\n); printf(2. 减速 0.5x\n); printf(3. 恢复正常速度\n); printf(输入选择: ); // 获取选择并发送相应命令 char input[10]; fgets(input, sizeof(input), stdin); int choice atoi(input); switch (choice) { case 1: send_cmd(speed_set 1.5); break; // 1.5倍速 case 2: send_cmd(speed_set 0.5); break; // 0.5倍速 case 3: send_cmd(speed_set 1.0); break; // 正常速度 default: printf(无效选项\n); } return 0; }MPlayer速度命令speed_set 1.5设置为1.5倍速度speed_set 0.5设置为0.5倍速度speed_set 1.0恢复正常速度do_seek()快进快退int do_seek() { printf(\n 快进快退 \n); printf(1. 前进10秒\n); printf(2. 后退10秒\n); printf(3. 前进30秒\n); printf(4. 后退30秒\n); printf(输入选择: ); char input[10]; fgets(input, sizeof(input), stdin); int choice atoi(input); switch (choice) { case 1: send_cmd(seek 10); break; // 前进10秒 case 2: send_cmd(seek -10); break; // 后退10秒 case 3: send_cmd(seek 30); break; // 前进30秒 case 4: send_cmd(seek -30); break; // 后退30秒 default: printf(无效选项\n); } return 0; }MPlayer跳转命令seek N向前跳转N秒seek -N向后跳转N秒3.6 资源管理函数cleanup()清理资源void cleanup() { printf(\n正在清理资源...\n); // 1. 发送退出命令如果管道已打开 if (fifo_fd 0) { send_cmd(quit); // 告诉MPlayer退出 close(fifo_fd); // 关闭管道 fifo_fd -1; // 标记为未打开 } // 2. 终止MPlayer进程如果存在 if (mplayer_pid 0) { kill(mplayer_pid, SIGTERM); // 发送终止信号 waitpid(mplayer_pid, NULL, 0); // 等待进程结束 mplayer_pid 0; // 清除记录 } // 3. 删除管道文件 unlink(/tmp/fifo); // 删除命名管道 }清理顺序发送退出命令优雅退出关闭管道连接终止进程强制退出删除管道文件handle()信号处理void handle(int sig) { printf(\n收到信号 %d正在退出...\n, sig); cleanup(); // 清理资源 exit(0); // 退出程序 }处理的信号SIGINT(2)CtrlC中断SIGTERM(15)终止信号3.7 主函数main()int main(int argc, char **argv) { // 1. 设置信号处理 signal(SIGINT, handle); // CtrlC处理 signal(SIGTERM, handle); // 终止信号处理 // 2. 初始化系统 do_init(); // 3. 自动播放第一首如果有文件 if (list.total 0) { printf(找到 %d 个媒体文件\n, list.total); printf(自动播放第一首歌曲...\n); do_play(list.name[0]); // 播放索引0的文件 sleep(1); // 等待MPlayer启动 } else { printf(在 %s 目录中没有找到媒体文件\n, MEDIA_PATH); printf(支持格式: .mp4, .mp3, .flv\n); } // 4. 主循环用户交互 while (1) { show_menu(); // 显示菜单 char input[256] {0}; fgets(input, sizeof(input), stdin); // 读取用户输入 input[strcspn(input, \n)] 0; // 去除换行符 int choice atoi(input); // 转换为整数 // 根据选择调用相应功能 switch (choice) { case 1: do_list(); break; // 列表选择 case 2: do_pause(); break; // 暂停/继续 case 3: do_stop(); break; // 停止播放 case 4: do_prev(); break; // 上一首 case 5: do_next(); break; // 下一首 case 6: do_speed(); break; // 速度控制 case 7: do_seek(); break; // 快进快退 case 8: do_mode(); break; // 播放模式 case 9: // 退出程序 cleanup(); printf(再见\n); return 0; default: // 无效输入 printf(无效选项请重新输入\n); } } return 0; }主流程初始化自动播放菜单循环退出清理四、MPlayer命令参考命令格式说明程序中的使用pausepause暂停/继续切换send_cmd(pause)stopstop停止播放send_cmd(stop)quitquit退出MPlayersend_cmd(quit)seekseek ±N跳转N秒send_cmd(seek 10)speed_setspeed_set X设置速度X倍send_cmd(speed_set 1.5)volumevolume ±N调整音量未使用五、程序运行流程5.1 启动流程main() ├── signal() # 设置信号处理器 ├── do_init() # 初始化 │ ├── 扫描目录 # 查找媒体文件 │ └── 创建管道 # /tmp/fifo ├── 自动播放第一首 # 如果有文件 └── 进入主循环 # 用户交互5.2 播放流程do_play(文件路径) ├── 停止当前MPlayer如果存在 │ ├── send_cmd(quit) │ ├── kill(SIGTERM) │ └── waitpid() ├── 关闭旧管道 ├── fork()创建子进程 │ └── execlp()启动MPlayer └── 显示播放信息5.3 命令发送流程send_cmd(命令) ├── 检查管道是否打开 ├── 打开管道如果需要 ├── 格式化命令添加\n ├── write()发送命令 └── 错误处理六、代码亮点分析6.1 优点健壮的错误处理区分致命错误和非致命错误资源管理完善正确清理进程和文件用户友好中文界面清晰提示代码复用send_cmd()统一处理命令发送6.2 潜在问题扩展名检查不严谨只检查最后3个字符缓冲区溢出风险使用sprintf而非snprintf固定数组大小最多10个文件路径最长512字节缺少MPlayer状态检查假设MPlayer总是能正常启动6.3 改进建议// 1. 安全字符串处理 snprintf(buf, sizeof(buf), %s\n, cmd); // 2. 更严谨的扩展名检查 char *ext strrchr(filename, .); if (ext (strcasecmp(ext, .mp3) 0 || ...)) // 3. 动态内存分配 char **name malloc(max_files * sizeof(char*)); for (i 0; i max_files; i) { name[i] malloc(max_path * sizeof(char)); }七、学习要点总结7.1 核心技术点进程创建与管理fork()、execlp()、waitpid()进程间通信命名管道FIFO信号处理signal()、SIGINT、SIGTERM文件系统操作目录遍历、文件过滤7.2 编程实践模块化设计功能分离职责单一错误处理策略分级处理合理退出资源管理谁申请谁释放原则用户交互设计清晰的菜单和提示7.3 系统编程概念进程生命周期管理IPC机制应用信号与异常处理文件描述符管理
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做网站开发哪里好有了域名空间怎么做网站

教育场景应用:用GPT-SoVITS生成个性化教学语音 在一间普通的中学教室里,一位物理老师刚结束一堂关于牛顿定律的讲解。课后,几个学生围在平板前回放课程录音——但这次播放的不是课堂实录,而是由AI生成、却完全复刻了老师音色的教学…

张小明 2025/12/31 20:41:15 网站建设

网站能不能用自己的电脑做服务器苏州市网站建设培训

【值得收藏】网络安全人才缺口480万!三大专业方向选择指南与职业规划 文章介绍2025年全球网络安全人才缺口达480万,需求持续攀升的现状,详细解析了网络空间安全、信息安全、网络安全与执法三大相关专业方向,包括各专业的学科特点…

张小明 2025/12/31 20:40:43 网站建设

手机app微信网站现代简约风格设计方案ppt

Excalidraw实战案例:快速构建系统架构与数据流图 在一次紧急的技术评审会上,团队需要在30分钟内完成一个微服务系统的架构草图,并同步给分布在全球的五位核心成员。没有时间打开复杂的建模工具,也没有人愿意被“完美图形”束缚思维…

张小明 2025/12/31 20:39:39 网站建设

flash怎么制作网站外贸网站搭建难不难

百度ERNIE 4.5轻量版技术评测:0.3B参数如何引领AI轻量化革命 【免费下载链接】ERNIE-4.5-0.3B-PT 项目地址: https://ai.gitcode.com/hf_mirrors/baidu/ERNIE-4.5-0.3B-PT 在人工智能模型参数竞赛白热化的当下,百度ERNIE 4.5系列推出的轻量级版本…

张小明 2025/12/31 20:39:07 网站建设

苏州高新区建设局网站做最好的言情网站

FaceFusion支持语音同步吗?口型驱动功能正在开发中在短视频、虚拟直播和AI内容创作爆发的今天,用户对“换脸”的期待早已超越简单的身份替换。我们不再满足于看到一张熟悉的脸出现在陌生的身体上——更希望这张脸能自然地说话、表情生动、口型与声音严丝…

张小明 2025/12/31 20:38:35 网站建设

网站设置gif禁用正能量直播网站

在数字化浪潮中,网络安全已成为企业生存的基石。今天我要为你介绍一款真正实用的工具——DDDD,它能让你在短时间内成为网络安全检测的高手!无论你是刚入门的新手,还是有一定经验的从业者,这个指南都将帮你快速上手。 【…

张小明 2025/12/31 20:38:03 网站建设