自学嵌入式day36,mplayer+fifo+exec

媒体播放器程序核心功能解析

1. 数据结构与宏定义
  • 播放模式枚举 MODE

    • MODE_CYCLE:循环播放
    • MODE_RANDOM:随机播放
    • MODE_SINGAL:单次播放(注意:代码中拼写为SINGAL,应为SINGLE
  • 播放列表结构体 LIST

    c 复制代码
    typedef struct {
        char name[10][512]; // 存储最多10个媒体文件路径
        int total;          // 媒体文件总数
        int current;        // 当前播放索引
        MODE mode;          // 播放模式
    } LIST;
  • 媒体路径宏

    c 复制代码
    #define MEDIA_PATH "/home/linux/vm/09mp"
2. 初始化函数 do_init()
  • 功能:扫描媒体目录,构建播放列表并创建控制管道
  • 关键流程
    1. 使用 opendir 打开媒体目录
    2. 遍历目录项,筛选扩展名为 .mp4, .mp3, .flv 的文件
    3. 构建完整文件路径存入 list.name
    4. 初始化播放索引 list.current = 0 和播放模式 list.mode = MODE_CYCLE
    5. 使用 mkfifo 创建命名管道 /home/linux/vm/09mp/fifo(忽略已存在错误)
3. 播放控制函数
  • do_play(char* name)

    c 复制代码
    pid_t pid = fork();
    if (0 == pid) {
        execlp("mplayer", "mplayer", "-slave", "-input", 
               "file=/home/linux/vm/09mp/fifo", name, "-quiet", NULL);
        exit(1);
    }
    • 通过 fork + execlp 调用 mplayer
    • 使用 -slave 模式和 -input file=... 指定控制管道
  • do_pause()

    c 复制代码
    int fd = open("/home/linux/vm/09mp/fifo", O_RDWR);
    write(fd, "pause\n", 6);
    close(fd);
  • do_stop()

    • 包含完整的错误处理逻辑:
      • 检查管道打开状态
      • 验证写入字节数
      • 确保资源关闭
4. 播放列表管理
  • do_list()
    1. 打印播放列表索引和路径
    2. 通过 fgets 获取用户输入
    3. 根据输入索引调用 do_play()
5. 播放导航
  • do_prev()

    • MODE_CYCLE 模式下实现循环上一曲
    c 复制代码
    num = list.current;
    num--;
    if(num == -1) num = list.total - 1; // 修正边界: num = 2 -> list.total-1
  • do_next()

    • MODE_CYCLE 模式下实现循环下一曲
    c 复制代码
    num = list.current;
    num = (num + 1) % list.total; // 取模实现循环
6. 高级控制
  • do_seek()

    c 复制代码
    sprintf(buf,"seek %d 1\n",num); // 百分比跳转
    write(fd, buf, strlen(buf));
  • do_speed()

    • 未完整实现(函数体不完整)

技术要点总结

  1. 目录遍历 :使用 dirent.h 实现文件系统扫描
  2. 进程控制fork() + execlp() 调用外部播放器
  3. 进程间通信 :通过命名管道(FIFO)向 mplayer 发送控制命令
  4. 模式管理:枚举类型实现播放模式状态机
  5. 边界处理:播放索引的循环计算
相关推荐
Python私教2 小时前
鸿蒙应用的网络请求和数据处理:从HTTP到本地缓存的完整方案
网络·http·harmonyos
m0_738120722 小时前
渗透测试——靶机DC-5详细渗透getshell过程
网络·安全·web安全·ssh·php
kkk_皮蛋2 小时前
带宽估计 BWE (WebRTC 的智能网络优化核心)
网络·webrtc
真正的醒悟2 小时前
AI中的网络世界
运维·服务器·网络
Watermelo6172 小时前
【前端实战】Axios 错误处理的设计与进阶封装,实现网络层面的数据与状态解耦
前端·javascript·网络·vue.js·网络协议·性能优化·用户体验
Web3VentureView2 小时前
Synbo与Superpool达成合作:共建链上募资早期入口
网络·金融·web3·区块链
酩酊仙人2 小时前
告别IIS依赖!ASP.NET Core如何通过Windows Service实现服务托管
windows·后端·asp.net
TG:@yunlaoda360 云老大2 小时前
华为云国际站代理商VPC主要有什么作用呢?
网络·华为云·智能路由器
专业开发者2 小时前
安全防护蓝牙 ® 网状网络代理应用
网络·物联网·安全